C# Winforms空间入侵者游戏错误与Ticker

C# Winforms空间入侵者游戏错误与Ticker,c#,winforms,C#,Winforms,我正在写一个太空入侵者游戏,在这个游戏中,我在10毫秒和75毫秒的间隔内调用了两个计时器。为此,10ms股票行情器至关重要。 ticker间接调用您在下面看到的方法。 此方法负责移动入侵者/外星人 它们首先向右移动,直到到达右边框ClientRectangle-100,然后向下移动30像素,并向左切换当前路径。如果它们到达左边框ClientRectangle+100,它们还应该向下移动30像素,然后再次切换当前方向。 左右移动没有问题,向下移动也可以,但有时它们会向下移动2或3倍2或3*30像素

我正在写一个太空入侵者游戏,在这个游戏中,我在10毫秒和75毫秒的间隔内调用了两个计时器。为此,10ms股票行情器至关重要。 ticker间接调用您在下面看到的方法。 此方法负责移动入侵者/外星人

它们首先向右移动,直到到达右边框ClientRectangle-100,然后向下移动30像素,并向左切换当前路径。如果它们到达左边框ClientRectangle+100,它们还应该向下移动30像素,然后再次切换当前方向。 左右移动没有问题,向下移动也可以,但有时它们会向下移动2或3倍2或3*30像素

我想不出这个问题。我猜,股票代码编写者调用该方法的频率太高,以至于尚未计算出新的位置

private void MoveInvaders()
{
    bool downLeft = false;
    bool downRight = false;

    if (movedDown)
    {
        //rect = ClientRectangle of the Form
        //I´m using LINQ for some collision detection
        //The surface is the representation of the Invader as a Rectangle

        downRight = (from inv in invaders
                     where (inv.Surface.X + inv.Surface.Width) < rect.right - 100
                     select inv).ToList().Count > 0;

        if (!downRight)
        {
            downLeft = (from inv in invaders
                        where inv.Surface.X > rect.left + 100
                        select inv).ToList().Count > 0;
        }

        if (downRight || downLeft)
        {
            movedDown = false;
            downLeft = false;
            downRight = false;
        }

    }
    else
    {

        downRight = (from inv in invaders
                     where (inv.Surface.X + inv.Surface.Width) >= rect.right - 100
                     select inv).ToList().Count > 0;

        if (!downRight)
        {
            downLeft = (from inv in invaders
                        where inv.Surface.X <= rect.left + 100
                        select inv).ToList().Count > 0;
        }
    }

    foreach (Invader invader in invaders)
    {
        if (!movedDown)
        {
            if (downRight)
            {
                invader.Move(Way.Down);  //Their old Point.Y += 30
                currentWay = Way.Left;
            }
            else if (downLeft)
            {
                invader.Move(Way.Down);
                currentWay = Way.Right;
            }
        }

        invader.Move(currentWay);  //old Point.X += 1
    }

    if (!movedDown && (downLeft || downRight))
    {
        movedDown = true;
    }
}

如果您使用计时器,10毫秒的速度太快,无法可靠地调用。@TaW我需要10毫秒才能获得平滑的帧速率。我当然知道,WinForms并不是制作游戏的最佳工具,所以我需要改进,我想到了一个计时器,它可以观察向下运动,你只能每秒设置一次……有几个计时器;一定要调查他们!因为在winforms中,重绘与监视器不同步,所以很难实现平滑。。不是外星人需要,而是子弹需要……如果我触发第三个1000毫秒或500毫秒的计时器来设置路线,这会是一个很好的解决方案吗?而不是使用我喜欢为我的动画分配的animationTicker?或者,这一个可能不会设置路径。向下,因为在第三个计时器注意到操作之前,bool被刷新?或者这只是一个时间间隔的问题?使用更多的计时器没有问题。但基本解决方案仍无法得到保证。。