基本上我想做的是创建一个不使用图 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/