Помощь по удалению динамически создаваемых спрайтов - PullRequest
0 голосов
/ 24 мая 2010
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++;
}

Привет, я относительно новичок во флэш-памяти и сценарии действий, и у меня возникла проблема с удалением спрайта после вызова другого.Я делаю спектр излучения из 3 элементов, динамически генерируя маску поверх изображения на сцене.Все отлично работает с кодом, который у меня есть сейчас, за исключением стека спрайтов друг над другом, и я получаю жирные линии по всей картинке вместо нового набора строк каждый раз, когда я нажимаю кнопку.

Я попытался использовать try / catch для удаления спрайтов, и я также переставил весь код из того, что видно здесь, чтобы сделать 3 отдельных объекта (надеясь, что смогу удалить их, если они были отдельными переменными) вместо 2 функций, которые обрабатывают всепроцесс.Я перепробовал все, насколько мне известно (что является довольно минимальным, @ этот момент) какие-либо предложения?

Спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 27 мая 2010

На всякий случай, если кому-то было любопытно или возникла подобная проблема. Чрезвычайно простое исправление, но вот что я сделал.

Также следует упомянуть, что я не думаю, что функция graphics.clear на самом деле исправила проблему (хотя у меня раньше не было должной очистки спрайта), но я считаю, что проблема заключается в начале загруженной функции где 3 из этих переменных были вне функции.

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
}
0 голосов
/ 25 мая 2010

Мои знания AS3 сейчас довольно просты, но я думаю, что вам могут помочь две вещи.

  1. Вы можете использовать removeChild перед воссозданием Sprite. Кроме того, просто повторно используйте Sprite.
  2. Попробуйте добавить это [spriteName] .graphics.clear (); сбросить спрайт и начать перерисовку.
     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++;
    }
...