2009-09-15 13 views
0

J'ai le code suivant:Comment coller la position d'un Sprite à un autre?

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 à l'action de l'utilisateur.

Lorsque la hauteur de certains sprites change, je voudrais mettre à jour la position des autres sprites en conséquence.

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

Merci

Répondre

1

Si vous avez un bon contrôle lorsque la hauteur d'un sprite va changer, vous pouvez alors 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 que vous faites quelque chose comme ceci:

mySprite.dispatchEvent(new Event(UPDATED_EVENT)); 

Si vous étalez sur plusieurs classes (et vous devriez probablement l'être) alors vous pouvez faire de la chaîne UPDATED_EVENT un const dans une classe d'événements séparée 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 sa hauteur et ne recalculer que les sprites qui le suivent, ce qui rendra votre code plus efficace - mais ça bat appeler un événement enterframe à chaque fois. Maintenant, si vous utilisiez Flex, vous auriez encore plus d'outils à votre disposition - vous pourriez probablement utiliser la liaison de données pour automatiser presque tout cela, ou au moins utiliser l'événement modifié pour distribuer automatiquement les événements pour vous, mais c'est ni ici ni là!

+0

1. essayez 'fonction calc (e: Événement = null) {var y: Number = 0; pour chaque (var s: Sprite dans les sprites) y = (s.y = y) + s.height; } '. c'est plus rapide (pas d'accès au tableau) et plus concis. 2. ce n'est pas toujours plus efficace. Si vos sprites changent beaucoup (plusieurs fois par image), vous appelerez 'calc' plus souvent que nécessaire et instancierez plus d'événements que nécessaire. De plus, cela est très peu flexible, car tout code accédant à ces sprites doit se soucier des mises à jour. Ceci est tout à fait contraire aux concepts OO. – back2dos

+0

Cool feedback, et bon appel sur l'utilisation de la pour chaque boucle plutôt que l'accès au tableau. En ce qui concerne les principes OO, vous avez raison - de la façon dont je l'ai exposé, vous allez avoir un couplage serré en cours.Vous devriez être capable de le refactoriser dans un arrangement un peu plus abstrait, mais sans un événement CHANGÉ comme Flex vous êtes toujours bloqué en envoyant manuellement UPDATED_EVENT chaque fois que quelque chose change. – Myk

+0

bonne réponse! dommage que je l'ai déjà fait avec ENTER_FRAME – warpech

2

il n'y a aucun moyen de suivre pleinement les changements à x, y, width, height propriétés DisplayObject s ... vous pouvez passer outre accesseurs, mais encore, cela ne fonctionne pas tout à fait ... pour exemple, un objet peut devenir plus grand, car un enfant est ajouté, quelque chose est dessiné, une opération de chargement se termine, etc ...

si le nombre de sprites est raisonnablement bas (< 200), vous pouvez facilement faire le vérifier sur enterframe, sans aucune perte de performance mesurable ... non, ce n'est pas une très bonne approche, mais c'est réel ment le plus efficace et la plus sûre chose à faire ...

bonne chance alors ...;)

+0

C'est dommage, car en PHP j'écrirais juste: $ sprites [i] -> y & = $ sprites [i-1] -> y (si je ne me trompe pas) Je pensais que peut-être un peu modèle de conception (observateur) implémente ceci ... – warpech

Questions connexes