2010-05-24 22 views
0
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++; 
} 

Bonjour, Je suis relativement nouveau dans les scripts Flash et Action et j'ai un problème pour que l'image-objet soit supprimée après qu'une autre soit appelée. Je fais des spectres 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 empilés les uns sur les autres et je me retrouve avec des lignes en gras partout dans ma photo au lieu d'un nouvel ensemble de lignes chaque fois que j'appuie sur un bouton. J'ai essayé d'utiliser try/catch pour supprimer les sprites et j'ai également réarrangé le code entier de ce qui est vu ici pour faire 3 entités séparées (en espérant que je pourrais les supprimer si elles étaient des variables séparées) au lieu de 2 fonctions gérer l'ensemble du processus. J'ai tout essayé dans la mesure de mes connaissances (ce qui est assez minime à ce stade) des suggestions?Aide sur la suppression des sprites dynamiquement créés

Merci d'avance!

Répondre

0

Mes connaissances AS3 sont plutôt rudimentaires en ce moment mais je pense que deux choses peuvent vous aider.

  1. Vous pouvez utiliser removeChild avant de recréer le Sprite. Sinon, réutilisez simplement le Sprite.
  2. Essayez d'ajouter ceci [spriteName] .graphics.clear(); 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++; 
    }
+0

Problème résolu. J'ai dû utiliser la fonction graphics.clear mais cela n'a pas fonctionné jusqu'à ce que je réorganise mon code, même si je n'ai rien ajouté ou retranché pour le faire fonctionner correctement. Doit aimer la programmation ... prend tout son sens tout le temps, pour toujours! (sarcasme) Merci pour l'aide btw! –

0

Juste au cas où quelqu'un était curieux ou ayant un problème similaire. Correctif extrêmement simple mais voici ce que j'ai fait.

De même, je ne pense pas que la fonction graphics.clear ait réellement corrigé le problème (bien que le sprite n'ait pas été effacé correctement avant), mais je crois que le problème se situe au début du chargement. fonction où 3 de ces variables étaient en dehors 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 
}