javascript - 碰撞检测的问题是 JavaScript

标签 javascript html css

基本上我想做的是创建一个不使用图 block 的小型平台游戏,所以我必须手工完成很多工作。我完全没问题,减去碰撞检测,这在过去给我带来了问题。当前的问题是某些平台对象(您会看到)拒绝正常工作,而其他平台对象没有问题。

我之前已经完成了大部分工作,只是在我添加了摩擦力和重力之后,它才开始把时间搞得一团糟。

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 将你推出。

您错过的第二件事是在玩家与某物发生碰撞时重置玩家的速度。在函数 resolve_collision 中,只要 x 轴上发生碰撞,您就应该设置 player.velocity.x = 0 并且 player.velocity.y = 0 如果碰撞发生在 y 轴上。所以当你站在左边的平台上时,你确实会被向上推出,但你的速度不会被重置,所以在后台,玩家会积累所有的重力加速度,并在一段时间后因为碰撞检测而被扔下平台无法处理这些速度。

当你站在地面障碍物(不是最后一个障碍物)上时,几乎是一回事。它也不会被识别为地面,但由于玩家速度的增加,他们会在片刻后被记录为站在 Canvas 的真实底部。这就是为什么你在降落到地面障碍物上后一两秒钟都不能跳的原因。

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

还有一些问题,但我的时间不多了,我想你也许可以自己解决它们。例如,当玩家与左侧的某物发生碰撞时,玩家会被解释为在地面上。所以它们可能会粘在墙上。

关于javascript - 碰撞检测的问题是 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55873768/

相关文章:

html - 使用 Flexbox 在 Angular 落对齐元素

javascript - 渲染之外的 DOM 操作

javascript - 如何让 2 个不同的对象对 javascript 中的同一个函数使用react

html - div在标题周围折叠

javascript - Ul/div 没有得到高度

javascript - Textfield allowBlank/Focus 和 invalid-cls 问题

javascript - 点击 Vue.js 组件后星星淡出

javascript - ajax发送动态创建的输入框的值

javascript - 将图像放在整个单元格中

javascript - 根据浏览器的屏幕分辨率更改 Logo 图像