Cegui中的事件机制用的是观察者模式。需要订阅事件的类必须从EventSet继承:
订阅的一个感兴趣的事件调用EventSet的subscribeEvent,比如Render对DisplaySize改变感兴趣,它可以通过以下代码来订阅:
// subscribe to hear about display mode changes
d_rendererCon = d_renderer->subscribeEvent(Renderer::EventDisplaySizeChanged, Event::Subscriber(&CEGUI::System::handleDisplaySizeChange, this));
subscribeEvent的第一个参数为字符串,在Cegui中是通过字符串匹配来来触发相应事件;第二个参数是对触发的回调函数的一个封装。
一旦订阅好自己感兴趣的事件后,接着就是等着它触发了。
void DirectX9Renderer::setDisplaySize(const Size& sz)
{
if (d_display_area.getSize() != sz)
{
d_display_area.setSize(sz);
EventArgs args;
fireEvent(EventDisplaySizeChanged, args, EventNamespace);
}
}
从上面代码可以看到当DisplaySize改变的时候会生成一个EventArgs对象,然后调用fireEvent函数,EventArgs 是回调参数,用过C#的朋友一定很熟悉它.
最后fireEvent则根据传入的字符串EventDisplaySizeChanged来触发之前注册的回调函数。
完整的类图: