Problème de disparition programmée en AS3

Problème de disparition programmée en AS3 - Flash/ActionScript - Programmation

Marsh Posté le 29-11-2012 à 14:44:14    

Bonjour à tous !
 
Je réalise un petit jeu en flash pour un projet de ma fac', j'm'en sors pas trop trop mal (tout en restant dans le très basique, on n'est pas dans une formation très technique) sauf pour un petit truc que je n'arrive pas à régler  :(  
 
Je vous explique, j'ai une cible qui bouge sur l'écran, et j'ai une ligne qui suit ce movie clip et qui trace donc le chemin qu'il a parcouru.
 
Le problème c'est que si on ne clique pas sur la cible pendant un moment (ce qui réinitialise le chemin) bah l'écran devient surchargé très rapidement et fait même lagger mon PC.
 
J'aimerais donc faire en sorte que la trajectoire suive bien mon movie clip mais qu'elle disparaisse progressivement 3 secondes après son apparition afin qu'il n'y ait jamais trop de bordel à l'écran.
 
J'ai réussi à faire disparaitre la trajectoire avec un timer, mais le problème c'est que ça fait disparaître TOUTE la trajectoire et pas juste ce qui est apparu 3 secondes avant :o
 
En gros il me faudrait un truc du genre addChildFor(ligne, 3 secondes) mais à la dernière nouvelle ça n'a pas l'air d'exister :D
 
Vous auriez une idée par hasard?
 
Merci d'avance !  :jap:


---------------
Fuerte : https://www.youtube.com/watch?v=_8e2reyfvuc
Reply

Marsh Posté le 29-11-2012 à 14:44:14   

Reply

Marsh Posté le 30-11-2012 à 16:16:13    

Une methodologie simple :
 
A chaque frame, on enregistre les coordonnées du curseur.
On dessine un trait correspondant à la liaison des 50 dernières coordonnées enregistrées
 

Code :
  1. var listePoint:Array = new Array();
  2. var conteneurTrait:Shape = new Shape();
  3. var couleurTrait:uint = 0xFF0000;
  4. var nombreMaxPoints:int = 40;
  5.         
  6.  
  7. addChild(conteneurTrait);
  8. this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
  9.  
  10. function enterFrameHandler(e:Event):void
  11. {
  12.     var pointSurvol:Point = new Point(conteneurTrait.mouseX, conteneurTrait.mouseY); // Coordonnée en cours de survol
  13.     listePoint.push(pointSurvol); // On l'ajoute en fin de notre tableau
  14.     
  15.     // On supprime les plus vieilles coordonnées :
  16.     while (listePoint.length > nombreMaxPoints)
  17.     {
  18.         listePoint.shift();
  19.     }
  20.     drawPath();
  21. }
  22.         
  23. function drawPath():void
  24. {
  25.     // On efface le trait actuel :
  26.     conteneurTrait.graphics.clear();
  27.             
  28.     conteneurTrait.graphics.lineStyle(3,couleurTrait); // On déclare le style du trait
  29.     conteneurTrait.graphics.moveTo(listePoint[0].x, listePoint[0].y); // On défini le point de départ (1er de la liste)
  30.             
  31.     // Pour chaque point (à partir du 2eme), on dessine le tronçon de trait
  32.     for (var i:int = 1; i < listePoint.length; i++)
  33.     {
  34.         conteneurTrait.graphics.lineTo(listePoint[i].x, listePoint[i].y);
  35.     }
  36.             
  37.     conteneurTrait.graphics.endFill();
  38. }


 
Ça marche assez bien si le taux de FPS est elevé.
Si il est faible et que tu ne peux pas l’élever, utilise un Timer plutôt qu'un Event.ENTER_FRAME !


Message édité par abais le 30-11-2012 à 16:40:23

---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 30-11-2012 à 16:40:12    

Idem avec une atténuation du trait (pas de transparence, c'est un mélange avec du blanc, plus qu'à mettre ton layer en mode produit !)
Je me prend un peu la tête avec le R/V/B  :pt1cable: , pas le temps de faire plus simple  :o  

Code :
  1. var listePoint:Array = new Array();
  2. var conteneurTrait:Shape = new Shape();
  3.  
  4. var couleurTrait_R:uint = 0xFF;
  5. var couleurTrait_V:uint = 0x00;
  6. var couleurTrait_B:uint = 0x00;
  7.  
  8. var nombreMaxPoints:int = 40;
  9.         
  10.  
  11. addChild(conteneurTrait);
  12. this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
  13.  
  14. function enterFrameHandler(e:Event):void
  15. {
  16.     var pointSurvol:Point = new Point(conteneurTrait.mouseX, conteneurTrait.mouseY); // Coordonnée en cours de survol
  17.     listePoint.push(pointSurvol); // On l'ajoute en fin de notre tableau
  18.     
  19.     // On supprime les plus vieilles coordonnées :
  20.     while (listePoint.length > nombreMaxPoints)
  21.     {
  22.         listePoint.shift();
  23.     }
  24.     drawPath();
  25. }
  26.         
  27. function drawPath():void
  28. {
  29.     // On efface le trait actuel :
  30.     conteneurTrait.graphics.clear();
  31.     
  32.     //conteneurTrait.graphics.lineStyle(3); // On déclare le style du trait
  33.     conteneurTrait.graphics.moveTo(listePoint[0].x, listePoint[0].y); // On défini le point de départ (1er de la liste)
  34.     
  35.     // Pour chaque point (à partir du 2eme), on dessine le tronçon de trait
  36.     for (var i:int = 1; i < listePoint.length; i++)
  37.     {
  38.         var parcour:Number = i / listePoint.length;
  39.         
  40.         var r:String = '00'+(0xFF - (0xFF - couleurTrait_R) * parcour).toString(16);
  41.         var v:String = '00'+(0xFF - (0xFF - couleurTrait_V) * parcour).toString(16);
  42.         var b:String = '00'+(0xFF - (0xFF - couleurTrait_B) * parcour).toString(16);
  43.         
  44.         var couleur:uint = uint("0x"+r.substr(-2)+v.substr(-2)+b.substr(-2));
  45.         conteneurTrait.graphics.lineStyle(3,couleur);
  46.         conteneurTrait.graphics.lineTo(listePoint[i].x, listePoint[i].y);
  47.     }
  48.     
  49.     conteneurTrait.graphics.endFill();
  50. }


Message édité par abais le 30-11-2012 à 16:43:13

---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed