繁体   English   中英

冲突检测的问题是JavaScript

[英]Issues with collision detection is JavaScript

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

我之前大部分工作都是在此工作,而只是在我增加了摩擦力和重力之后,它才开始占用大量时间。

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上这样做,它将更好地展示它。 另一个问题是,当您离开左侧平台(麻烦制造者)时,您最终消失在地板上,我认为这是由错误的检测引起的。

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

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

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; 功能顶部,因为您想测试玩家是否正在与任何障碍物发生碰撞。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM