如何在一个或几个线程中处理许多不同类型的敌人



我想创建一个射击游戏,它只有2d之类的东西,但我用C++编写它,并希望有许多不同的敌人,例如,一个每秒射击一次,另一个每3秒射击一次。但我了解到,你可以让线程休眠,并且看不到有什么不同的方法可以让某件事每3秒或9秒做一件事。但是我不能在一个线程中管理所有这些,那么我该怎么做呢?已经谢谢了,我对编程还很陌生。

您现在还不需要线程。当你说

一个每秒发射一次,另一个每3次发射一次。

您似乎希望代码sleep((或等待几秒钟。

这不是正确的做法。你想要的是一个像这样的主循环

// called every 10 ms
void FixedUpdate()
{
for(auto enemy: enemies)
{
enemy.Update();
}
} 
void Enemy::Update()
{
float now = time(); // replace with whatever timing mechanism your game uses
if (mLastAction - now > 3.0f) // your enemy stores the last time it did something
{
PerformAction(); // the enemy has a function to perform actions
mLastAction = now;
}
}

通常我会寻找类似优先级队列的东西,并在单个线程中运行游戏。

std::priority_queue< Objects >

将允许完成一个单一的事情列表,如果排序是基于下一个计划的,则可以动态添加和删除项目以选择排序。

我只需要创建一个需要发生的事件的std::map,键是它们发生的时间。然后,您的计时器线程只计算第一个事件发生的时间,休眠该时间,然后启动第一个事件。

计时器线程的工作方式如下:

  1. 获取保护事件映射的互斥对象
  2. 看看是否到了触发第一个事件的时间,如果是,请跳到步骤6
  3. 计算第一个事件触发的时间
  4. 在步骤3中计算的时间的条件变量上的块
  5. 转至步骤2
  6. 将第一个事件排除在地图之外
  7. 释放保护事件映射的互斥对象
  8. 执行我们从地图中删除的事件
  9. 转至步骤1

对新事件进行排队(可以在处理前一个事件时进行(:

  1. 获取保护事件映射的互斥对象
  2. 将事件添加到映射中,按其执行时间设置关键帧
  3. 向条件变量发送信号
  4. 释放互斥对象

最新更新