2008-11-03 63 views
1

我在300x300的窗口內有一個800x600的畫布。當我按下某個鍵時,我希望畫布朝這個方向移動。
我這樣做背後的窗口的代碼中:WPF中的生澀運動

 
protected override void OnKeyDown(KeyEventArgs e) 
{ 
    base.OnKeyDown(e); 
    Key keyPressed = e.Key; 

    if (keyPressed == Key.W) 
    { 
     gcY += 5; 
    } 
    if (keyPressed == Key.S) 
    { 
     gcY -= 5; 
    } 
    if (keyPressed == Key.A) 
    { 
     gcX += 5; 
    } 
    if (keyPressed == Key.D) 
    { 
     gcX -= 5; 
    } 

    gameCanvas.RenderTransform = new TranslateTransform(gcX, gcY); 
} 

好,它的工作原理,但移動不暢。如果我堅持一個鍵,例如W,那麼在移動之前它會暫停一秒。
無論如何,當你按住一個鍵時,動作更平滑,並擺脫暫停?
謝謝。

回答

3

目前,您的設置正在接受垃圾郵件密鑰輸入(按住一個鍵)。我在大多數基於事件輸入的遊戲中看到它的做法是使用映射鍵盤(索引是鍵值)的布爾數組keydown[256];所有值初始化爲false

當按下按鍵,你在的keydown方法,在你的遊戲/渲染循環設置適當的索引true,你根據什麼鍵陣列中true調用gameCanvas.RenderTransform = new TranslateTransform(gcX, gcY);。在keyrelease事件方法中釋放密鑰時(我不確定它在C#中是什麼),將密鑰值設置爲false

這樣你就會平滑滾動,並且不會在啓動時出現延遲。

+0

嘿,謝謝。但是你知道這是爲什麼嗎?我以前的方式不行? – jkidv 2009-01-29 16:38:13

1

是的,你可以把時間納入你的計算。目前,您在事件觸發時添加/減去5,這並不是真正可預測的。

要平滑運動,請確保您使用DateTime不會比每秒X次更頻繁地發動。

,如:

private static DateTime nextUpdate 

if (nextUpdate <= DateTime.Now) 
{ 
//Move 
nextUpdate = DateTime.Now.AddMilliseconds(100); 
} 

我沒有VS現在,所以我不能完全肯定的語法,但你的想法。