0 votes

Comment coller la position d'un Sprite à un autre ?

J'ai le code suivant :

if (i==0)
  sprites[i].y = 0;
else
  sprites[i].y = sprites[i-1].y + sprites[i-1].height;

Chaque sprite peut avoir une hauteur différente. La hauteur d'un sprite peut changer en fonction de l'action de l'utilisateur.

Lorsque la hauteur d'un sprite change, j'aimerais mettre à jour la position des autres sprites en conséquence.

Je suis à la recherche d'une solution orientée objet (peut-être orientée événement). Des idées ?

Remerciements

2voto

back2dos Points 13253

Il n'existe aucun moyen de suivre intégralement les modifications apportées aux x , y , width , height les propriétés de DisplayObject ... vous pourriez surcharger les accesseurs, mais cela ne fonctionnerait pas tout à fait ... par exemple, un objet peut devenir plus grand, parce qu'un enfant est ajouté, que quelque chose est dessiné, qu'une opération de chargement se termine, etc. ...

si le nombre de sprites est raisonnablement bas (<200), vous pouvez facilement faire la vérification à l'entrée, sans perte de performance mesurable ... non, ce n'est pas une approche très agréable, mais c'est vraiment la chose la plus efficace et la plus sûre à faire ...

Bonne chance alors ... ;)

1voto

Myk Points 4083

Si vous avez un bon contrôle sur le moment où la hauteur d'un sprite donné va changer, vous pouvez utiliser un événement personnalisé. La configuration ressemblerait à quelque chose comme ceci :

var UPDATED_EVENT:String = "updated";
var i:int = 0;
var count:int = sprites.length; // this is the length of your array

for (i = 0; i < count; i++) {
  sprites[i].addEventListener(UPDATED_EVENT, calc);
}

function calc(e:Event = null):void {
// here goes your positioning code
  for (i = 0; i < count; i++) {
    if (i==0)
      sprites[i].y = 0;
    else
      sprites[i].y = sprites[i-1].y + sprites[i-1].height;
  }
}

calc();

Ensuite, assurez-vous que chaque fois que vous changez la hauteur d'un de vos sprites, vous faites quelque chose comme ceci :

mySprite.dispatchEvent(new Event(UPDATED_EVENT));

Si vous êtes répartis dans plusieurs classes (et c'est probablement le cas), vous pouvez faire de la chaîne UPDATED_EVENT une constante dans une classe d'événement distincte et y accéder à partir des deux.

Ce n'est toujours pas une solution parfaite pour vous - si vous le souhaitez, vous pouvez déterminer quel sprite change de hauteur et ne recalculer que les sprites qui viennent après lui, ce qui rendra votre code plus efficace - mais c'est mieux que d'appeler un événement enterframe à chaque fois.

Si vous utilisiez Flex, vous auriez encore plus d'outils à votre disposition - vous pourriez probablement utiliser le databinding pour automatiser presque tout cela, ou au moins utiliser l'événement changed pour distribuer automatiquement des événements pour vous, mais ce n'est ni l'un ni l'autre !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X