在没有墙壁的情况下对敌人进行碰撞检测



在youtube上学习了Shaun Spalding的gamemaker 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,并且仅在反转时从未改变(。

是过了一会儿又回到墙上,还是卡住了,并迅速左右闪烁?两者都可能涉及到碰撞点没有很好地更新。

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

另一个原因可能是精灵的原点,它决定了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; 

最新更新