2013-01-22 16 views
0

我有一個問題,我正在努力.. 我想要使用我的鍵盤將圖像移動到左側,右側,上下或對角線方式。 我搜索了網絡,發現,使用2個不同的密鑰我需要記住以前的密鑰,所以爲此我使用了一個bool字典。如何使用2鍵在KeyBoard上移動圖像?

在我的主窗體類

這是KeyDown事件的樣子:

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    baseCar.carAccelerate(e.KeyCode.ToString().ToLower()); 
    carBox.Refresh(); //carbox is a picturebox in my form that store the image I want to move. 
} 

我的KeyUp事件:

private void Form1_KeyUp(object sender, KeyEventArgs e) 
{ 
    baseCar.carBreak(e.KeyCode.ToString().ToLower()); 
} 

我的Paint事件:

private void carBox_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.DrawImage(Car, baseCar.CharPosX, baseCar.CharPosY); // Car is just an image 
} 

而且我baseCar等級:

private Dictionary KeysD = new Dictionary(); //有設置在W的方法| A | S | d鍵,如:KeysD.Add( 「W」,假)

public void carAccelerate(string moveDir) 
    {  
     KeysD[moveDir] = true; 
     moveBeta(); 
    } 
    public void moveBeta() 
    { 
     if (KeysD["w"]) 
     { 
      this.CharPosY -= this.carMoveYSpeed; 
     } 
     if (KeysD["s"]) 
     { 
      CharPosY += carMoveYSpeed; 
     } 
     if (KeysD["a"]) 
     { 
      CharPosX -= carMoveXSpeed; 
     } 
     if (KeysD["d"]) 
     { 
      CharPosX += carMoveXSpeed; 
     } 
    } 
    public void carBreak(string str) 
    { 
     KeysD[str] = false; 
    } 

反正它的工作原理,但我的問題是,我可以」 t回到第一個按鍵,例如:

我按下W鍵向上移動,然後按D鍵轉到對角線,當我釋放D鍵時它不會再次上移,因爲KeyDown事件是「死的「並且不會再打電話給carAccelerate()方法.. 我無法弄清楚如何修復它..

任何人都可以幫我嗎? 也許有更好的方法來處理鍵?我打開任何想法! 我希望你能理解它,我的英語不是最好的:S

回答

1

存儲所有keystate,並且不要在按鍵上設置動畫,但是例如使用定時器。

然後:

KeyDown(key) 
{ 
    KeyState[key] = true; 
} 

KeyUp(key) 
{ 
    KeyState[key] = false; 
} 

Timer_Tick() 
{ 
    Animate(); 
}  

Animate() 
{ 
    if (KeyState["W"]) 
    { 
     // Accelerate 
    } 
    if (KeyState["S"]) 
    { 
     // Decelerate 
    } 

} 

然後在KeyDown方法,你可以檢查衝突的鍵(如果加速減速+在同一時間按下了什麼,等等)。