2013-07-02 4 views
0

J'ai un problème avec une variable de type "Point" vitesse changeant sans aucun appel pour le changer.as3 Variables changeant de façon impossible

private function framecode(e:Event) { 
    trace(getVelocity().y); 
    tracks.gotoAndStop(2); 
    trace(getVelocity().y); 
} 

Ce code fait partie d'une classe appelée « réservoir » qui prolonge celle qui vitesse est utilisé dans (ma classe d'objet en mouvement). La vitesse est une variable de type point privé et getVelocity() est une méthode d'accès public. pistes est un movieClip nommé contenu à l'intérieur de celui lié à réservoir. L'écouteur d'événement est ENTER_FRAME. Il n'y a pas de codage sur les trames de pistes.

D'une manière ou d'une autre, ces deux traces donnent des valeurs différentes (la première étant correcte) et je n'arrive pas à comprendre comment gotoAndStop() peut l'affecter (et donc comment le réparer).

J'ai découvert que play() ne reproduisait pas le bogue mais prevFrame() et nextFrame() le font. Comme la variable est privée, cette classe ne devrait même pas y avoir accès pour la changer. Une autre étrangeté est que si l'écouteur d'événement est changé en FRAME_CONSTRUCTED ou EXIT_FRAME, il y a un décalage massif et mon MovieClip disparaît au hasard après quelques secondes.

Merci d'avoir lu, toute aide serait appréciée.

Répondre

1

Votre variable velocity est privée, donc une personne peut accéder à cette variable en dehors de la classe. Toutefois, getVelocity() renvoie une référence à votre variable velocity. Une fois que quelqu'un a cette référence, ils peuvent changer les valeurs de ses propriétés: getVelocity().y = 3. Il n'est donc pas impossible que cela arrive.

Une façon de dépannage est d'ajouter une instruction trace() à/définir un point d'arrêt dans getVelocity() afin que vous puissiez voir où il est utilisé.

Vous pouvez faire quelque chose de similaire avec la classe Point, mais vous devrez l'étendre, ajouter des méthodes getter/setter pour y (qui trace quand elles sont appelées), et modifier votre code pour utiliser le getter/setter. Cela peut être utile (c'est assez simple), et le fait de modifier votre code pour utiliser le getter peut vous aider à découvrir où se trouve le problème.

Questions connexes