2014-01-18 169 views
2

与我的一个朋友一起,我们正在创建一个多人蛇游戏。我们都是使用JavaScript的初学者,所以这对我们来说是一个真正的挑战。 到目前为止,我已经成功地创建这样的:碰撞检测简单的蛇游戏

http://jsfiddle.net/tbmluijten/RG76t/3/

这是碰撞检测代码,我到目前为止有:

Snake.prototype.collision = function (x, y, array) { 
     for(var i = 0; i < Snake.length; i++){ 
      if(Snake.pieces[0].x == x && Snake.pieces[0].y == y) 
      return true; 
    } 
    return false; 
    }; 

我的问题是与蛇本身碰撞。我无法弄清楚我做错了什么。请注意,我正在寻找与蛇的碰撞,而不是与边界的碰撞,因为我们打算在这里进行循环。 :-)

回答

2

简短的回答是 - 你根本不检查碰撞!

工作冲突:http://jsfiddle.net/RG76t/10/

说明:

起初,你需要把碰撞方法在游戏循环功能。

// line 32 
if (game.snakes.length !== 0) { 
    for (i = 0; i < game.snakes.length; i++) { 
     var s = game.snakes[i]; 
     s.paint(ctx, game); 

     // Check for collision. 
     if (s.collision()) { 
      // Do something, if the collision happens. 
      alert('collision'); 
     } 
    } 
} 

然后在碰撞方法检查第一片与任何其他冲突。循环从第4张开始,因为蛇的头部不能真正碰到它的“脖子”(第2和第3张)。

Snake.prototype.collision = function() { 
    // Loop the snake pieces from the 4th one. 
    for(var i = 3; i < this.length; i++){ 
     // Check if this piece collides with the first piece. 
     if(
      this.pieces[0].x === this.pieces[i].x && 
      this.pieces[0].y === this.pieces[i].y 
     ) { 
      return true; // collision 
     } 
    } 
    return false; 
}; 

还要注意的是Snake.lengthSnake.pieces[i]更改为this.lengththis.pieces[i]。关键字this指的是您调用碰撞方法的Snake实例。当您在这段代码中使用Snake时,您正在检查构造函数的属性。

+0

非常感谢!这帮了很多!你可能有任何想法如何创建一个碰撞脚本,让我和我的朋友检查两个不同的snaked之间的碰撞?它将成为一个带有node.js的多人蛇游戏,每个用户都会得到一条可以与其自身以及其他用户相撞的单个蛇。这很难测试,但也许你可以帮助我们一点点。 – Tbmluijten

+0

非常感谢您的帮助!我明白我做错了什么!它确实有很大的帮助:D – Tbmluijten

+1

既然你将蛇存储在game.snakes对象中,你可以检查蛇的“头部”x/y坐标与其他蛇的棋子,循环game.snakes [i] .pieces。这是最简单但不是性能最友好的解决方案。虽然,我想这个表演并不是蛇游戏的问题。 ;) –