我正在尝试制作2D游戏(我的第一个游戏)。我不是在寻找算法来确定物体是否发生碰撞,而是我应该如何组织一切。我很难弄清楚应该对哪个课程负责,以至于我开始感到愚蠢。 =))
我想我的主要课程是Entity
(及其子女)和EntityManager
。例如,实体应该提供什么接口?实体应该如何意识到它们与另一个实体发生冲突 - 管理者是否应该更新它们并将CollisionEvent
传递给每个实体的handleCollision
函数?任何建议都受到欢迎。
答案 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,你会非常满意。祝好运! :)