Domanda

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++;
}

Ciao, io sono relativamente nuovo a lampeggiare e script di azione come bene e sto avendo un problema ottenere lo sprite di essere rimosso dopo l'altro si chiama. Sto facendo di spettro di emissione di 3 elementi generando dinamicamente la maschera su un'immagine sul palco. Tutto funziona perfettamente bene con il codice che ho in questo momento tranne che gli sprites impilare uno sopra l'altro e io alla fine con linee decise su tutto il quadro invece di una nuova serie di linee ogni volta che si preme un pulsante.

Ho provato con try / catch per rimuovere gli sprite e ho anche riarrangiato l'intero codice da ciò che si vede qui per fare 3 soggetti separate (sperando di poter rimuoverli se fossero variabili separate) invece di 2 funzioni che gestiscono l'intero processo. Ho provato di tutto per quanto di mia conoscenza (che è piuttosto minimale @ questo punto) qualche suggerimento?

Grazie prima del tempo!

È stato utile?

Soluzione

La mia conoscenza AS3 è piuttosto rudimentale in questo momento, ma credo che due cose possono aiutare.

  1. Si potrebbe usare removeChild prima di ricreare la Sprite. In alternativa, basta riutilizzare la Sprite.
  2. Prova a aggiungere questo [spriteName] .graphics.clear (); per ripristinare lo sprite e iniziare a ridisegnare.
     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++;
    }

Altri suggerimenti

Nel caso in cui qualcuno fosse curioso o che hanno un problema simile. Estremamente semplice correzione ma qui è quello che ho fatto.

Inoltre dovrebbe dire che non credo che la funzione graphics.clear effettivamente risolto il problema (anche se non ho avuto l'essere sprite cancellato correttamente prima), ma credo che le bugie problema nella all'inizio della funzione onLoaded dove 3 di queste variabili usato essere fuori della funzione.

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
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top