游戏实体:处理碰撞

时间:2011-02-25 19:41:31

标签: entity-relationship collision

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

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

1 个答案:

答案 0 :(得分: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,你会非常满意。祝好运! :)