17.3.2添加checkCollision方法
每次为贪吃蛇的头部设置一个新的位置的时候,都必须检查碰撞。碰撞检测在游戏机制中是一个很常见的步骤,往往也是游戏编程中较为复杂的一个方面。好在,在贪吃蛇游戏中,碰撞检测相对简单。
贪吃蛇游戏关注两种类型的问题:和墙的碰撞,以及和蛇自身的碰撞。如果贪吃蛇碰到了墙,就会发生和墙的碰撞。如果贪吃蛇头部翻转并碰到了自己的身体,就会发生和自身的碰撞。在游戏开始的时候,贪吃蛇太短了,无法碰到自己,但是在吃了一些苹果之后,它就有可能碰到自己。
以下是checkCollision方法:
检查和墙的碰撞
在❶处,创建了leftCollision变量并将其设置为head.col===0的值。如果贪吃蛇和左边的墙碰撞,也就是说,当它的列为0的时候,这个变量为true。类似的,下一行中的topCollision变量检查贪吃蛇的头部的行,看看它是否碰到上面的墙。
然后,通过检查头部的列值是否等于widthInBlocks-1来检查它是否和右边的墙碰撞。由于widthInBlocks设置为40,这会检查头部是否位于第39列,这和右边的墙对应,你可以回到图17-1查看这一点。然后,对bottomCollision做相同的事情,查看蛇的头部的row属性是否等于heingtInBlocks-1。
在❷处,使用‖(or)运算符检查leftCollision、topCollision、rightCollision或bottomCollision是否为true,判断贪吃蛇是否和墙碰撞。将布尔类型的结果保存到变量wallCollision中。
检查和自己的碰撞
为了判断贪吃蛇是否和自身碰撞,在❸处创建了一个名为selfCollision的变量,并且一开始将其设置为false。然后,在❹处,使用一个for循环来遍历蛇的所有身段,使用head.equal(this.segments[i])来确定新的头部是否和任何的一段处于相同的位置。头部和所有其他的段都是块,因此,可以使用为块对象定义的equal方法来看看它们是否位于相同的位置。如果发现贪吃蛇的任何一段与新的头部位于相同的位置,就知道蛇和自身发生了碰撞,可以将selfCollision设置为true(在❺处)。
最后,在❻处,返回wallCollision‖selfCollision,如果贪吃蛇和墙或者自身碰撞,它将会是true。
本站内容未经许可,禁止任何网站及个人进行转载。