Flick Ninjas Dev Part 4 2D游戏中基于像素的碰撞检测

发布时间:2019-08-13 11:58

Flick Ninjas今晚在iTunes App Store上批准发售!为了庆祝,我想我会在Flick Ninjas中实现的碰撞检测和响应系统中提供一些内部信息。查看我的系列文章的第3部分,了解为什么我认为Apple在帮助开发者方面仍然领先于Android。

在为Flick Ninjas设计碰撞检测系统时,我最初确定我会使用一个简单的基于图块的系统,可能有45度角,以便进行测量。我实际上用这种方式实现了游戏的原型,以证明控制方案很有趣。但是当设计游戏的视觉外观时,我觉得方形和45度角的根本不起作用。我真的很想拥有任意级别的设计。我寻找像Worms这样的游戏来获取灵感,并在碰撞检测时开始在网上搜索想法。

我发现了一些文章,解释了像Worms和Scorched earth这样的游戏如何进行碰撞检测,但很快发现这些方法还不够。在这些类型的游戏中,他们只需测试蠕虫底部的单个像素。当它与像素重叠时,它们只需将蠕虫一次向上移动一个像素,直到它不再重叠为止。这称为碰撞检测和响应。检测部分只是查看是否存在重叠,响应部分涉及移动实体直到它不再重叠。

这种方法的弱点很快就显现出来了。当遇到侧面和顶部碰撞时,这种技术不够智能。它只能真正确定响应会将实体移动太多像素高,从而阻止向前进展,但它无法告诉我它已经移动到墙壁的距离,因为你一次只能在一个像素上移动一个像素蠕虫。当我撞墙,地板或天花板或三者的任意组合时,根本没有足够的信息告诉我需要知道什么。我需要一种新的方法。

首先,我需要一种碰撞检测技术。我决定测试与我的实体重叠的每个像素而不是单个像素,这样我就能看到重叠发生的地方。我创建了基本上是32个DWORD值的图块,其中每个位表示像素是打开还是关闭。然后我会看到实体如何通过将DWORDS加在一起来重叠世界瓦片。这意味着我只需要每帧使用按位运算符测试32个值。挺便宜的! ?这种方法适用于碰撞检测。我确切知道我何时重叠以及哪些像素重叠。从这里开始,我假设很容易根据每个方向上重叠的像素数确定如何响应。

可悲的是我错了。确定像素重叠是否应该向上,向下,向左或向右移动我的实体是非常重要的。我需要一种方法来隔离实体的每一面与另一面,以便我知道我应该在给定方向上移动多少像素。经过几天再次击败我的问题后,我发现了一个有趣的方法,如下图所示:

我将这种方法称为“十字掩”。基本上我创建了一个新的32 DWORD图块,它只标记一些像素作为碰撞体积的一部分。然后,我使用世界瓷砖进行相同的ANDing过程,并仅检查前8个DWORDS,底部8个底部,中间16个作为两侧。然后我需要说出左右之间的区别。我这样做只是测试值是否大于或小于表示掩内部的值。

这种方法几乎可以满足我想要的一切。我可以告诉我需要移动多少像素,以及一次最多两个方向的方向。这是这种方法唯一垮台的地方。我无法同时测试顶部和底部,或左右两侧。我试图优先考虑某些方面等等,但无济于事。我可能会再次解决这个问题,但要解决这个问题,我只是不允许级别中小于32像素宽的间隙。如果样式需要它,我只需创建一个特殊实体,阻止进一步进入该级别的这些部分。

如果您对此方法有任何疑问,请在评论中告诉我们。查看我的个人发展博客,了解我的官方预告片和我的新推出活动系列预告片。另外,如果您有这种倾向,现在只需0.99美元即可免费下载Flick Ninjas?


与Flick Ninjas Dev Part 4 2D游戏中基于像素的碰撞检测相关的文章: