问题描述
在遵循了YouTube上Shaun Spalding的Gamemaker 2 Platformer教程之后,我试图在一个简单的Platformer游戏上开发基本的敌人AI。我的代码与本教程中的代码完全相同,但是由于某种原因,当我的敌人检测到与墙的碰撞时,他会按原样转身,然后检测到没有碰撞的另一处碰撞,导致他再次转身。 / p>
这是我的代码:
// Horizontal collision
if (place_meeting(x+hsp,y,oWall)) {
show_debug_message(hsp)
while (!place_meeting(x+sign(hsp),oWall)) {
x += sign(hsp); // slows down I think
}
hsp = -hsp;
}
x += hsp;
-hsp部分是他转过身的地方。无论如何,即使hsp的值反转了,他也会立即检测到另一个碰撞。谁能指出我为什么会这样?
(hsp的值初始化为3,并且仅在反转时从未更改)。
解决方法
它是在不久后转向墙壁还是被卡住并快速左右闪烁?两者都可能涉及碰撞点更新不好。
当我遇到碰撞问题时,我将使用十字准线精灵,并将其绘制在应该碰撞的位置。这样,我就可以看到“碰撞点”。
另一个原因可能是精灵的原点,它确定x
和y
出现在哪个位置,以及精灵通过旋转与墙自身碰撞。请记住,原点位于其防碰撞蒙版的中心,以避免卡在墙上。
编辑:另一种可能性:碰撞点仍在精灵内部。 为此,您还可以尝试使用使碰撞点远离Sprite碰撞的偏移量,但是要使其正常工作,您需要使反方向远离水平速度。像这样:
// 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),oWall)) {
x += sign(collisionPoint); // slows down I think
}
_dir = -_dir
}
x += hsp * _dir;