您好我正在试验Box2dWeb,并使用自上而下的汽车游戏。
当我试图控制汽车时,我的问题就出现了,所以它一开始只会向前移动。为简单起见,我不想使用轮子,只需将力施加到汽车上(一个盒子)。
对于控件我创建了一个函数,但由于某种原因它没有被调用...这就是我需要指针或建议的地方。 (对象的创建和放置工作正常)
以下是代码的一部分:
var GlobalVar={ }
var KEY = {
UP: 87,//W
DOWN: 83,//s
LEFT: 65,//A
RIGHT: 68//D
}
GlobalVar.pressedKeys = [];//an array to remember which key is pressed or not
$(function(){
$(document).keydown(function(e){
GlobalVar.pressedKeys[e.keyCode] = true;
});
$(document).keyup(function(e){
GlobalVar.pressedKeys[e.keyCode] = false;
});
Rendering();
PlaceStuff(GlobalVar.currentLevel);//placing stuff, like car and boundaries/walls
moveCar();
});
function moveCar(){
if (GlobalVar.pressedKeys[KEY.UP]){
var force = new b2Vec2(0, -10000000);
GlobalVar.car.ApplyForce(force, GlobalVar.car.GetWorldCenter());
}
}
答案 0 :(得分:1)
看起来moveCar
函数不会被多次调用。
您应该执行以下操作:
function moveCar(){
if (GlobalVar.pressedKeys[KEY.UP]){
var force = new b2Vec2(0, -10000000);
GlobalVar.car.ApplyForce(force, GlobalVar.car.GetWorldCenter());
}
requestAnimationFrame(moveCar);
}
您可能还想添加修改器以根据帧速率修改添加的力量:
then = Date.now();
function moveCar(){
var now = Date.now();
var modifier = now - then; // Make modifier the time in milliseconds it took since moveCar was last executed.
then = now;
if (GlobalVar.pressedKeys[KEY.UP]){
var force = new b2Vec2(0, -10000000);
GlobalVar.car.ApplyForce(force * modifier, GlobalVar.car.GetWorldCenter());
}
requestAnimationFrame(moveCar);
}
这将确保汽车在较慢的系统上移动速度较慢。
如果您还希望多次执行Rendering()
函数,您可能还需要创建另一个尽可能经常调用的函数并调用另外两个函数。
then = Date.now();
function moveCar(modifier){
if (GlobalVar.pressedKeys[KEY.UP]){
var force = new b2Vec2(0, -10000000);
GlobalVar.car.ApplyForce(force * modifier, GlobalVar.car.GetWorldCenter());
}
}
function update() {
var now = Date.now();
var modifier = now - then; // Make modifier the time in milliseconds it took since moveCar was last executed.
then = now;
moveCar(modifier);
Rendering();
requestAnimationFrame(update);
}
答案 1 :(得分:0)
正如评论中指出的那样,您只需拨打moveCall
一次,但您可能希望在每次按键后都这样做:
$(document).on('keydown keyup', function(e){
GlobalVar.pressedKeys[e.keyCode] = true;
moveCar();
});