Question

import flash.display.Sprite;  
import flash.net.URLLoader;

var index:int  = 0;  
var constY = 291;  
var constW = 2;  
var constH = 40;

hydrogenBtn.label = "Hydrogen";  
heliumBtn.label = "Helium";  
lithiumBtn.label = "Lithium";  
hydrogenBtn.addEventListener (MouseEvent.CLICK, loadHydrogen);  
heliumBtn.addEventListener (MouseEvent.CLICK, loadHelium);  
lithiumBtn.addEventListener (MouseEvent.CLICK, loadLithium);  

var myTextLoader:URLLoader = new URLLoader();  
    myTextLoader.addEventListener(Event.COMPLETE, onLoaded);  

function loadHydrogen (event:Event):void {  
    myTextLoader.load(new URLRequest("hydrogen.txt"));  
}  
function loadHelium (event:Event):void {  
    myTextLoader.load(new URLRequest("helium.txt"));  
}  
function loadLithium (event:Event):void {  
    myTextLoader.load(new URLRequest("lithium.txt"));  
}  

var DataSet:Array = new Array();  
var valueRead1:String;   
var valueRead2:String;   

function onLoaded(event:Event):void {  
    var rawData:String = event.target.data;  

    for(var i:int = 0; i<rawData.length; i++){
        var commaIndex = rawData.search(",");

        valueRead1 = rawData.substr(0,commaIndex);
        rawData = rawData.substr(commaIndex+1, rawData.length+1);
        DataSet.push(valueRead1);
        commaIndex = rawData.search(",");

        if(commaIndex == -1) {commaIndex = rawData.length+1;}

        valueRead2 = rawData.substr(0,commaIndex);
        rawData = rawData.substr(commaIndex+1, rawData.length+1);
        DataSet.push(valueRead2);
    }
    generateMask_Emission(DataSet);
}  

function generateMask_Emission(dataArray:Array):void{   
    var spriteName:String = "Mask"+index;  
    trace(spriteName);  
    this[spriteName] = new Sprite();  

    for (var i:int=0; i<dataArray.length; i+=2){
        this[spriteName].graphics.beginFill(0x000000, dataArray[i+1]);
        this[spriteName].graphics.drawRect(dataArray[i],constY,constW, constH);
        this[spriteName].graphics.endFill();
    }
    addChild(this[spriteName]);
index++;
}

Salut, je suis relativement nouveau à clignoter et un script d'action aussi bien et j'ai un problème pour obtenir l'image-objet à supprimer après l'autre est appelé. Je fais du spectre d'émission de 3 éléments en générant dynamiquement le masque sur une image sur la scène. Tout fonctionne parfaitement bien avec le code que j'ai en ce moment, sauf les sprites pile au-dessus de l'autre et je me retrouve avec des lignes audacieuses sur mon image au lieu d'une nouvelle série de lignes à chaque fois que je presse un bouton.

Je l'ai essayé d'utiliser try / catch pour enlever les sprites et j'ai réarrangé tout le code de ce qui est vu ici pour faire 3 entités séparées (en espérant que je pouvais les enlever si elles étaient des variables séparées) au lieu de 2 fonctions que la poignée le procédé complet. J'ai tout essayé dans la mesure de mes connaissances (ce qui est assez minime @ ce point) des suggestions?

Merci à l'avance!

Était-ce utile?

La solution

Ma connaissance AS3 est juste assez rudimentaire maintenant, mais je pense que deux choses peuvent vous aider.

  1. Vous pouvez utiliser removeChild avant de recréer le Sprite. Sinon, il suffit de réutiliser le Sprite.
  2. Essayez d'ajouter cette .graphics.clear () [spriteName]; pour réinitialiser l'image-objet et commencer à redessiner.
     function generateMask_Emission (dataArray : Array) : void {
        var spriteName:String = "Mask"+index;  
        trace(spriteName); 
        // Don't recreate if sprite object already created
        if (this[spriteName] == null) 
        {
            this[spriteName] = new Sprite();  
            // Only need to add sprite to display object once
            addChild(this[spriteName]);
        }
        for (var i:int= 0; i < dataArray.length; i+=2)
        {
            this[spriteName].graphics.clear();
            this[spriteName].graphics.beginFill(0x000000, dataArray[i+1]);
            this[spriteName].graphics.drawRect(dataArray[i],constY,constW, constH);
            this[spriteName].graphics.endFill();
        }
        index++;
    }

