在遊戲中,有一種情況是斜向移動,就是同步選取兩個方向,形成斜線操作,在Win32GDI開發中,可以通過在邏輯迴圈裡加入鍵盤狀態判斷取得多個鍵進行操作,但是在Silverlight中鍵盤的事件是單個的,不能取得多個鍵盤的狀態,園友提出一個問題,就是我的Flyer小遊戲只能上下左右控制,而不能斜向行動,今天我們來解決這個問題,實現八個方向的正確行為動作。
針對這個解決方案初步的想法,對於鍵盤的輸入來說,可以使用一個隊列進行鍵盤狀態儲存,比如使用一個List儲存Key的狀態,然後在KeyUp的時候釋放掉沒有用的Key,判斷一下按下的順序就可能得到所有方向的狀態,但是這有幾個問題,在按下多鍵都會出重複鍵問題,而按下的順序未必準確,那麼出隊列未必一定是準確的釋放,比如我可以同步選取ABC,而釋放順序是BCA,得到的結果就不是一個準確的List,這種方法看起來可行,但是實際過程中卻不一定是這樣的情況,所以問題沒有解決。
這個實現可能有很多解決方案,在這裡我們用一個直觀的解決方案來解決,使用狀態表來完成,可以分析出來一個按鍵行為和行動方向行為的共性,他們是一個3x3的映像:
從上面的圖形可以看出來,是一個3x3的二維數組,看看和什麼很像呢——遊戲手柄,我們可以用一個二維數組來儲存所有的狀態,將按下的數字組合查表得到對應的狀態。
就如所示,我們可以使用一個狀態來完成它,寫成代碼的就是這樣:
public enum emUserDir
{
上, 下, 左, 右, 左上, 右上, 左下, 右下, 中
}
emUserDir[,] UserDir = new emUserDir[3, 3]
{
{emUserDir.左上,emUserDir.上,emUserDir.右上},
{emUserDir.左,emUserDir.中,emUserDir.右},
{emUserDir.左下,emUserDir.下,emUserDir.右下}
};
下面樣本是在自建工程MainPage中的KeyDown事件:
void MainPage_KeyDown(object sender, KeyEventArgs e)
{
string temp = e.Key.ToString();
switch (e.Key)
{
case Key.Up:
if(vertical > 0)
vertical -= 1;
break;
case Key.Down:
if (vertical < 2)
vertical += 1;
break;
case Key.Left:
if (horizontal > 0)
horizontal -= 1;
break;
case Key.Right:
if (horizontal <2 )
horizontal += 1;
tbTextRightKey.Text = temp + "=按下";
break;
}
string Text = UserDir[vertical, horizontal].ToString();
}
可以在最後的Text得到準確的位置枚舉資訊,為了更直觀,咱們做一個輸出資訊,具體Code就請下載原始碼吧:)在這裡下載
而最終的效果如下,各位下載代碼直接運行看吧