这是我的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) ;
}
}
答案 0 :(得分:2)
也许这里有一些事情可以开始:http://jsfiddle.net/d247V/3/
我更新了跳转,默认跳转为80(高到足以进入下一个平台),然后在keydown.up上我用当前ball.y位置+默认跳转
我认为虽然问题在于你是如何跟踪球在空中的,但是当发现碰撞时,球在技术上已不再在空中,但你没有任何说法,所以下面的代码基本上剪断了@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
找到它们。
答案 1 :(得分:0)
看起来您的碰撞检测效果非常好。 它的游戏循环有一些问题。 你不应该对按键进行碰撞检测,因为这只会触发一次。当球在空中时,你需要一直检查碰撞。 像这样:
... } 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;
}
}
}
使用他的代码,你可以跳上第一个平台。 (另请注意,我改变了ball.y定位)。
但仍存在一些问题:
也许你应该延迟碰撞检测,直到球获得一些高度来逃避碰撞检测。 我更新你的小提琴并将其转换为plunker(使用firebug你可以在这里更好地调试功能)Play with me!
不是一个完美的答案,但我希望这会对你有帮助。