2016-05-27 12 views
0

私は自分のコードが動作するようになっており、矢印キーを使って要素をコントロールすることができます。しかし、私は、要素を上下左右に動かしたいだけです。だから私がUPを押すと、同時に(ストラフティング)RIGHTを押すことはできないはずです。しかし、私はこれを防ぐ方法がわからないのですか?私を正しい方向に向けることができる人は誰ですか?私は私の動きをチェックする方法Html5キャンバスゲームx、yを移動する

// Tracking keys 
var keysDown = {}; 

// Moving the player around on the map    
if(39 in keysDown) { player.x+=gameSettings.speed; } // Move Right 
if(37 in keysDown) { player.x-=gameSettings.speed; } // Move Left 
if(38 in keysDown) { player.y-=gameSettings.speed; } // Move Up 
if(40 in keysDown) { player.y+=gameSettings.speed; } // Move Down 

addEventListener('keydown', function(e) { 
    keysDown[e.keyCode] = true; 
}, false); 

addEventListener('keyup', function(e) { 
    delete keysDown[e.keyCode]; 
}, false); 

私は簡単な解決策があると確信しているが、私はこの時、あまりにも長い間見てきたので、右方向に任意のピンポイントは素晴らしいことです! 2番目のキーには何を行う前に

+0

こんにちは、この他の質問を見てみてください。問題はあなたのニーズに似ています。 http://stackoverflow.com/questions/5203407/javascript-multiple-keys-pressed-at-once – MRodrigues

答えて

1

を私はmiqdadamiraliの答えを好きですが、我々はそれを少し簡略化することができるかどうかを確認することができます。ここ

// Tracking keys 
var keysDown = {}; 

// Moving the player around on the map    
if(39 in keysDown) { player.x+=gameSettings.speed; } // Move Right 
if(37 in keysDown) { player.x-=gameSettings.speed; } // Move Left 
if(38 in keysDown) { player.y-=gameSettings.speed; } // Move Up 
if(40 in keysDown) { player.y+=gameSettings.speed; } // Move Down 

addEventListener('keydown', function(e) { 
    // we only want to set the key if it's empty 
    if (Object.keys(keysDown).length === 0) { 
     keysDown[e.keyCode] = true; 
     // call the function to make the actual movement 
    } 
}, false); 

addEventListener('keyup', function(e) { 
    delete keysDown[e.keyCode]; 
}, false); 

2つの仮定:

  1. 移動がのkeydownイベントが発生するたびに呼ばれないコードのブロック

    はこれを試してみてください。私はあなたがイラストレーションのためにここに示していると仮定します。

  2. 説明に基づいて、一度に1つしか移動できないため、keysDownオブジェクトにはいつでも1つのプロパティしか持たないようにしてください。あなたは、変数を使用して、ゼロまたは39に設定している可能性が - 40

EDIT:

がさらに簡略化されたバージョンを説明するために、ここではコードです。

// Tracking keys 
var keyPressed = 0; 

// Moving the player around on the map    
if(keyPressed === 39) { player.x+=gameSettings.speed; } // Move Right 
if(keyPressed === 37) { player.x-=gameSettings.speed; } // Move Left 
if(keyPressed === 38) { player.y-=gameSettings.speed; } // Move Up 
if(keyPressed === 40) { player.y+=gameSettings.speed; } // Move Down 

addEventListener('keydown', function(e) { 
    // we only want to set the key if keyPressed is zero 
    if (keyPressed === 0) { 
     keyPressed = e.keyCode; 
     // call the function to make the actual movement 
    } 
}, false); 

addEventListener('keyup', function(e) { 
    keyPressed = 0; 
}, false); 
+0

@markE - 私は私の箇条書き#2に言及していると思います。 – Will

+0

私の答えは、OPが彼の余分な出来事が起こるのを防ぐのを助けることです。 – Will

+0

@markE - 私はあなたが言ったことを理解しました。それは私が言ったことです: "あなたは変数を使用して、それをゼロまたは39〜40に設定できました。 – Will

0

、それを確認するには

このお試しください移動させることが可能である:

// Tracking keys 
var keysDown = {}; 
var canMove = true; // If it can move. 

// Moving the player around on the map    
if(39 in keysDown) { player.x+=gameSettings.speed; } // Move Right 
if(37 in keysDown) { player.x-=gameSettings.speed; } // Move Left 
if(38 in keysDown) { player.y-=gameSettings.speed; } // Move Up 
if(40 in keysDown) { player.y+=gameSettings.speed; } // Move Down 

addEventListener('keydown', function(e) { 
    if (canMove) { 
     keysDown[e.keyCode] = true; 
     canMove = false; 
    } 
}, false); 

addEventListener('keyup', function(e) { 
    if (keysDown[e.keyCode]) { 
     delete keysDown[e.keyCode]; 
     canMove = true; 
    } 
}, false); 
関連する問題