没有墙壁时的敌人与墙壁的碰撞检测

Posted

技术标签:

【中文标题】没有墙壁时的敌人与墙壁的碰撞检测【英文标题】:Collision detection on enemy with wall when there is none 【发布时间】:2020-09-29 21:14:58 【问题描述】:

在学习了 YouTube 上 Shaun Spalding 的游戏制作者 2 平台游戏教程之后,我正在尝试在一个简单的平台游戏游戏中开发基本的敌人 AI。我的代码与教程中的代码完全相同,但由于某种原因,当我的敌人检测到与墙壁发生碰撞时,他会按照他的假设转身,然后检测到另一个没有碰撞的地方,导致他再次转身。

这是我的代码:

// Horizontal collision
if (place_meeting(x+hsp, y, oWall)) 
    show_debug_message(hsp)
    while (!place_meeting(x+sign(hsp), y, oWall)) 
        x += sign(hsp); // slows down I think
    
    hsp = -hsp;


x += hsp; 

-hsp 部分是他转身的地方。不知何故,他一这样做就检测到了另一次碰撞,即使 hsp 的值是倒置的。谁能指出我为什么会发生这种情况?

(hsp 的值在 3 处初始化,仅在反转时从未改变)。

【问题讨论】:

【参考方案1】:

是片刻后转回墙壁,还是卡住并左右快速闪烁?两者都可能涉及碰撞点没有很好地更新。

当我遇到碰撞问题时,我会使用十字准线精灵,并将其绘制在应该碰撞的相同位置。这样我就可以看到“碰撞点”。

另一个原因可能是精灵的原点,它决定了xy 出现在哪个位置,并且精灵通过转动与墙壁本身发生碰撞。请记住,原点位于其碰撞蒙版的中心,以免卡在墙上。

编辑:另一种可能性:碰撞点仍在精灵内部进行检查。 为此,您还可以尝试使用使碰撞点远离精灵碰撞的偏移量,但要让它发挥作用,您需要保持反方向远离水平速度。像这样的:

// Horizontal collision
_offset = 15; //moves the collision point away to check in front of the sprite. value depends on the size of the sprite.
_dir = 1; //the direction, should only be 1 or -1
          //hsp should no longer be used to inverse, use a new variable (like _dir) instead
collisionPoint = (hsp + offset) * _dir;
if (place_meeting(x + collisionPoint , y, oWall)) 
    show_debug_message(collisionPoint)
    while (!place_meeting(x+sign(collisionPoint), y, oWall)) 
        x += sign(collisionPoint); // slows down I think
    
    _dir = -_dir


x += hsp * _dir; 

【讨论】:

谢谢!我认为这可能与起源有关,但我弄乱了它,可悲的是它似乎什么也没做。我会考虑你提到的其他事情!我现在通过增加敌人的步行速度来让它工作,但显然这不是最好的解决方案。 我认为步行速度 (hsp) 也可能是问题所在,因为它看起来只有 3 个像素。你的精灵碰撞可能比这更大。我将对此展开我的回答,请查看编辑帖子。

以上是关于没有墙壁时的敌人与墙壁的碰撞检测的主要内容,如果未能解决你的问题,请参考以下文章

使两个物理对象不碰撞,但在 Unity 中检测碰撞

如何检测我在 OnCollisionExit2D() 上退出的对象的哪一侧

游戏的 AS3 碰撞响应

UE4 C++实现近战攻击,精准检测与碰撞检测

四边形OpenGL之间的碰撞检测

opengl中的有界框碰撞检测