AS2 : Une histoire de couleurs...

AS2 : Une histoire de couleurs... - Flash/ActionScript - Programmation

Marsh Posté le 04-08-2010 à 17:10:02    

Voila, j'ai une occurence que je souhaiterais voir changer de couleur à chaque fois que j'arrive sur une frame précise du clip-père. J'ai tenté de faire un code à partir de solutions trouvés sur internet, mais je bloque sur un souci.

 

La fonction marche, à savoir qu'en arrivant sur la frame la couleur change, mais elle change alors sans cesse. Si je fais un delete la couleur appliquée est retirée.

 

Voila le code :

 
Code :
  1. this.onEnterFrame = function() {
  2.      coloRandom = function() {
  3. _global.ToHex = function(d)
  4. {
  5. var HexChars = "0123456789abcdef";
  6. var d0 = d % 20;
  7. var d1 = (d-d0) /16;
  8. var x1 = HexChars.charAt(d1);
  9. var x0 = HexChars.charAt(d0);
  10. return x1+x0;
  11. }
  12. _global.RandomColor = function()
  13. {
  14. Red = ToHex((random(256)));
  15. Green = ToHex((random(256)));
  16. Blue = ToHex((random(256)));
  17. return "0x"+Red+Green+Blue;
  18. }
  19. var Couleur = RandomColor();
  20. myColor = new Color(this.afond.fond);
  21. myColor.setRGB(Couleur);
  22.         }
  23. coloRandom();
  24. }
 

La var Couleur est superflue.

 

En fait ce qui m'arrangerait, c'est que cette fonction ne s'exécute qu'une seule fois et que son effet perdure.

 

Si quelqu'un à la gentillesse de me donner un petit indice, j'en serais très heureux :hello:


Message édité par lxl ihsahn lxl le 04-08-2010 à 17:18:32

---------------
[YouTube] Le Cerveau Lent : vulgarisation sciences cognitives ◦ [url=https://forum.hardware.fr/hfr/AchatsVentes/Photo-Audio-Video/vds-pentax-samyang-sujet_644991_1.htm]Vente Penta
Reply

Marsh Posté le 04-08-2010 à 17:10:02   

Reply

Marsh Posté le 04-08-2010 à 21:35:56    

Le pire, c'est que tes methodes, en plus d'être appelé sont DECLARÉS dans ton onEnterFrame, c'est très crade... (Zedlefou, si tu passe par là... :D)

 


Code :
  1. // Je déclare les 3 fonctions qui vont me servir, sans imbrications !
  2.  
  3. decimalToHex = function(d):String
  4. {
  5.     var HexChars:String = "0123456789abcdef";
  6.     var d0:uint = d % 20; // Pourquoi modulo 20 ? en hexa !
  7.     var d1:uint = uint((d-d0)/16); // hein ? oula...
  8.     var x1:String = HexChars.charAt(d1);
  9.     var x0:String = HexChars.charAt(d0);
  10.     return x1+x0;
  11. }
  12.  
  13. generateRandomColor = function():String // je sais pas si on peut/doit retourner un Number ici en AS2...
  14. {
  15.     var Red:String = decimalToHex((random(256)));
  16.     var Green:String = decimalToHex((random(256)));
  17.     var Blue:String = decimalToHex((random(256)));
  18.     //en AS3, pour avoir une couleur random, on a juste à faire Math.random()*0xFFFFFF...
  19.     return "0x"+Red+Green+Blue;
  20. }
  21.  
  22. changeCouleur = function():void
  23. {    
  24.     //Je m'inspire de ce qu'il y avais deja là...
  25.     var myColor = new Color(this.afond.fond);
  26.     myColor.setRGB(generateRandomColor());
  27. }
 

Et dans ton clip parent, tu met le code monOccurence.changeCouleur(); à chaque frame (image clé) ou tu veux que ça change.
Je suis pas sûre du typage des fonctions, AS2 c'est relou avec sa sur-tolérence (du fait que ton code marche tel que tu l'as mis).
Je suis pas sure des majuscule sur certain typage, je crois que certains changent en AS3...
Bref, passe à l'AS3, ça sera plus simple

Message cité 1 fois
Message édité par abais le 04-08-2010 à 21:44:09

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

Marsh Posté le 05-08-2010 à 12:02:18    

abais a écrit :

Le pire, c'est que tes methodes, en plus d'être appelé sont DECLARÉS dans ton onEnterFrame, c'est très crade... (Zedlefou, si tu passe par là... :D)
 
 

Code :
  1. // Je déclare les 3 fonctions qui vont me servir, sans imbrications !
  2.  
  3. decimalToHex = function(d):String
  4. {
  5.     var HexChars:String = "0123456789abcdef";
  6.     var d0:uint = d % 20; // Pourquoi modulo 20 ? en hexa !
  7.     var d1:uint = uint((d-d0)/16); // hein ? oula...
  8.     var x1:String = HexChars.charAt(d1);
  9.     var x0:String = HexChars.charAt(d0);
  10.     return x1+x0;
  11. }
  12.  
  13. generateRandomColor = function():String // je sais pas si on peut/doit retourner un Number ici en AS2...
  14. {
  15.     var Red:String = decimalToHex((random(256)));
  16.     var Green:String = decimalToHex((random(256)));
  17.     var Blue:String = decimalToHex((random(256)));
  18.     //en AS3, pour avoir une couleur random, on a juste à faire Math.random()*0xFFFFFF...
  19.     return "0x"+Red+Green+Blue;
  20. }
  21.  
  22. changeCouleur = function():void
  23. {    
  24.     //Je m'inspire de ce qu'il y avais deja là...
  25.     var myColor = new Color(this.afond.fond);
  26.     myColor.setRGB(generateRandomColor());
  27. }


 
