2010-02-20 8 views
0

Je tente (jusqu'à présent sans succès) d'augmenter et de réduire par programmation l'échelle d'un objet sur scène. il y a un bouton Grow (grow_btn) et un bouton Shrink (shrink_btn), qui augmentent et diminuent les propriétés scaleX et scaleY d'un objet sélectionné (redObject, greenObject ou blueObject) au fil du temps. Le problème que je rencontre semble aléatoire, où parfois seulement une des propriétés (soit scaleX ou scaleY) va changer, tandis que l'autre ne le fait pas. De plus, les tailles cible et originale pour les fonctions d'interpolation ne s'ajustent pas correctement. Par exemple: 1.0 est presque deux fois plus grand que l'objet sur scène.Actionscript 3.0 Tween Erreur

//Imports 
import fl.transitions.Tween; 
import fl.transitions.easing.*; 

//Constants And Variables 
const starRotationAngle:Number = 0.5; 
const starSpeed:Number = 2; 

var moveForward:Boolean = true; 
var selectedObject:MovieClip; 

//Event Listeners & Functions 
star_mc.addEventListener(MouseEvent.CLICK, rotateStar); 
function rotateStar(e:MouseEvent):void 
    { 
    star_mc.rotation += 5; 
    } 

addEventListener(Event.ENTER_FRAME, starMove); 
function starMove(e:Event):void 
    { 
    if (star_mc.x >= stage.stageWidth + star_mc.width) 
     {moveForward = false;} 
    else if (star_mc.x <= stage.x - star_mc.width) 
     {moveForward = true;} 

    if (moveForward == true) 
     { 
     star_mc.x += starSpeed; 
     star_mc.rotation += starRotationAngle; 
     }  
     else 
     { 
     star_mc.x -= starSpeed; 
     star_mc.rotation -= starRotationAngle; 
     } 
    } 

redObject.addEventListener(MouseEvent.CLICK, changeSelectedObjectVariable); 
greenObject.addEventListener(MouseEvent.CLICK, changeSelectedObjectVariable); 
blueObject.addEventListener(MouseEvent.CLICK, changeSelectedObjectVariable); 
function changeSelectedObjectVariable(e:MouseEvent):void 
    { 
    selectedObject = e.currentTarget as MovieClip; 
    } 

grow_btn.addEventListener(MouseEvent.CLICK, grow); 
function grow(e:MouseEvent):void 
    { 
    var tweenGrowX:Tween = new Tween(selectedObject, "scaleX", None.easeIn, 1.0, 2.0, 3.0, true); 
    var tweenGrowY:Tween = new Tween(selectedObject, "scaleY", None.easeIn, 1.0, 2.0, 3.0, true); 
    } 

shrink_btn.addEventListener(MouseEvent.CLICK, shrink); 
function shrink(e:MouseEvent):void 
    { 
    var tweenShrinkX:Tween = new Tween(selectedObject, "scaleX", None.easeIn, 2.0, 1.0, 3.0, true); 
    var tweenShrinkY:Tween = new Tween(selectedObject, "scaleY", None.easeIn, 2.0, 1.0, 3.0, true); 
    } 

Répondre

2

Déplacez les objets interpolation en dehors des fonctions d'écoute, et n'utilisez pas d'objets interpolation différents à la fois pour grow() et rétrécir(). Je pense que votre problème est que vous ne détruisez pas un tween précédent avant d'appliquer une nouvelle interpolation afin qu'ils se marchent les uns sur les autres.

var tweenScaleX:Tween; 
var tweenScaleY:Tween; 

Votre progression() et rétractables() méthodes devraient utiliser à la fois ces deux variables d'interpolation au lieu de créer des variables d'interpolation dans la méthode (ce qui les rend disponibles pour la collecte des ordures lorsque la fonction a terminé même si l'interpolation a non complété). Lorsque vous appelez grow(), tweenScaleX et tweenScaleY reçoivent tous deux de nouveaux objets d'interpolation. Si le bouton de rétrécissement est cliqué avant la fin de grow(), la méthode shrink() commencera et les tweens assignés pendant grow() seront essentiellement "détruits" pour faire place aux nouveaux tweens de rétrécissement.

En outre, votre problème peut être lié à la récupération de place AS3. La première réponse fournie indique que le code fonctionne correctement, mais la récupération de place est différente d'un ordinateur à l'autre en raison des performances et de la disponibilité de la mémoire. Une application Flash gourmande en mémoire effectuera la récupération de place plus fréquemment, mais sur une boîte avec beaucoup de mémoire et de performance, cela peut ne pas arriver du tout. Comme je l'ai mentionné plus haut, puisque vous créez les variables d'interpolation à l'intérieur des fonctions grow() et shrink(), leur portée est seulement dans cette fonction. Lorsque la fonction est terminée, les variables créées à l'intérieur de la fonction deviennent éligibles pour la récupération de place. Vos objets tween seront détruits si le garbage collection se produit même si ces tweens n'ont pas fini leurs tweens (et l'événement "complete" ne se déclenchera jamais). En déplaçant les variables d'interpolation en dehors des fonctions de votre exemple (ou en en faisant des membres de classe dans une classe), vous déplacez la portée vers l'objet parent afin que l'interpolation existe tant que ce parent existe. Les changements apportés à la récupération de place sont l'un des changements les plus importants mais probablement les moins bien compris de AS2 à AS3. En tant que développeur, vous pouvez avoir beaucoup de RAM, donc la récupération de place n'est pas fréquente (ou inexistante tant qu'il y a assez de mémoire pour contenir tout), mais en production, vos utilisateurs peuvent avoir un comportement étrange. RAM mais ces éléments sont référencés ailleurs puisque vous pensiez qu'ils existaient encore et que le code fonctionne bien pour vous. C'est une plainte que les développeurs AS3 reprochent souvent à Adobe de faire des changements qui font que Flash n'est plus indépendant de la plateforme, mais c'est une fonctionnalité importante qui doit être ajoutée pour rendre Flash plus robuste.

