C# Winforms空间入侵者游戏错误与Ticker
我正在写一个太空入侵者游戏,在这个游戏中,我在10毫秒和75毫秒的间隔内调用了两个计时器。为此,10ms股票行情器至关重要。 ticker间接调用您在下面看到的方法。 此方法负责移动入侵者/外星人 它们首先向右移动,直到到达右边框ClientRectangle-100,然后向下移动30像素,并向左切换当前路径。如果它们到达左边框ClientRectangle+100,它们还应该向下移动30像素,然后再次切换当前方向。 左右移动没有问题,向下移动也可以,但有时它们会向下移动2或3倍2或3*30像素 我想不出这个问题。我猜,股票代码编写者调用该方法的频率太高,以至于尚未计算出新的位置C# Winforms空间入侵者游戏错误与Ticker,c#,winforms,C#,Winforms,我正在写一个太空入侵者游戏,在这个游戏中,我在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被刷新?或者这只是一个时间间隔的问题?使用更多的计时器没有问题。但基本解决方案仍无法得到保证。。