Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 鼠标移动减慢游戏速度_C#_Winforms - Fatal编程技术网

C# 鼠标移动减慢游戏速度

C# 鼠标移动减慢游戏速度,c#,winforms,C#,Winforms,我正在开发一个太空入侵者游戏,它有一个鼠标移动事件。它可以工作,但当我移动鼠标时,一切都变慢了。入侵者和其他东西停止移动,直到你停止移动鼠标 有人能解释一下为什么以及可以做些什么来解决这个问题吗 塔克斯 您可能在鼠标移动处理程序中做了太多的工作。因为你没有提供代码,这是我能提供的最好的建议 你必须小心你在这样的处理程序中所做的事情。当拖动鼠标时,鼠标移动会被激发很多次。在那种情况下,你应该尽量少做 如果您发布代码,我们可以提供进一步帮助,但在此之前,我们没有足够的信息为您提供可靠的修复 编辑:

我正在开发一个太空入侵者游戏,它有一个鼠标移动事件。它可以工作,但当我移动鼠标时,一切都变慢了。入侵者和其他东西停止移动,直到你停止移动鼠标

有人能解释一下为什么以及可以做些什么来解决这个问题吗

塔克斯


您可能在鼠标移动处理程序中做了太多的工作。因为你没有提供代码,这是我能提供的最好的建议

你必须小心你在这样的处理程序中所做的事情。当拖动鼠标时,鼠标移动会被激发很多次。在那种情况下,你应该尽量少做

如果您发布代码,我们可以提供进一步帮助,但在此之前,我们没有足够的信息为您提供可靠的修复

编辑:

现在您已经发布了代码,我看到您在每次鼠标移动事件中都调用了
Invalidate()
。您不断地重新绘制整个表单。这是一个需要经常进行的大量工作。你需要对你重画的东西更聪明一点


作为第一步,尝试仅使需要重新绘制的区域无效。这应该会有明显的帮助
Invalidate()
将接受一个
矩形
作为参数,使用该参数

也许不要每次触发事件时都运行代码。可能会将其限制为仅在每第5次事件火灾或每100ms运行一次代码。

好吧,发生这种情况的原因有很多,如果没有看到代码,很难判断它可能是哪一个


最常见的原因是事件处理程序正在接管执行,并导致一切等待它。解决方案通常意味着提高代码的效率。

将您在
鼠标移动中的代码发布到事件处理程序中。
请将更新位置的源代码发布到方法中。没别的了。它只是在鼠标移动时被调用,我把代码放在上面。正如您可以看到的,它的3行和updatepositionmethod@KuvenRamsamy:添加了一些信息。谢谢。我不熟悉游戏编程。你能解释一下我是怎么做的吗method@KuvenRamsamy:你能帮我发布你的
OnPaint
方法吗?
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();
    }
}