基本上,我想做的是创建一个不使用图块的小平台游戏,所以我必须手动做很多事情。我做得很好,减去了过去导致我遇到问题的碰撞检测。当前的问题是某些平台对象(您将看到)拒绝正常工作,而其他平台对象则没有问题。
我大部分工作都是事前进行的,只是在我增加了摩擦力和重力之后,它才开始花费很多时间。
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上进行此操作,它将更好地展示它。另一个问题是,当您离开左侧平台(麻烦制造者)时,您最终消失在地板上了,我认为这是由错误的检测引起的。
我的最终目标是将碰撞检测固定在接近完美的水平,因为它无需预测接下来几帧的位置就可以达到。我真的不想更改我的对象创建技术,因为我希望使它尽可能短。感谢您抽出宝贵的时间阅读此内容。
答案 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
还有一些问题,但是我已经没时间了,我想您也许可以自己解决这些问题。例如,当玩家与左边的某个东西碰撞时,它被解释为处于地面。这样它们就可以卡在墙上。