2016-07-01 15 views
0

私はできる限り最善の問題を説明しようとします。 私はキーボードでパックマンを動かすパックマンゲームを持っています。パックマンはあらゆる方向に一定のユニットを動かします。私が以前に定義したマップに基づいてチェックします。 " - "は障害物です。敵、私は敵がランダムにキーを押すことなく敵を動かせたいと思うのですが、キーを押すとスピードコントロールが制御されますが、ランダムな動きで敵が動きます。ここでフレームレートをcontroll私はフレームcontrollを試してみましたが、ここでdidntの仕事は私のコードであるrequestAnimationFrameのを使用しています:keypressイベントのような移動速度

function handleKeyPressed(e) { 

    var PacMan = scene.getObjectByName('PacMan'); 
    gameSong.play(); 
    switch(String.fromCharCode(e.which)) 
    { 
    case "w": if(!detectaColisao(PacMan.position.x, PacMan.position.y + SCALE)) 
      PacMan.position.y += SCALE; 
     break; 
    case "a": if(!detectaColisao(PacMan.position.x - SCALE, PacMan.position.y)) 
     PacMan.position.x -= SCALE; 
     break; 
    case "s": if(!detectaColisao(PacMan.position.x, PacMan.position.y - SCALE)) 
     PacMan.position.y -= SCALE; 
     break; 
    case "d": if(!detectaColisao(PacMan.position.x + SCALE, PacMan.position.y)) 
     PacMan.position.x += SCALE; 
     break; 

    } 
} 

    function anima() 
{ 
    var delta=clock.getDelta(); 
    orbitCamera.update(delta); 

    requestAnimationFrame(anima); 
    rendere 
+0

"didnt work"を定義してください。 – Teemu

+0

ランダム移動を初めて定義したときは、10のようにposition.xに移動しますが、毎回移動します。アニメーションフレーム内でsetTimeoutで定義した場合、フレームをコロールする必要がありません –

答えて

0

それは10のようにposition.xに移動するが、それは毎回

を移動

アニメーションが処理されるまでに何度も動くことを意味しますか?

これは、キー押しがレンダリングループとは非同期であることです。これは、キーが押されているときに発生します。これは、キーが押されている限り一定です。

あなたがしなければならないことは、animate()サイクルごとに一度だけあなたのパックマンを移動することです。

ので私は変化するであろうことはあなたのkeypressed関数内でパックマンを移動し、代わりにそのようにように、アニメーション()サイクル以内にあなたのパックマンを移動するいくつかの真偽値をトリガしませんthis-です:

var u, d, l, r; 
u = d = l = r = false; 

function handleKeyPressed(e) { 
    switch (String.fromCharCode(e.which)) { 
    case "w": 
     u = true; 
     break; 
    case "a": 
     l = true; 
     break; 
    case "s": 
     d = true; 
     break; 
    case "d": 
     r = true; 
     break; 
    } 
} 

function handleKeyReleased(e) { 
    switch (String.fromCharCode(e.which)) { 
    case "w": 
     u = false; 
     break; 
    case "a": 
     l = false; 
     break; 
    case "s": 
     d = false; 
     break; 
    case "d": 
     r = false; 
     break; 
    } 
} 

function moveModel(_u, _d, _l, _r, obj) { 
    if (_u && !detectaColisao(obj.position.x, obj.position.y + SCALE)) { 
    obj.position.y += SCALE; 
    } 
    if (_d && !detectaColisao(obj.position.x, obj.position.y + SCALE)) { 
    obj.position.y -= SCALE; 
    } 
    if (_l && !detectaColisao(obj.position.x, obj.position.y + SCALE)) { 
    obj.position.x -= SCALE; 
    } 
    if (_r && !detectaColisao(obj.position.x, obj.position.y + SCALE)) { 
    obj.position.x += SCALE; 
    } 
} 

function anima() { 
    var PacMan = scene.getObjectByName('PacMan'); 
    moveModel(u, d, l, r, PacMan); 
    var delta = clock.getDelta(); 
    orbitCamera.update(delta); 
    requestAnimationFrame(anima); 
    rendere(); 
} 

また、鍵が解放されたときにそれらのブール値を再び戻す必要があることに注意してください。このとき、handleKeyReleasedを追加して、これが発生したときにキャッチしてください。 handleKeyPressed関数の逆を行います。

この抽象レイヤーを追加する必要がある理由は、キープレスされたイベントが発生するたびに発生し、アニメーションサイクルのどこにいるかは気にしません。しかし、アニメーションサイクルごとに1回だけ移動したいので、直接移動するのではなく、モデルを移動する必要があるかどうかをモデルに伝える一連のフラグを作成します。

+0

問題はそれほど正確ではありませんおそらく私はよく説明しませんでした、問題はパックマンではなく、私が作っている敵と一緒に、私のパックマンはキーを押したときに10ユニットの覇気を動かします。その罰金は、 。私の敵と私は同じアプローチをランダムに、私はランダムな位置を与えるが、私はどのように速くなり、私は彼に低い値を与える場合は、 enemys.positionの増分は10でなければならないが、フレームレートは異なっていなければならない。 –

+0

私はよく説明したと思うが、もしあなたができればPMでうまく説明できる。 –

0

ああ大丈夫です。したがって、userDataに値を追加することもできます。変数には "ghost.userData.timer"のような変数を1つ追加します。 60のように定義したcoolDown変数を過ぎると、ランダムな動きを与え、タイマーを0に戻します。

こうすることで、定義した一定の間隔で手順を実行します。

関連する問題