1

我正在尝试制作 2D 游戏(我的第一个)。我不是在寻找算法来确定物体是否碰撞,而是我应该如何组织一切。我很难弄清楚应该对哪个班级负责,以至于我开始感到愚蠢。=))

我想我的主要课程是Entity(及其孩子)和EntityManager。例如,Entity 应该提供什么接口?实体应该如何意识到它们与另一个实体发生冲突——管理者是否应该更新它们并将 a 传递给每个实体CollisionEvent的函数?handleCollision任何建议都非常受欢迎。

4

1 回答 1

2

我假设 EntityManager 包含所有实体,因此经理是需要检查所有实体之间的冲突的人。像这样

for(int i = 0 ; i < totalEntities ; ++i)
 for(int j = i+1 ; j < totalEntities ; ++j)
 {  
  CollisionInfo info;
  if( CheckCollision(entities[i], entities[j], info) )
  {
     // Okay, what we should do? I suggest two solutions

     // 1. simple one
     entities[i].OnCollide(info);
     entities[j].OnCollide(info);

     // 2. event-or-message driven system
     EventManager::Instance()->SendEvent(COLLISION_EVENT, info)
  }
}

第一个可能是最简单的。但是,如果有其他对象对此碰撞事件感兴趣怎么办?比如声音、日志或评分系统?即使是与该碰撞无关的实体也可能想要“知道”这个事件,以便他们可以改变他们的行为。(想想当它的孩子被你杀死时,老板怪物会更生气!)

所以,为了让它更灵活,#2 来了。首先,您需要拥有自己的event-or-message system(您可以将其视为 Windows 消息系统),其中对象可以订阅他们想要处理的特定消息。然后,EntityManager 可以简单地通过发送消息来传播碰撞事件。实体可以订阅此冲突消息类型,并且他们应该通过检查信息知道是否需要处理此特定冲突。同样,您的评分系统可以订阅它并计算新的击杀分数。

如果游戏足够简单,你可以选择#1,但我强烈推荐#2,你会非常满意。祝你好运!:)

于 2011-02-25T20:26:59.317 回答