在GLUT中每秒产生2个敌人
Spawn 2 enemies per second in GLUT
我正在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
}
这里有很多方法可以做到这一点,最常见的是:
-
测量经过的时间
只需记住上次生成的时间
t0
,并在每次(空闲)迭代中获得当前时间t
。如果t0+T<=t
,则产生新的敌人并设置t0=t
。T
是以测量时间为单位的产卵期。在您的情况下为500ms
。如前所述,OnIdle事件将占用一个CPU内核的
100%
。要解决此问题,请使用Sleep(x);
,其中x<<T
将减轻CPU负载(即使是Sleep(1);
也会有很大差异)。要测量时间,请使用您可用的任何OS例程(具有足够高的精度)。我在Windows上使用
PerformanceCounter
,但还有其他选择,如RDTSC
等。。。 -
计时器
基于消息的OS现代操作系统提供定时器功能,可定期触发您的事件(通常精度约为1ms)。只需研究您的API即可实现它。然后,您只需在计时器事件内生成您的敌人,而无需任何其他逻辑或计时代码。。。
如果你没有任何定时器,你可以通过创建内部代码如下的线程来伪造它:
for (;!spawn_exit;) { if (spawn_enabled) spawn(); Sleep(T); }
其中
volatile bool spawn_enabled=true,spawn_exit=false;
用于控制生成和停止线程(在应用程序关闭之前)。但在这种情况下,请小心spawn()
函数中的多线程访问。。。
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 处理多个异常集合的C++方法
- 什么时候在C++中返回常量引用是个好主意
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 尝试通过多个向量访问变量时,向量下标超出范围
- Ardunio UNO解决了多个重叠的定时器循环
- 如何返回一个类的两个对象相加的结果
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 数到第n个楼梯的路(顺序无关紧要)
- 基于多个条件处理地图中的所有元素
- 为多个会话保留XPtr
- 如何在C++中初始化嵌套类中的2个memeber
- 在GLUT中每秒产生2个敌人
- 子弹只会杀死第一个敌人