没有墙壁时对墙壁上的敌人进行碰撞检测

问题描述

在遵循了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,并且仅在反转时从未更改)。

解决方法

它是在不久后转向墙壁还是被卡住并快速左右闪烁?两者都可能涉及碰撞点更新不好。

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

另一个原因可能是精灵的原点,它确定xy出现在哪个位置,以及精灵通过旋转与墙自身碰撞。请记住,原点位于其防碰撞蒙版的中心,以避免卡在墙上。

编辑:另一种可能性:碰撞点仍在精灵内部。 为此,您还可以尝试使用使碰撞点远离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; 

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...