2013-05-29 4 views
0

J'ai fait un jeu de serpents mais quand par exemple je vais à droite et je clique sur & en même temps que je pense qu'il est entré en collision avec lui-même et qu'il est mort.Canvas snake bug event

le code pour le concours complet est:

$(document).keydown(function(e){ 

var key = e.which; 

if(key == "37" && dir!= "right") dir = "left"; 
else if (key == "38" && dir != "down") dir = "up"; 
else if (key == "39" && dir != "left") dir = "right"; 
else if (key == "40" && dir != "up") dir = "down"; 



}) 

J'ai ce code dans une méthode de peinture qui obtient repeint tous les 60ms

var headX = snakeArray[0].x; 
var headY = snakeArray[0].y; 

//directions 
if (dir == "right") headX++; 
else if (dir == "left") headX--; 
if(dir =="up") headY--; 
else if (dir == "down") headY++; 


//game over clause 
if (headX == -1 || headX == w/cellSize || headY == -1 || headY == h/cellSize ||  CheckCollision(headX,headY, snakeArray)) 
{ 
//restart game 
init(); 
return; 
} 

Pour tester le jeu vous-même: http://www.taffatech.com/Snake.html

Répondre

0

Ce n'est pas un bug.

Le délai entre chaque trame est si important que vous pouvez facilement générer deux appels de fonction de touche dans une trame.

-> Cela provoque que votre serpent passe d'abord (par exemple) à droite, puis il appuie sur une touche "enfoncée", change de direction vers "bas" et obtient une pression "gauche" avant de se déplacer. Ainsi votre serpent "tourne 180 degrés" dans un cadre et se mange littéralement.

Vous devez vous assurer d'accepter une seule nouvelle direction dans une image et (pour améliorer la jouabilité) mettre en file d'attente les autres touches pressées pour calculer leurs effets dans les images suivantes.

+0

Savez-vous quelle serait la meilleure façon de procéder? – bob

+0

Je prendrais une liste appelée "keyqueue" ou quelque chose et ajouterais un élément qui maintient la direction pressée chaque fois qu'un bouton est pressé. Ensuite, à chaque rendu je libérerais le premier élément de la liste (si la liste n'est pas vide) et ferais la chose avec, que vous avez fait dans la fonction de pression de touche. C'est tout. – TheOneAndOnly

+0

Merci, je n'ai pas fait ce que vous avez dit mais à la place j'ai utilisé une variable booléenne qui est fausse ou vraie basée sur si vous pouvez déplacer et ne laisse que 1 déplacer par image. Merci ça marche! – bob