2013-02-08 52 views
0

我將不勝感激,如果有人能以下主題中指點我:良好做法,模式而實現異步2D的WinForms元素

我準備小Windows窗體其主要形式以這種方式實施了以下事件的遊戲應用:

Shown += (sender, e) => GameItem.Start(); 

假設功能啓動()負責對形式的抽選球這樣的:

while (true) 
    {    
     game.BoardUI.pboxBall.Location = new Point(X++, Y++); 
     game.BoardUI.pboxBall.Image = global::BoringGame.Properties.Resources.redBall; 
     Application.DoEvents(); 
    } 

主要形式已實施的另一事件:

MouseMove += (sender, e) => Game.MoveBoard(e.X); 

這個事件負責繪圖板的球colide和彈跳。 此事件異步工作,但畫板正在閃爍。

我想知道如何實現事件MouseMove所以得出移動鼠標的項目不閃爍:

public void MoveBoard(int x) 
    { 
     new Thread(() => 
     { 
      game.BoardUI.pboxPaddle.Location = new Point(X, Y); 
      game.BoardUI.pboxPaddle.Image = global::BoringGame.Properties.Resources.ballPad; 
     }).Start();     
    } 

我試圖用SynchronizationContext UiSyncContext;

我應該怎麼做才能提高我的應用程序。 我是否需要單獨的線程來提供鼠標移動事件?如果是,那麼如何使用它呢? 也許圖形沒有優化 - 也許我應該使用另一個控件繪製移動元素。 目前我使用的是picturebox。

如果有人就此事提供建議,我將非常感激。

感謝幫助,解決方案:

//SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 

    this.DoubleBuffered = true; 
+0

這聽起來像你想創建一個計時器,每隔一段時間你的圖像移動一個固定的數量。 – Servy 2013-02-08 20:53:15

+0

如果您提出具體問題,最好。像「爲什麼我的遊戲在閃爍?」如果我們在解決這個問題之前必須閱讀十三段,很多人都不會去幫助。 – Jay 2013-02-08 20:53:28

+1

你的窗體的DoubleBuffered屬性是否設置爲「true」? – itsme86 2013-02-08 20:54:54

回答

1

如果閃爍的問題,那麼你可以儘量減少在移動物體被刪除,當它在新位置重新繪製之間的時間。線程可能無濟於事。正如itsme86所說,這可能是一個buffering問題。

+0

非常感謝您,我發現解決方案:這確實是緩衝,我用這this.DoubleBuffered = true;而不是:SetStyle(ControlStyles.OptimizedDoubleBuffer,true);感謝你的快速回復。最好的祝福 – lukaszk 2013-02-08 21:14:26