在GLUT中每秒产生2个敌人

Spawn 2 enemies per second in GLUT

本文关键字:2个 敌人 GLUT      更新时间:2023-10-16

我正在openGL中制作一个游戏,我想在屏幕上每秒产生2个敌人。问题是,我在空闲状态下调用派生函数:

idle
{
// ...
world.spawnEnemy();
}

然后,在spawnEnemy函数中:

void World::spawnEnemy()
{
Enemy newEnemy, newEnemy2;
float start;
start = glutGet(GLUT_ELAPSED_TIME);
// 1/2 a second passes
while ( (glutGet(GLUT_ELAPSED_TIME) - start) <= 500 )
{
;
}
// create enemy
newEnemy();
pushToEnemyList(newEnemy);
// another 1/2 second passes
while ( (glutGet(GLUT_ELAPSED_TIME) - start) <= 1000 )
{
;
}
// create enemy
newEnemy2();
pushToEnemyList(newEnemy2);
}

当然,这是行不通的。可能是因为idle每次都被调用,而我在idle内部调用一个函数,该函数等待一定的时间,然后一切都开始出错。解决方案是在空闲函数中进行派生(不调用任何函数,在空闲中执行所有逻辑),但我不喜欢这种想法。我需要在一定的时间内做更多的事情,例如,我的敌人有枪,他们每秒必须射击n次。如果我直接在空闲的时候做所有这些,它会变得一团糟。所以,基本上,我该如何做到这一点:

idle
{
// ...
world.spawnEnemy();
world.enemyShoot();
// another functionalities that depend on time
}

而不是这个:

idle
{
// ...
// logic of spawnEnemy directly here in the idle function
// logic of enemyShoot directly here in the idle function
// logic of another functionalities that depend on time directly here in the idle function
}

这里有很多方法可以做到这一点,最常见的是:

  1. 测量经过的时间

    只需记住上次生成的时间t0,并在每次(空闲)迭代中获得当前时间t。如果t0+T<=t,则产生新的敌人并设置t0=tT是以测量时间为单位的产卵期。在您的情况下为500ms

    如前所述,OnIdle事件将占用一个CPU内核的100%。要解决此问题,请使用Sleep(x);,其中x<<T将减轻CPU负载(即使是Sleep(1);也会有很大差异)。

    要测量时间,请使用您可用的任何OS例程(具有足够高的精度)。我在Windows上使用PerformanceCounter,但还有其他选择,如RDTSC等。。。

  2. 计时器

    基于消息的OS现代操作系统提供定时器功能,可定期触发您的事件(通常精度约为1ms)。只需研究您的API即可实现它。然后,您只需在计时器事件内生成您的敌人,而无需任何其他逻辑或计时代码。。。

    如果你没有任何定时器,你可以通过创建内部代码如下的线程来伪造它:

    for (;!spawn_exit;)
    {
    if (spawn_enabled) spawn(); 
    Sleep(T);
    }
    

    其中volatile bool spawn_enabled=true,spawn_exit=false;用于控制生成和停止线程(在应用程序关闭之前)。但在这种情况下,请小心spawn()函数中的多线程访问。。。