2015-08-25 2 views
1

MIS A JOURComment passer une variable à une fonction appelée par ENTER_FRAME sans commande

J'ai un grand code de cluttery que je veux accélérer par instanciation CubeEaseOut classe une fois. Je le fais à travers le ff:

var myClass = new CubeEaseOut() 

myClip.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver); 
myClip2.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver); 
myClip3.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver); 

function onMouseOver(e:Event){ 
    //made changes here 
    myClass.initializer(e.currentTarget, ["scaleX",1.5,"height",200]); 
} 

Alors chaque fois que je déplace la souris sur l'un de ces clips, une fonction nommée initializer() dans la classe CubeEaseOut est appelée.

À l'intérieur de la classe CubeEaseOut, j'ai un code qui déjeune sur ENTER_FRAME une fois puis appelle périodiquement une fonction animateThis().

package; 

import goes here... 

class CubeEaseOut extends Sprite { 

    var here... 

    public function new(){ 
     super(); 
     addEventListener(Event.ENTER_FRAME, animateThis); 
    } 

    public function initializer(mc:Dynamic, vars:Array<Dynamic>()){ 

     vars[1] //this is a Float with value 1.5 
     mc[vars[0]] //is mc.scaleX 

     //some other code 
     //notice many variables received here are needed by other functions 
     //but if I make this public, or placed outside functions, every call 
     //on this function will overwrite previous values 

     //other variables here 

     var sp:Float = (vars[1] - mc[vars[0]])/50 
    } 
    private function animateThis(e:Event){ 
      //some other code 
      //many variables from initialize() function is needed here 

      iter++ 
      mc[vars[1]] += sp*iter 

    } 

} 

La chose est, pour animateThis() à travailler, il a besoin de vars initializer(). Comment puis-je passer des variables de initializer() à animateThis() sans le prochain appel à initializer() en remplaçant les variables précédentes?

: attemps

  1. j'ai essayé d'utiliser vars mondiale, mais ce mess choses.
  2. Placez ENTER_FRAME à l'intérieur de la fonction initializer() mais il s'avère que ENTER_FRAME sera appelé my times - CPU intensive.
  3. Créé plusieurs instance de la classe - CPU intensive ainsi.
  4. Essayé en utilisant this.aVar, aVar est remplacé par l'appel suivant.

Informations additionnelles:

Le code complet que je fais est similaire à celui-ci

Animation code not fired when mouse is out Clip1 but mouse is inside clip 2

mais je suis maintenant en œuvre classe et ENTER_FRAME.

+0

oui, j'accomplirai le portage de mon code en utilisant vos suggestions. Je serai de retour une fois que les résultats seront connus. –

+0

Les utilisateurs de @GurtejSingh qui posent une question sont informés des réponses qu'ils reçoivent.Nous n'avons pas besoin de spammer le site avec "regarde ma réponse!" commentaires. – null

+0

@null Désolé, rien à envier! Je faisais juste en sorte que les utilisateurs voient la réponse que j'ai postée. Sera prudent d'avancer. Excuses. –

Répondre

1

Code mis à jour ci-dessous. Pour autant que je comprends, vous voulez utiliser la même classe CubeEaseOut pour gérer plusieurs animations. Ce que j'ai essayé (non testé), est de créer un tableau d'objets des données transmises à cette classe. Dans chaque objet, je stocke le clip transmis et les données transmises pour chaque clip. Chaque fois que l'initialiseur est appelé, il vérifie si les données de ce clip existent déjà dans le tableau. Si ce n'est pas le cas, il ajoute le clip et ses données au tableau. S'il trouve le clip, il assigne simplement l'objet en tant qu'objet d'animation en cours à partir du tableau et il n'écrase pas ses données. Notez que cela peut limiter l'animation à exécuter pour un seul clip à la fois.

Vous pouvez choisir d'exécuter une boucle à l'intérieur de votre méthode d'entrée de cadre et d'effectuer des animations pour tous les objets à l'intérieur de votre tableau.

import goes here... 

class CubeEaseOut extends Sprite { 

    private var objectsToAnimate:Array = new Array(); 
    private var currentMcData:Object;  

    public function new(){ 
     super(); 
     addEventListener(Event.ENTER_FRAME, animateThis); 
    } 

    public function initializer(mc:Dynamic, vars:Array<Dynamic>()){ 
     for (var i:uint = 0; i < objectsToAnimate.length; i++) 
     { 
       if (objectsToAnimate[i].movieClip != mc) 
       { 
        var dataObj:Object = new Object(); 
        dataObj.movieClip = mc; 
        dataObj.dataVars = vars; 
        objectsToAnimate.push(dataObj); 
       } 
       else if (objectsToAnimate[i].movieClip == mc) 
        this.currentMcData = objectsToAnimate[i]; 
     } 
    } 
    private function animateThis(e:Event){ 
      //codes here 
      trace(this.currentMcData.vars); 
      // or run a loop and animate all the movie clips. 
    } 

} 

Espérons que cela aide.

+0

Test effectué avec 'this.aVar' il ne fonctionne pas dans mon code. Bien que 'this.aVar' ait été reçu par la fonction, il est remplacé une fois qu'un appel immédiat à la fonction' initializer() 'a été activé, je dois le passer comme s'il s'agissait d'un var local pour les deux fonctions (?) –

+0

de tous, merci pour le vote up. Deuxièmement, laissez-moi mieux comprendre votre besoin. Voulez-vous que cette variable soit mise à jour une seule fois? Quelques détails supplémentaires peuvent certainement m'aider à mettre à jour ma réponse. Merci. –

+0

J'ai environ 10 variables que 'animateThis()' devrait accéder depuis 'initializer()'. Certains sont mis à jour, tandis que d'autres sont statiques. Je pense, peut-être que je pourrais transférer l'événement ENTER_FRAME à 'initializer()' puis lui faire passer un argument. Mais je rencontre deux problèmes (1) il n'y a aucun moyen que je puisse passer des arguments comme il était de setInterval() et (2) je ne pouvais pas mettre un 'int identifier' pour chaque' addEventListener 'qui est déjeuné. –