2011-11-26 124 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方法 –