JavaScript 碰撞检测

6
我正在尝试用Javascript制作贪吃蛇游戏,但我在碰撞检测方面遇到了困难。到目前为止,我已经尝试了各种方法,但最终只能存储每个段的位置,然后在下一帧动画之前检查是否有任何重复。不幸的是,这种方法也没有成功。
也许这是由于我对JS如何处理数组的误解。有一段时间我使用了if(x in y),但据我所知,它返回的是数组中是否存在完全相同的对象。
这是实时演示:http://jsfiddle.net/AScYw/2/ 这是更易于阅读的代码:http://pastebin.com/ygj73me6 相关代码位于snake对象中的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
@PiPeep 是的,是不是很棒?! - danem
1个回答

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];
    }
  }
}

这里有两个问题。

  1. 你在第一个比较中退出了循环。你需要做的是,如果(某些事物重叠)返回true,然后在两个循环之外返回false,如果成功通过则
  2. 你需要确保z段!= q段,否则将始终发生碰撞

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


我不确定我是否完全理解你的第一点,你说的退出循环是什么意思?而且,在z+1处初始化q不是确保它们不会相同吗?感谢您的帮助!我不确定我是否已经准备好重新制作马里奥。D: 或许先做俄罗斯方块吧。 - danem
你的返回语句在循环第一次调用时被调用,所以最终只检查了一个片段。 - thedaian
@thedaian 你的意思是无论它返回true还是false都会退出循环吗?我已经更改了代码,使得在满足条件后才调用return,但现在它总是返回true。 - danem
@thedaian 啊!我想通了。在初始化函数中,我将两个路径段放在了一起。现在它正常工作了。 - danem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接