如何检测2D平台游戏中被压扁的玩家?


19

我正在检查碰撞中是否有平台角色,如#1所示。红点是被检查的像素,灰线指示它们所属的轴。我喜欢以这种方式检查碰撞(相对于边界框)得到的结果。除了一个问题:挤压检测,其他所有功能都按我的意愿运行。

在以下图像中,浅蓝色框表示地面,橙色框表示对象,箭头表示移动方向。

检测玩家何时被压倒的简单解决方案是查看相对两侧的碰撞点是否都在触发。如果是这样,则说明玩家被压碎了。在#2中,您可以看到正常的暗恋场景。播放器已接地,顶部碰撞点与下落的物体相交。这触发了暗恋。

#3、4和5存在有问题的场景。在#3中,玩家正在朝向上移动的物体移动。右侧碰撞点撞击物体,导致碰撞并使玩家停止。

现在,如果对象继续向上移动并且玩家继续向右移动(如#4所示),则该对象清除玩家右侧碰撞点,然后玩家向右移动。但是现在,这样做的目的是使对象与顶部碰撞点相交,从而导致不必要的垂直挤压。

#5中显示了类似的情况。两个物体相距足够远,可以清除底部碰撞点,从而允许玩家跌倒,但不能超过允许侧面碰撞点清除的程度,从而导致不必要的水平挤压。

我一直在努力寻找解决方案,但是我提出的任何方案都没有特别有效,所以我想知道是否有人对解决这些问题有想法或见识。

在此处输入图片说明

为了消除一些混淆,红色碰撞点将位于精灵内,而灰线仅用于表示每个碰撞点的相关轴。例如,如果角色的精灵是一个简单的绿色方块,则拐点将如下所示:

在此处输入图片说明

Answers:


34

我认为您必须考虑包装盒的运动。也就是说,只有在盒子向玩家移动时才暗恋。

这与平台游戏中的其他问题类似,在平台游戏中,移动非常重要。例如,对于可以从下方跳入并跳入的平台,如果玩家向上移动,请勿检查碰撞。

因此,只有当方块向下移动时,方块才能从上方挤压玩家;仅当块向上移动时才从下方;仅当块向右移动时才从左侧开始,依此类推。


13
+1请考虑该方块在这里起作用,而不是玩家。因此,如果您检查盒子是否在压碎玩家,而不是在检查是否压碎了玩家,则问题应该更容易解决
Niels

块不动怎么办?我意识到现在我在#5的方块上放了箭头,但是那是两个固定的方块。
IanLarson

如果您确定固定块不应该压碎,请确保播放器没有卡住并且可以移开。
congusbongus

恩,我讨厌被两个实际上彼此远离的物体所压碎,只是因为我使它达到了像素和帧完美,并且开发人员很懒。
犀牛

9

将“碰撞测试”点放在图像#1所示的灰色框中-即仅当您检测到那里的一个像素命中时才杀死玩家。


1
您是说附加挤压检查点位于碰撞点范围内吗?我看到的问题是,在对象甚至有机会到达内部挤压检查点之前,“触发”其中一个碰撞点时,每个轴都会发生碰撞分辨率。
IanLarson

6

作为一个与80年代平台游戏一起成长的人,我的第一句话是接触点必须完全在精灵上,而不是精灵之外的任何地方。当武器/粉碎者/敌人离您的角色几像素远时,没有什么比垂死挣扎更使人沮丧的了,而这种经历正是阻止人们玩耍的原因。

考虑到这一点,针对水平和垂直碰撞分别设置点的想法是行不通的。因此,您的案例3和5不存在。

如前所述,对于碰撞检测,您需要考虑运动方向,并且要考虑两个运动轴。如果破碎机掉落,玩家将无法向前走-它的作用就像一堵墙。因此,在水平和垂直检测点位于同一位置的情况下,即使在向混合中添加移动方向之前也无法获得案例4。

向上移动的破碎机增加了额外的复杂性。如果速度如此之快以至于玩家没有机会逃脱,那就OK。但是,如果速度变慢,玩家将有望能够越过上升的平台并跳到另一侧。播放器精灵在破碎机上向上抬起,并在天花板上检测到破碎。


3
次要点-您不知道他的精灵是什么样子。就我们所知,它可能完全如上图所示,因此情况3和5可能完全有效。
亚历克斯

1
亚历克斯是对的。我进行了修改以弄清楚。我同意没有什么比不定的碰撞箱更糟糕的了。我想我理解您关于不在不同轴上使用单独点的观点。如果我这样做,那会将上面的示例从八个点变为四个点,每个角都一个,对吗?实际上,我已经考虑到这一点进行了一些测试(结果不理想),但是我对此非常犹豫,因为将角落“分开”可以实现我正在寻找的完美表现。这些确实是我遇到的唯一问题场景。
IanLarson

0

您可以使对象比地面“硬”,这意味着,假设发生碰撞,玩家将被“推入”地面,而不是被“推入”移动物体。

假设玩家无法将自己“推入”物体或地面。


0

如果您可以检测到对象的重叠而不必等待它们的显示,则一种简单的方法是独立处理播放器和其他对象的运动,一次一个像素,之后进行单独的碰撞检查。如果播放器自由移动,并且由于这种运动而与对象碰撞,请后退。如果由于对象的运动而与对象发生碰撞,请检查播放器是否可以沿与该对象相同的方向移动。如果是这样,请移动播放器。如果不是,请适当地处理“挤压”情况(根据接触情况,损坏或杀死玩家和/或向后移动碰撞的物体)。

顺便说一句,如果只有有限数量的形状组合可以碰撞,则预先计算“碰撞检测”位图可能会很有用,这样,如果第一个子图中的像素设置为偏移(x1,y1),第二个子图中的像素设置为在秒的偏移量(x2,y2)处,将在碰撞图中设置偏移量(x1-x2,y1-y2)的像素。这样的预先计算出的碰撞图将使得有可能通过检查碰撞图中的单个像素的状态来检测两个小精灵之间的碰撞。


0

需要两个物体才能压碎玩家。暗恋检测应该检查播放器是否在两个对象之间,它们之间的距离等于播放器的大小,并且距离减小。


0

我发现下一个到目前为止正在工作。它不需要有关破碎机运动的“外部”信息,并且可以解决误报问题。当检测到误报时,将其视为冲突(这就是实际情况):

这个想法是:当我们实际上关心角色是否在移动时,为什么要检查破碎机是否在移动。两者都可以回答是由于角色自身移动导致的暗恋是误报还是由于破碎者物体的移动是真正的暗恋。

如果角色正在移动并被压扁(传入帧的相对侧上的碰撞),请再次检查最后一帧/迭代坐标是否被压扁:

  1. 如果未再次确认,则归因于角色自身的移动,因此角色应像碰撞一样返回到最后一帧/迭代坐标

  2. 如果第二次确认粉碎,则继续粉碎。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.