Autres conseils

Juste au cas où quelqu'un était curieux ou ayant un problème similaire. Extrêmement solution simple mais voici ce que je faisais.

devrait également mentionner que je ne pense pas que la fonction graphics.clear effectivement résolu le problème (bien que je n'avais pas le sprite être effacé correctement avant), mais je crois que les mensonges de problème au début de la fonction onLoaded où trois de ces variables utilisées à l'extérieur de la fonction.

import flash.display.Sprite;
import flash.net.URLLoader;
import flash.events.Event;

var constY = 291; //this value represets the Y value of the bottom of the background spectrum image
var constW = 2; //this value represents the width of every emission line
var constH = 40; //this value represents the height of every emission line

//Create Button Labels
hydrogenBtn.label = "Hydrogen";
heliumBtn.label = "Helium";       
lithiumBtn.label = "Lithium";

//These listen for the buttons to be clicked to begin loading in the data
hydrogenBtn.addEventListener (MouseEvent.CLICK, loadHydrogen);
heliumBtn.addEventListener (MouseEvent.CLICK, loadHelium);      
lithiumBtn.addEventListener (MouseEvent.CLICK, loadLithium);

var myTextLoader:URLLoader = new URLLoader();//the object to load in data from external files
    myTextLoader.addEventListener(Event.COMPLETE, onLoaded);//triggers the function when the file is loaded

var Mask:Sprite = new Sprite();  //This sprite will hold the information for the spectrum to be put on stage

function loadHydrogen (event:Event):void {
    myTextLoader.load(new URLRequest("hydrogen.txt"));//starts loading Hydrogen emisson data
}
function loadHelium (event:Event):void {
    myTextLoader.load(new URLRequest("helium.txt"));//starts loading Helium emission data
}
function loadLithium (event:Event):void {
    myTextLoader.load(new URLRequest("lithium.txt"));//starts loading Lithium emission data
}


function onLoaded(event:Event):void {//the function that handles the data from the external file

    var rawData:String = event.target.data; //create a new string and load in the data from the file
    var DataSet:Array = new Array();//the array to load values in to
    var valueRead1:String; //subset of array elements (n)
    var valueRead2:String; //subset of array elements (n+1)

    for(var i:int = 0; i<rawData.length; i++){ //loop through the string and cut up the data @ commas
        var commaIndex = rawData.search(",");

        valueRead1 = rawData.substr(0,commaIndex);
        rawData = rawData.substr(commaIndex+1, rawData.length+1);
        DataSet.push(valueRead1);
        commaIndex = rawData.search(",");

        if(commaIndex == -1) {commaIndex = rawData.length+1;}

        valueRead2 = rawData.substr(0,commaIndex);
        rawData = rawData.substr(commaIndex+1, rawData.length+1);
        DataSet.push(valueRead2);
    }
    generateMask_Emission(DataSet);//call the generateMaskEmission function on new data to fill emission lines
}

//This function loops through an array, setting alternating values as locations and alphas
function generateMask_Emission(dataArray:Array):void{ 
    Mask.graphics.clear();  //Clears the Mask sprite for the next set of values
    addChild(Mask); //Adds the blank sprite in order to clear the stage of old sprites

    //This loop actually draws out how the sprite should look before it is added    
    for (var i:int=0; i<dataArray.length; i+=2){ 
        Mask.graphics.beginFill(0x000000, dataArray[i+1]);
        Mask.graphics.drawRect(dataArray[i],constY,constW, constH);
        Mask.graphics.endFill();
    }
    addChild(Mask);// actually adds the mask we have created to the stage
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top