2011-11-26 153 views
1

我正在開發一個具有mouse_move事件的空間入侵遊戲。它的作品,但當我移動鼠標,一切都變慢了。侵略者和其他東西停止移動,直到你停止移動鼠標鼠標移動減慢遊戲速度

有人可以請解釋爲什麼和可以做什麼來解決這個問題。

感謝名單

private void Form1_MouseMove(object sender, MouseEventArgs e) 
{ 
    Cursor.Dispose(); 
    objsp.gsPos = new Point(MousePosition.X/2 - 10, MousePosition.Y/2 - 15); 

    UpdatePosition(objsp.gsPos.X, objsp.gsPos.Y, objsp.gsImage); 
} 

private void UpdatePosition(int dx, int dy, Image img) 
{ 
    Point newPos = new Point(objsp.gsPos.X + dx, objsp.gsPos.Y + dy); 

    //dont go out of window boundary 
    newPos.X = Math.Max(0, Math.Min(ClientSize.Width - img.Width, newPos.X)); 
    newPos.Y = Math.Max(0, Math.Min(ClientSize.Height - img.Height, newPos.Y)); 

    if (newPos != objsp.gsPos) 
    { 
     objsp.gsPos = newPos; 
     Invalidate(); 
    } 
} 
+0

在'mouse_move'事件處理程序中發佈代碼。 – Nasreddine

+0

發佈UpdatePosition的來源請 – Boaz

+0

這就是方法。沒有別的。它只是被稱爲鼠標移動事件 –

回答

3

你可能會做你的MOUSE_MOVE處理方式太辛苦了。由於您不提供我能提供的最佳建議的代碼。

你必須小心你在這樣的處理程序中做什麼。拖動鼠標時,鼠標移動會被觸發很多次。在這種情況下,你應該儘可能少做。

如果您發佈您的代碼,我們可以進一步幫助,但在那之前,我們沒有足夠的信息來給你一個堅實的修復

編輯:

現在你已經張貼我看到的代碼你正在撥打Invalidate()每個鼠標移動事件。你不斷重新整理整個表格。經常需要做很多工作。你需要對你重繪的東西有點聰明。

嘗試僅使作爲第一步需要重繪的區域無效。這應該有助於顯着的事情。 Invalidate()將接受Rectangle作爲參數,使用它。

+0

我已經包含代碼... tnx –

+0

@KuvenRamsamy:增加了一些信息。對比例 –

+0

。我是遊戲編程的新手。請你解釋我如何去做無效()方法 –

0

也許儘量不要在事件觸發時運行代碼。也許限制它只能在每5次事件觸發時運行代碼或每100ms執行一次代碼。

0

好吧,這有可能發生,並且沒有看到代碼很難說出它可能是哪一個。

這最常見的原因是事件處理程序正在接管執行並導致所有事情都在其上等待。解決方案通常意味着讓您的代碼更高效。

+0

我把上面的代碼。因爲你可以看到它的3行和updateposition方法 –