冲突检测的问题是JavaScript

时间:2019-04-26 19:19:38

标签: javascript html css

基本上,我想做的是创建一个不使用图块的小平台游戏,所以我必须手动做很多事情。我做得很好,减去了过去导致我遇到问题的碰撞检测。当前的问题是某些平台对象(您将看到)拒绝正常工作,而其他平台对象则没有问题。

我大部分工作都是事前进行的,只是在我增加了摩擦力和重力之后,它才开始花费很多时间。

handle_all_collisions: function(player) {
    if (player.position.x < 0) {
        player.position.x = 0;
    } else if (player.position.x + player.bounds.x > canvas.width) {
        player.position.x = canvas.width - player.bounds.x;
    }

    if (player.position.y < 0) {
        player.position.y = 0;
    } else if (player.position.y + player.bounds.y > canvas.height) {
        global.world.ground = true;
        player.position.y = canvas.height - player.bounds.y;
    } else {
        for (var i = 0; i < positions.length; i++) {
            if (collisions.is_colliding(player, obstacles[i])) {
                global.world.ground = true;
            } else {
                global.world.ground = false;
            }
        }
    }

    for (var i = 0; i < positions.length; i++) {
        if (collisions.is_colliding(player, obstacles[i])) {
            collisions.resolve_collision(player, obstacles[i]);
        } else {
            player.collided.up = false;
            player.collided.down = false;
            player.collided.left = false;
            player.collided.right = false;
        }
    }
}

这可以处理所有冲突,以便以后可以使用某些信息。您会注意到我那里有一个global.world.ground = true/false,用于更改玩家的y位置。如果在某些时候未将其设置为true以允许跳跃,这将不是问题。我一直在repl.it上进行此操作,它将更好地展示它。另一个问题是,当您离开左侧平台(麻烦制造者)时,您最终消失在地板上了,我认为这是由错误的检测引起的。

我的最终目标是将碰撞检测固定在接近完美的水平,因为它无需预测接下来几帧的位置就可以达到。我真的不想更改我的对象创建技术,因为我希望使它尽可能短。感谢您抽出宝贵的时间阅读此内容。

1 个答案:

答案 0 :(得分:0)

您最大的问题是这种情况:

for (var i = 0; i < positions.length; i++) {
    if (collisions.is_colliding(player, obstacles[i])) {
        global.world.ground = true;
    } else {
        global.world.ground = false;
    }
}

这基本上只是测试玩家是否正在与最后一个障碍物碰撞,因为global.world.ground在每次迭代中都会被覆盖。您应将global.world.ground = false;移到函数顶部,因为您想测试玩家是否与任何障碍物发生碰撞。

您的平台的行为有所不同,因为游戏仅将正确的平台(您最后添加的平台)识别为可站立的平台。如果您跳到左侧平台,则稍后会在功能resolve_collision中使用功能handle_all_collisions将您推出左侧平台。

您错过的第二件事是当玩家与某物体碰撞时重置其速度。在函数resolve_collision中,只要在x轴上发生碰撞,就应该设置player.velocity.x = 0;如果在y轴上发生碰撞,则应设置player.velocity.y = 0。因此,当您站在左侧平台上时,确实会被向上推出,但速度并没有复位,因此在后台,玩家会累积所有重力加速度,并在一段时间后由于碰撞检测而掉落通过平台无法应付这些速度。

当您站在地面障碍物(不是最后一个障碍物)上时,几乎是同一回事。它也没有被认为是地面,但是由于玩家速度的提高,他们很快就被注册为站在画布的真实底部。这就是为什么您降落在地面障碍物上后一两秒钟都无法跳动。

我已在您的副本的这份副本中修复了这些问题:https://repl.it/repls/AfraidNaiveQuote

还有一些问题,但是我已经没时间了,我想您也许可以自己解决这些问题。例如,当玩家与左边的某个东西碰撞时,它被解释为处于地面。这样它们就可以卡在墙上。