2011-04-01 9 views
1

J'ai un sprite appelé aliment qui s'ajoute à l'écran via l'utilisation d'une minuterie. plus de produits alimentaires sont ajoutés à l'écran au fil du temps. Comment pourrais-je tester tous ces sprites alimentaires avec un autre objet? (la fonction makeItem crée l'image-objet BTW)Sprites et tableaux as3

private function placeFood(event:TimerEvent = null):void{ 
     var rndI:uint = Math.floor(Math.random() * DIM); //sets a random integer based on the the floor 
     var rndJ:uint = Math.floor(Math.random() * DIM); 

     var rndX:Number = grid[rndI][rndJ].x; // sets a grid position for the food item to go 
     var rndY:Number = grid[rndI][rndJ].y; 



     food = makeItem(Math.random() * 0xFFFFFF);// random color 
     food.x = rndX; 
     food.y = rndY; 

     var foodArray:Array = new Array(); 
     foodArray.push(food); 
     trace(foodArray.length) 

     addChild(food); //adds the food to the board 


     for (var i:uint = 0; i < snake.length; i++){ 
      if (rndY == snake[i].y && rndX == snake[i].x){ 
       placeFood(); 
      } 
     } 
    } 

Répondre

3

Ajouter les aliments à un tableau et une boucle à travers ce tableau faisant hitTestObject. Quelque chose comme:

var foods:Array = new Array(); 
foods.push(makeItem(blah)); 
... 
for each (food in foods) { 
    food.hitTestObject(object); 
} 
+0

Salut, j'ai modifié mon post avec votre idée. sauf qu'il ne renvoie que la longueur de 1. – DIM3NSION

+0

Déclarez foodArray en dehors de votre fonction. Vous ne voulez pas créer un nouveau tableau à chaque fois, vous voulez ajouter au tableau existant. – jhocking

+0

merci, je vous ai raison de tracer le bon tableau. maintenant mon objet de serpent est dans un tableau. appelé serpent. comment je l'ai testé tester avec le tableau des aliments et le faire tracer quelque chose? – DIM3NSION

1

Il semble que vous placez des objets sur une grille fixe. Est-ce que les aliments se déplacent? Votre nourriture ne bouge pas, et votre serpent (ou quoi que ce soit entre en contact avec la nourriture), vous pouvez grandement optimiser votre détection de collision en déterminant quel (s) carré (s) de l'objet en mouvement et en vérifiant uniquement la nourriture dans cette zone locale.

De manière générale, lorsque vous devez effectuer une détection de collision entre de nombreux objets, vous le faites en plusieurs passes. La première passe consisterait en des vérifications les moins coûteuses en termes de calcul pour éliminer les objets qui ne pourraient pas entrer en collision, tels que des objets très éloignés, s'éloignant les uns des autres, etc. Votre prochaine passe pourrait ressembler à une simple boîte aux bornes . Enfin, lorsque vous passez aux quelques éléments qui réussissent tous les tests bon marché, vous pouvez utiliser des tests de succès plus coûteux et plus précis, comme les tests pixel par pixel entre les masques de frappe.

+0

salut adam j'ai réussi à faire fonctionner une sorte de hit test. mais il semble que c'est un quadrillage si vous m'obtenez. vous pouvez regarder ici j'ai téléchargé le swf - http://ignitethatdesign.com/FlashLeaderBoard/hitTest.swf. Si vous essayez de rater l'objet de nourriture par une grille, il le détecte comme un coup:/ – DIM3NSION

+1

Après avoir vu le jeu que vous avez posté, le problème est beaucoup plus simple que je ne le pensais. Vous n'avez pas besoin d'une détection de collision dans le sens habituel, il vous suffit d'une grille de Booléens pour savoir où se trouve la nourriture, et vérifiez que contre la grille qui représente la tête de votre serpent à chaque mouvement du serpent . –

+0

Ouais, j'ai supposé en premier lieu que les objets pourraient être positionnés arbitrairement, pas de mouvement contraint à une grille comme celle-ci. Je vote cette réponse sur la base du dernier commentaire d'Adam. – jhocking

1

Une autre façon d'éviter les tableaux est d'utiliser un sprite qui contient tous les aliments. Chaque sprite est une collection de lutins et donc un arbre. C'est ce que j'utilise pour la détection de coup: 1 sprite spécial ne contient que des ennemis/de la nourriture. Courir à travers tous les enfants et vous n'avez même pas besoin de vérifier les types d'entre eux. Jetez-les si nécessaire.

// begin 
var foodCollection: Sprite = new Sprite(); 

// time passes, food is added 
foodCollection.addChild(food); 

// hit test 
for (var i:int = 0; i < foodCollection.NumChildren; i++) 
{ 
    var food: Sprite = foodCollection.getChildAt(i); 
    // test 
}