C ++按生活对敌人进行排序

时间:2019-01-17 09:30:05

标签: c++ sorting game-engine

借助一本c ++书籍,我编写的小游戏遇到了问题。

所以首先我有一个名为PlayerObject的类,以及一个存储所有游戏对象的数组。 游戏开始时,我遍历数组内部的所有对象。

while (true) {
  for (auto i = 0; i < 100; i++) {
    auto object = FuncObjectId(i);

    if (PlayerObject.IsEnemy(object) &&
        PlayerObject.Player.Position.Distance(object.Position) < 1000) {
      // enemies found in range
      FuncMoveTo(object)
    }
  }
}

但是如果在给定范围内有几个敌人怎么办?我该如何订购?

例如,按寿命或距离排序。 这样我的玩家就可以移到最近的目标或最低的健康目标。

此外,整个事情必须以某种方式重新设置。 杀死目标后,玩家不应停止, 他应该自动前往生命/最近位置最低的下一个敌人。

2 个答案:

答案 0 :(得分:1)

首先将循环更改为

for (auto i = 0; i < FuncObjectId.size(); i++)

为什么只寻找100个敌人?

如果玩家要一直移动,就不要寻找比1000更近的敌人,但是您必须按照与玩家的距离对其进行排序。 为此,您应该使用std :: sort http://www.cplusplus.com/reference/algorithm/sort/ 您可以使用此功能按所需参数对敌人进行排序。

答案 1 :(得分:1)

对于您给定的问题,我假设您的敌人列表比较短,例如少于一千。在这种情况下,您实际上不需要真正的排序,只需搜索最小的条目即可:

foreach($group as $item){
  $insert = array(
    'activity' => $item[0],
    'person' => $item[1],
    'startdate' => $item[2],
    'finishdate' => $item[3]
  );

  DB::table('test_tbl')->insert($insert);

}

但是,如果由于某些原因仍需要对它们进行实际排序,则最简单的方法是将它们存储在可排序的容器中(您可以编写一个容器,但只需使用minimal health found = health of first enemy corresponding index of enemy = index of first enemy for all enemies: if health enemy < minimal health found: minimal health found = health enemy corresponding index of enemy = index enemy std::vector )。在敌人的类中定义一个定义“小于”关系(std::list)的方法,然后将bool health_lower(const PlayerObject& a, const PlayerObject& b)与该方法一起用作比较器。

另一种方法是编写一个存储敌人列表的类,每当一个敌人被创建或一个人的生命值发生变化时,该类就会冒泡该特定敌人,就像其他敌人对每个人的顺序一样其他不变。