我正在用C#编写代码,我想调用其中包含循环的方法,然后再调用另一个方法。问题在于第一种方法中的循环在程序执行期间运行,因此第二种方法无法调用,因为第一种方法从未完成。
示例:
private void Menu()
{
Game();
Movement();
}
private void Game()
{
do
{
// some code inside the loop
} while (x > 9);
}
private void Movement()
{
// some other code
}
答案 0 :(得分:1)
您好像在写游戏。
在编写游戏(或任何类型的事件驱动的应用程序)时,您将需要在特定时间做某些事情。例如,应该绘制图形(每秒50或60次),需要处理按键(每秒10次),鼠标移动(每秒20次)等。
一种简单(但可能不是最好)的方法是使用一个每10毫秒滴答一次的计数器,然后您的“计时器事件”可以对此做出反应。
void Loop()
{
int ticks = 0;
var stopwatch = new Stopwatch();
while(true)
{
stopwatch.Start();
if(ticks % 20 == 0) // Once every 20 ticks (or 200 ms)
{
DrawGraphics();
}
if(ticks % 50 == 0) // Once every 50 ticks (or 500 ms)
{
ProcessKeyPresses();
}
ticks++;
stopwatch.Stop();
Thread.Sleep(10 - stopwatch.TotalMilliseconds); // Wait until at least 10 milliseconds have passed
}
}
显然,这非常简单,但是希望您能理解。
答案 1 :(得分:0)
许多游戏不使用多线程。他们使用一个看起来像这样的游戏循环
while (gameIsRunning) {
ProcessInputs();
UpdateGameWorld();
GenerateOutputs();
}
您必须存储每个对象(化身,宇宙飞船,炸弹...)的状态。根据用户输入和当前游戏时间UpdateGameWorld
更新每个对象的状态。状态包括位置,速度,重要功能,能量,寿命等。
然后GenerateOutputs
使用此更新的状态信息来生成输出。
由于执行一次循环所需的时间可能会有所不同,因此最好使用StopWatch
来查看自上次循环以来已花费了多少时间。速度和位置是这样计算的
newSpeed = speed + delta_time * acceleration
position = position + delta_time * 0.5 * (speed + newSpeed)
speed = newSpeed
这里的加速度,速度和位置是矢量(取决于游戏类型的2D或3D)。
加速度是由重力,阻力,推力,气体,断裂等决定的。