动态铸造实体一个好的设计

dynamic cast Entities A good design?

本文关键字:一个 实体 动态      更新时间:2023-10-16

对于我的游戏,

所有东西都从实体继承,然后其他东西,如Player、PhysicsObject等,从实体继承。物理引擎向A碰撞的B发送带有实体*的碰撞回调。然后,假设A是子弹,A试图将实体铸造为玩家,如果成功,则会降低玩家的生命值。

这个设计好吗?

感谢

我相信消息传递系统在某种程度上更适合您的"世界"。

Entity* target = ...;
bool    handled = target->send(M_COLLIDE, ...);

在这种情况下,您既不需要动态强制转换,也不需要检查动态强制转换的结果。

更新,这里有一个例子:

target->send(M_COLLECT, pMushroom);
...
Person::handle(uint message, Entity* the_thing)
{
  switch(message) 
  {
    case M_COLLECT: this->things.push( the_thing ); 
                    the_thing->send(M_COLLECTED_BY, this); break;
  }
}

Entity::handle(uint message, Entity* the_thing)实现可以封装到MSG_MAP_START、MSG_MAP_END和HANDLE_MSG(MSG)宏,因此您的代码看起来像:

MSG_MAP_START
   HANDLE_MSG(M_COLLECT)
   {
     this->things.push( the_thing ); 
     the_thing->send(M_COLLECTED_BY, this);
   }
   HANDLE_MSG(M_COLLECTED_BY) 
   {
     ...
   }
   ...
MSG_MAP_END

这方面的许多变化都是可能的。

顺便说一句,Objective-C在语言中内置了这种消息传递。有着极其丑陋的符号,但仍然如此。