+0

merci. c'était ça. :) – TheDarkIn1978

+0

wpjmurray vous remercie pour la bonne explication. Je suis conscient de la récupération de place, mais manque complètement le problème que la portée des 2 variables tween peut causer. –

1

votre code est correct. Fonctionne comme il se doit Vérifiez dans l'échelle de l'échelle de vos MovieClips dans le panneau de transformation, ils devraient être fixés à 100 100.

+0

ok, les échelles ne sont pas 100x100. cependant, je vois toujours un comportement étrange, mais je crois que la mise à l'échelle est en quelque sorte interrompue par une animation en arrière-plan. quand je supprime l'animation constante, toute mise à l'échelle est correcte. Sans supprimer l'animation d'arrière-plan constante, la mise à l'échelle d'un objet sera fausse au début. les premières fois que la fonction de mise à l'échelle est exécutée, l'objet sélectionné commencera à évoluer correctement, mais soudainement la largeur s'arrêtera tandis que la hauteur continuera à augmenter. J'ai mis à jour mon message original pour montrer tout mon script. J'espère qu'il y a une explication. – TheDarkIn1978

0

Ne déclarez pas les objets d'interpolation dans les fonctions, ils sont nettoyés par CG avant la fin de l'interpolation. Déclarez-les globalement.

INCORRECT:

function grow(e:MouseEvent):void 
{ 
    var tweenGrowX:Tween = new Tween(selectedObject, "scaleX", None.easeIn, 1.0, 2.0, 3.0, true); 
    var tweenGrowY:Tween = new Tween(selectedObject, "scaleY", None.easeIn, 1.0, 2.0, 3.0, true); 
} 

CORRECT:

var tweenGrowX:Tween; 
var tweenGrowY:Tween; 
function grow(e:MouseEvent):void 
{ 
    tweenGrowX = new Tween(selectedObject, "scaleX", None.easeIn, 1.0, 2.0, 3.0, true); 
    tweenGrowY = new Tween(selectedObject, "scaleY", None.easeIn, 1.0, 2.0, 3.0, true); 
}