如何通过单个事件最好地解决多个组件修改?

我试图通过一个事件来解决多个组件的修改。 有没有更好的方法来处理这个问题?

我有一个标签实体,关心盾牌实体的生命值组件何时被修改(损坏,再生等)。

标签将需要更改

  • 其文本显示当前屏蔽剩余的百分比。
  • 其文本颜色来显示屏蔽剩余的严重性。

当我的ShieldSystemparsinghitPoints组件时,运行下面的代码。 对于我计划倾听的eahtypes的修改,我需要为for -loop添加一个新的if -statement。 这意味着如果不止一个人想要修改任何监听的文本组件,sprite组件等,系统之间有一堆重复的代码。

 for(int i =0; i < listeners.size(); i++) { if(listeners.count(MessageType::CHANGE_TEXT) == 1) { std::vector<Entity*> entities = listeners[MessageType::CHANGE_TEXT]; for(int j; j < entities.size(); j++) { Entity* e = entities[j]; MessageInfo* messageInfo = new MessageInfo(MessageType::CHANGE_TEXT, e, "Some Text"); MessageCenter::Dispatch(messageInfo); } } // Add an If(listeners.count(MessageType::CHANGE_TEXT_COLOR)... // Add an If(listeners.count(MessageType::CHANGE_SPRITE_RECT)... // etc } 

一种简单易用的方法是让用户发出消息types。

查看一些示例实现 (请参阅Messenger.h和.cpp)。

这个想法是让用户做这样的事情:

 // Subscribe to a particular message type as a user messenger.Subscribe( MSG_type, CallThisFunction ); // Notify the client messenger.Emit( MSG_type ) // calls CallThisFunction 

传递消息参数的好方法是使用一些通用的方式发送数据。 然后你可以让用户(在这种情况下,在CallThisFunction内部处理检索数据(types转换,或其他一些更智能的方式)),这样通知者可以使用一个备用的Emit版本:

 // Notify the client with 4 params, pass each // param to the CallThisFunction messenger.Emit( MSG_type, somePtr, 5, 1.0f, "a string" ); 

总而言之,这大部分看起来像一个API问题。