这是我的jsfiddle:http://jsfiddle.net/seekpunk/whz44/17/
当球到达一个块时,您可以在我的JSfiddle中看到跳跃功能无法正常工作。我知道我缺少我用来使球跳跃的算法中的某些东西,但我无法弄清楚我感谢您的帮助
if (InAir) {
if (InAir == 1) {
if (ball.y > jumpMaxHeight) {
ball.y -= gravity;
} else {
InAir = 2;
}
}
if (InAir == 2) {
if (ball.y < 390) {
ball.y += gravity;
} else {
ball.y = 390;
InAir = false;
ball.color = "black";
}
}
} else if (keydown.up && !InAir) {
InAir = 1;
ball.color = "#4285F4";
}
for (var j = 0; j < Blocks.collection.length; j++) {
if (Collision(ball, Blocks.collection[j])) {
//console.log("collision");
ball.y = (Blocks.collection[j].blockY - ball.radius) ;
}
}
也许这是:http://jsfiddle.net/d247v/3/
我更新了跳跃以使默认跳跃为80(足够高到达下一个平台),然后在keydown上。
我认为问题是您如何跟踪球在空中是否在空中,当检测到碰撞时,从技术上讲,球不再在空中,但是您没有这样说的话,请参见在基本上剪切的代码基本上是@mainguy说的,但经过稍作修改,以免重新分配球。
if( InAir )
{
for (var j = 0; j < Blocks.collection.length; j++) {
if (Collision(ball, Blocks.collection[j])) {
//console.log("collision");
var calc = (Blocks.collection[j].blockY - ball.radius);
if( ball.y != calc ) {
ball.y = calc;
ball.color = "black";
InAir = 0;
}
}
}
}
我的小提琴虽然打破了代码的重力部分,因为您现在还需要知道圆的X是否通过了矩形的X屏障,如果没有,则掉落。因此,这绝不是一个完整的解决方案,但是如果您从障碍物中跳跃并向右或向左走,则重力过程只要不存在碰撞,就可以按预期工作,您将掉落到底部。还有其他一些调整,但我认为您可以通过我添加的零件旁边的评论//Tweaked
找到它们。
似乎您的碰撞检测工作得很好。它的Gameloop有一些问题。您不应该在键盘上进行碰撞检测,因为这只会发射一次。当球在空中时,您需要一直检查是否有碰撞。喜欢:
... } else if (keydown.up && !InAir) {
InAir = 1;
ball.color = "#4285F4";
}
if (InAir){
for (var j = 0; j < Blocks.collection.length; j++) {
if (Collision(ball, Blocks.collection[j])) {
//console.log("collision");
ball.y = (Blocks.collection[j].blockY - ball.radius) ;
InAir=false;
}
}
}
使用他的代码,您可以跳上第一个插图。(还请注意我更改了球。
但仍然存在一些问题:
- 球不能离开脚下,因为一旦他空降了,他就会与他躺在踢进来的脚下碰撞。
- 如果您将球向左或向右移动到板岩边框上,如果他再次开始掉下来,而不是悬停在空中,那将会更加有趣。(相信我,我玩了一些游戏)。
也许您应该延迟碰撞检测,直到球获得一定的高度以逃避碰撞检测。我更新您的小提琴并将其转换为Plunker(使用Firebug,您在这里可以更好地调试功能)与我一起玩!
不是一个完美的答案,但我希望这对您有帮助。