2014-07-08 74 views
2

您好,我正在試驗Box2dWeb,並使用自頂向下的汽車遊戲。無法在Javascript中調用函數

當我試圖控制汽車時,出現問題,所以它會移動,起初只會向前移動。爲了簡單起見,我不想使用輪子,只需將力施加到汽車(一個盒子)上。

對於控件,我做了一個函數,但因爲它沒有被調用...這就是我需要一個指針或建議的地方。 (對象的創建和安置工作得很好)

下面是部分代碼:

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()); 
    } 
} 
+1

'moveCar'只在程序啓動時被調用一次。基本上,你永遠不會檢查汽車啓動後是否應該移動。 – gpgekko

回答

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); 
} 
0

正如評論指出的那樣,你只能叫moveCall一次,但你可能希望每個鍵後做按:

$(document).on('keydown keyup', function(e){ 
    GlobalVar.pressedKeys[e.keyCode] = true; 
    moveCar(); 
});