Et dans ton clip parent, tu met le code monOccurence.changeCouleur(); à chaque frame (image clé) ou tu veux que ça change.
Je suis pas sûre du typage des fonctions, AS2 c'est relou avec sa sur-tolérence (du fait que ton code marche tel que tu l'as mis).
Je suis pas sure des majuscule sur certain typage, je crois que certains changent en AS3...
Bref, passe à l'AS3, ça sera plus simple


 
 
Bon j'ai bien évidemment passé du temps dessus pour essayer de régler le problème.

Code :
  1. coloRandom = function() {
  2. _global.ToHex = function(d)
  3. {
  4. var HexChars = "0123456789abcdef";
  5. var d0 = d % 16;
  6. var d1 = (d-d0) /16;
  7. var x1 = HexChars.charAt(d1);
  8. var x0 = HexChars.charAt(d0);
  9. return x1+x0;
  10. }
  11. _global.RandomColor = function()
  12. {
  13. Red = ToHex(Math.round(Math.random()*16)+32);
  14. Green = ToHex(Math.round(Math.random()*16)+32);
  15. Blue = ToHex(Math.round(Math.random()*16)+32);
  16. return "0x"+Red+Green+Blue;
  17. }
  18. var Couleur = RandomColor();
  19. myColor = new Color(this.carre.unite);
  20. myColor.setRGB(Couleur);
  21. }


 
 
Le coup du decimalToHex je l'ai trouvé sur le net, j'ai pas assez de bouteille pour penser à des trucs aussi farfelus :D
Mais une fois penché sur le code je me suis dit que le 20 ne voulait rien dire. J'ai trouvé que % était modulo et j'ai mieux pigé le truc.  
 
J'ai remplacé les random par des Math.round(Math.random), j'ai l'impression que le random() est moins satisfaisant en terme d'aléa, mais je me trompe peut-être, enfin reste que du coup j'utilise un offset pour limiter la plage d'aléas, et je peux créer des zones de couleurs différentes.
 
 
Donc je résume. Je définis ma fonction (ici coloRandom) au niveau supérieur, et je l'appelle sur la timeline de ce clip ? Autant mettre le code sur _root non ?
 
Je sais que c'est pas très malin de déclarer les fonctions dans un this.onEnterFrame, mais c'est plus facile à comprendre quand on n'a ni l'habitude ni une forte abstraction :D
 
 


---------------
[YouTube] Le Cerveau Lent : vulgarisation sciences cognitives ◦ [url=https://forum.hardware.fr/hfr/AchatsVentes/Photo-Audio-Video/vds-pentax-samyang-sujet_644991_1.htm]Vente Penta
Reply

Marsh Posté le 05-08-2010 à 12:31:55    

Oui, ça devrait etre modulo 16 en hexa...
var d0 = Math.floor(d /16);
var d1 = d % 16;
...
 
Pour les declarations dans l'onEnterFrame, tu devrais avoir honte toute ta vie ! Et si je fais une dédicasse à Zed, c'est parceque j'avais fait pareil, alors que je débutais comme toi, il y a 2-3ans...
 
Sinon oui, met le plus possible dans le root, je ne connais pas l'architecture de ton .fla...
Fais gaffe juste à tes linkage, si tu declare ta fonction dans le root, assure toi que ...
 
myColor = new Color(this.carre.unite);
myColor.setRGB(Couleur);
 
... vise le bon clip !
 
La methode, tu l'appel du root aussi (tu peux le faire de n'importe ou, le principe est de mettre un bon chemin...
Si ta fonction est declaré dans root et que tu veux l'appeler d'un sous-clip, alors tu devras faire : _root.coloRandom() ou _parent.coloRandom()


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

Marsh Posté le 05-08-2010 à 12:46:17    

Je viens de voir qu'en AS2, on instanciait un objet Color à partir de nombre  entre 0 et 1 pour les RVB...
Du coup, pour avoir une couleur au pif :
var maCouleur:Color = new Color(Math.random(),Math.random(),Math.random());
Bref...
Ça remet en cause ton script, la conversion en hexa devient inutile...


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

Marsh Posté le 05-08-2010 à 15:40:57    

abais a écrit :

Je viens de voir qu'en AS2, on instanciait un objet Color à partir de nombre  entre 0 et 1 pour les RVB...
Du coup, pour avoir une couleur au pif :
var maCouleur:Color = new Color(Math.random(),Math.random(),Math.random());
Bref...
Ça remet en cause ton script, la conversion en hexa devient inutile...


 
Ah oui pas mal...
 
Bon faudra que je me mette à l'AS3, ça deviens urgent :/


---------------
[YouTube] Le Cerveau Lent : vulgarisation sciences cognitives ◦ [url=https://forum.hardware.fr/hfr/AchatsVentes/Photo-Audio-Video/vds-pentax-samyang-sujet_644991_1.htm]Vente Penta
Reply

Sujets relatifs:

Leave a Replay

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