我正在写一个简单的游戏,其中动画是使用计时器完成的。计时器速率最初设置为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);