2011-08-13 198 views
6

我想在JavaScript中做一个蛇的游戏,但我正在努力与碰撞检测。到目前为止,我已经尝试了各种方法,但是在绝望中,已经解决了存储每个帧的所有位置,然后在动画下一个之前检查是否有任何重复。不幸的是,这种方法尚未证明是成功的。Javascript碰撞检测

也许这是由于对JS如何对待数组的误解。有一段时间我正在使用if(x in y),但从我可以告诉,如果完全相同的对象是在一个数组中返回。

下面是现场演示:http://jsfiddle.net/AScYw/2/

下面是代码更容易阅读:http://pastebin.com/ygj73me6

有问题的代码是在蛇的对象,作为函数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

这个游戏肯定很容易与碰撞检测禁用! – bgw

+0

@PiPeep是啊不是很棒?! – danem

回答

5

你在这里的功能需要一点工作,它可能会解决你的问题。

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件事情是错误的。

  1. 您正在退出循环的第一次比较。你会想做一些事情,如果(重叠的东西)返回true,然后在两个循环之外返回false如果你成功通过
  2. 你会想要确保z segment!= q segment,否则你将永远有一个碰撞

看起来很酷。让我们看看马里奥下一步;)

+0

我不确定我是否理解你的第一点,你是什么意思,我已经退出了循环?并且不会在'z + 1'处启动q,以确保它们不会相同?谢谢您的帮助!我不确定我是否准备重拍马里奥。 D:也许俄罗斯方块第一。 – danem

+0

你的return语句在循环中第一次被调用,所以你最终只能检查一个段。 – thedaian

+0

@thedaian你的意思是它退出循环,不管它是否返回true?我已经更改了代码,以便在传递条件后调用返回值,但现在总是返回true。 – danem