2011-08-13 3 views
6

J'essaie de faire un jeu de snake en javascript, mais je suis aux prises avec la détection de collision. J'ai essayé différentes méthodes jusqu'à présent, mais en désespoir de cause, je me suis arrangé pour stocker toutes les positions des segments à chaque image puis vérifier s'il y a des doublons avant d'animer le suivant. Cette méthode n'a pas réussi non plus, malheureusement.Javascript Collision Detection

Peut-être est-ce dû à une mauvaise compréhension de la façon dont JS traite les tableaux. Pendant un certain temps, j'utilisais if(x in y) mais d'après ce que je peux dire, ça revient si le même objet est exactement dans un tableau.

Voici la démonstration en direct: http://jsfiddle.net/AScYw/2/

Voici le code plus facile à lire: http://pastebin.com/ygj73me6

Le code en question est l'objet de serpent, comme la fonction collide.

this.collide = function(){ 
      for(var z=0; z<this.positions.length-1; z++){ 
       for(var q=z+1; q<this.positions.length-1; q++){ 
        return this.positions[z][0] == this.positions[q][0] && this.positions[z][1] == this.positions[q][1]; 
       } 
      } 
+1

Ce jeu est facile avec la détection de collision désactivée! – bgw

+0

@PiPeep Ouais, c'est pas génial ?! – danem

Répondre

5

Votre fonction nécessite un peu de travail et peut résoudre votre problème.

this.collide = function(){ 
    for(var z=0; z<this.positions.length-1; z++){ 
    for(var q=z+1; q<this.positions.length-1; q++){ 
     return this.positions[z][0] == this.positions[q][0] && this.positions[z][1] == this.positions[q][1]; 
    } 
    } 
} 

2 choses sont fausses.

  1. Vous abandonnez la première comparaison. Vous voudrez faire quelque chose comme si (quelque chose se chevauche) retourner vrai alors en dehors des deux boucles retourner false si vous le faites avec succès
  2. Vous voulez vous assurer que le segment z segment = = q ou vous aurez toujours un collision

Cela semble cool. Permet de voir Mario prochain;)

+0

Je ne suis pas sûr si je comprends bien votre premier point, que voulez-vous dire que je sors de la boucle? Et ne pas initier q à 'z + 1' assure-t-il qu'ils ne seront pas les mêmes? Merci pour l'aide! Je ne sais pas si je suis prêt à refaire Mario. D: Peut-être tetris en premier. – danem

+0

Votre déclaration de retour est appelée la première fois dans la boucle, de sorte que vous ne finissez que la vérification d'un segment. – thedaian

+0

@thedaian vous voulez dire qu'il sort de la boucle indépendamment du fait qu'il retourne vrai? J'ai changé le code de sorte que le retour est appelé après qu'il a passé une condition, mais il retourne maintenant toujours vrai. – danem