如何降低winforms计时器的勾选率



我正在写一个简单的游戏,其中动画是使用计时器完成的。计时器速率最初设置为200,但玩家每获得1000分,我希望计时器更快,所以我想我可以减少的间隔

if (score > 0 && score % 1000 == 0)
{
GameTimer.Interval -= 20;
}

但当我达到1000分时,winform崩溃,上面给出的行出现以下错误:

System.ArgumentOutOfRangeException:值"0"不是Interval的有效值。间隔必须大于0。参数名称:Interval

如何正确降低间隔率?(或者通过任何其他方式使我的程序运行得更快(

编辑:上面给出的代码段被放置在tick事件中,这导致if语句执行多次

该错误表示Interval值已达到零。

因此,这些行被执行多次,直到崩溃:

if (score > 0 && score % 1000 == 0)
{
GameTimer.Interval -= 20;
}

这是因为在计时器通过一次条件后,每个间隔都会满足该条件。

在定时器代码之外定义你的逻辑,你就会没事了:

void Score(int value){
score += value;
if (score <= 0) return;
if(score % 1000 == 0)
{
GameTimer.Interval -= 20;
//if(GameTimer.Interval <= 0) I suppose level is already finished...
}
}

编辑

mjwills指出了这个问题,间隔仍然可能达到零。因此,您必须以消除这种风险的方式编写代码。

在这种情况下,非线性归约更有意义:

void Score(int value){
score += value;
if (score <= 0) return;
if(score % 1000 == 0)
{
GameTimer.Interval *= .9f;
if(GameTimer.Interval <= 0) GameTimer.Interval = 1;
}
}

勾选率不能小于或等于0。

你可以简单地添加一个if语句来检查:

if (GameTimer.Interval <= 20) {
GameTimer.Interval = 1;
} else {
GameTimer.Interval -= 20;
}

然而,这意味着计时器间隔将在达到一定分数后达到限制。此外,屏幕更新速度也没有那么快(每秒1000次(。您可能应该将帧速率保持在每秒30帧。

因此,为了使动画更快地出现,请在每秒中制作更大比例的动画。例如,要向右移动1000个像素,不要每1/1000秒移动一个像素。相反,每1/20秒移动50个像素。

根据您的评论:

问题是我不明白为什么间隔会低于零,if语句只执行一次,它会立即给我错误。

然后您将多次执行if语句。我的猜测是,您正在计时器tick事件处理程序中运行它。一旦您的分数达到1000的倍数,则每次计时器计时时都会运行if语句,直到您的分数发生变化。

要解决这个问题,可以将代码放在分数的setter中。

计时器间隔不断减小,直到达到零"0",这是您的错误

你可以使用

int x = (score/1000)*20  
if (x < 200)
GameTimer.Interval = (200 - x);

最新更新