2010-11-23 58 views
0

的按鍵我正在做一個遊戲,我有一個類叫做MainCharacter首先初始化主角(在PictureBox),然後我不得不處理運動的KeyDown事件。在這個事件中,如果我按下箭頭鍵,我就能夠處理角色移動,而且我甚至做了一個基於計時器的動作動畫,以使它看起來更加流暢。處理在C#

但是,KeyDown事件的問題在於,每次按下按鍵時都會觸發,這意味着如果我按住箭頭鍵以便角色繼續向一個方向移動,則會重複觸發事件,意味着角色像魚雷一樣在屏幕上運行,因爲事件發生的速度與計算機可以處理的速度一樣快。

這就是爲什麼我決定使用KeyPress事件,所以,當我拿着鑰匙了,性格將在指定的方向以穩定的速度移動。但是,KeyPress事件無法處理箭頭鍵,這就是爲什麼我必須重寫主窗體中的ProcessDialogKey方法。但是,如果我在主窗體覆蓋它,那麼該事件將被每次發射我按方向鍵,甚至當我在比賽中我不是,但例如在主菜單或其他地方。除此之外,如果我試圖通過跨課程來編程,那麼我認爲這將是一個不好的做法。

那麼,是否有任何其他方式讓我在不影響其他類的情況下處理KeyPress事件內部的我的MainCharacter類?或者是否有機會與我已經工作的KeyDown事件保持一致,並且如果我按住這個鍵,使它不能重複發射?請記住,我想要達到的目標是當我按住我的鑰匙時,我的角色可以流暢地移動。到目前爲止,如果我只按一次,它就可以正常工作,但通常人們在向一個方向行走時按住按鍵。

回答

0

創建您MainCharacterdirection變量。

左鍵的OnKeyDown,設置方向爲-1,和右鍵的OnKeyDown,設置方向爲1。

然後,兩個左和右按鍵OnKeyUp,設置方向爲0

然後你可以根據什麼價值direction設置爲,而不是每次移動他有一個物理按鍵移動你的性格。

非常僞代碼: //這個例子只關心左/右移動。

void Update(){ 
    // Update position due to current key state. 
    this.position.X += this.direction * this.speed; 
} 

void OnKeyDown(KeyEventArgs e) { 
    if(e.Key == Key.Left) { 
     player.direction = -1; 
    } 
    else if(e.Key == Key.Right) { 
     player.direction = 1; 
    } 
} 

void OnKeyUp(KeyEventArgs e) { 
    if(e.Key == Key.Left || e.Key == Key.Right) { 
     player.direction = 0; 
    } 
} 
+0

但是,然後更新方法將在一個無限循環和無效所有的時間,對吧?我還會如何做到這一點,以便隨時根據方向參數改變位置? – NoelAramis 2010-11-23 14:36:26

0

this.position.X + =(this.direction *(this.speed + 10));