0

我的代码中有以下问题,我让这个循环在计时器上运行(这只是在大计时器上运行的循环的一小部分),

在那个大计时器内(他每 1 秒打勾)我有 1 个方法需要等待 5 秒然后继续执行其余的循环代码,但我希望它不会卡住代码并且计时器将继续每 1 秒运行一次并且不会等待那 5 秒。

我做了什么我添加了一个新的计时器(timer_deva),它每 5 秒滴答一次,并在其中进行所有检查,然后计时器停止。

所以我的问题是我需要等待 5 秒来检索一个值以完成我的代码,但我需要我的主计时器将同时运行,当他得到他的结果时,他需要完成他留下的代码在后面。

提前致谢,

else if (mobID.Equals(Convert.ToInt32(txtDeva)))
{
    //START CHECK WITH TIMER
    timer_deva.Start();
    //Methods inside timer_deva update the winnerNation
    //END CHECK TIMER - GET RESULT
    winner(zoneId, winnerNation, humansKills, orcKills);
}
4

1 回答 1

4

tl;博士

游戏中不使用传统计时器。游戏有一种非常不同的机制来处理它们的逻辑和经过的时间。

长版:

我知道这可能无法直接回答您的问题,但这是一种将大量文字塞进评论的方式。您的计时器听起来非常复杂和分层。根据您的变量名称,我将假设您正在编写游戏。游戏通常不能与计时器一起使用,或者与您期望的方式不同。这种不同的类似游戏的行为将极大地帮助您解决计时器问题,甚至可能对您的设计提供更多帮助。

游戏通常有一个叫做game loop. 一般来说,它是三个主要函数在循环中一个接一个地调用:

while(running)
{
    HandleUserInput();
    ChangeWorld();
    Render();
}

您获得用户输入,相应地更改游戏世界并将其绘制到屏幕上。现在,你的计算机越快,这个循环运行的越快。这对图形有好处(想想 FPS),但对游戏不利。想象一下方块移动的每一帧的俄罗斯方块。现在我不想买更快的电脑,那样游戏会变得更难。

因此,为了保持游戏速度恒定而不受计算机功率的影响,循环会考虑经过的时间:

while(running)
{
    var timePassedSinceLastLoop = CalculateTimeDelta();

    HandleUserInput();
    ChangeWorld(timePassedSinceLastLoop);
    Render();
}

现在想象一下游戏中某些东西的冷却时间。玩家按下“a”,发生了一些很酷的动作,尽管他可能再次按下“a”,但在接下来的 5 秒内什么都不会发生。但游戏仍在运行,并完成了游戏中可能发生的所有其他事情。这不是传统的计时器。它是一个变量,我们调用它ActionCooldown,一旦玩家触发动作,它就会被设置为 5 秒。每次世界发生变化时,都会从该数字中减去 timePassed,直到它为零。游戏一直在运行并处理输入和渲染。但只有一次ActionCooldown击中零,再次按下“a”将再次触发该动作。

于 2013-05-17T10:31:10.277 回答