C++ 有没有更好的方法来创建EventManager
我为我的C++ 有没有更好的方法来创建EventManager,c++,sfml,C++,Sfml,我为我的EventManager编写了一个小代码,它工作正常,但问题是,我用大量的复制粘贴创建了它,我认为每次你开始在几行上进行复制粘贴时,你的代码设计都很糟糕 因此,在EventManager上做了大量的复制粘贴之后,我认为是时候找出是否有其他方法来实现它了(可能有,也可能更好) 我实现的是,当事件发生时(window.pollEvent(Event)),它调用EventManager类的onEvent(sf::Event,sf::RenderWindow*)方法,对于我需要侦听的每个事件,我
EventManager
编写了一个小代码,它工作正常,但问题是,我用大量的复制粘贴创建了它,我认为每次你开始在几行上进行复制粘贴时,你的代码设计都很糟糕
因此,在EventManager
上做了大量的复制粘贴之后,我认为是时候找出是否有其他方法来实现它了(可能有,也可能更好)
我实现的是,当事件发生时(window.pollEvent(Event)
),它调用EventManager
类的onEvent(sf::Event,sf::RenderWindow*)
方法,对于我需要侦听的每个事件,我调用侦听器的所有实例
下面是课程:
public:
void registerKeyPressed(std::shared_ptr<KeyPressedEventListener> listener);
void registerWindowResized(std::shared_ptr<WindowResizedEventListener> listener);
void registerWindowFrameUpdate(std::shared_ptr<WindowFrameUpdateEventListener> listener);
private:
std::vector<std::shared_ptr<KeyPressedEventListener>> m_keyPressedListeners;
std::vector<std::shared_ptr<WindowResizedEventListener>> m_windowResizedListeners;
std::vector<std::shared_ptr<WindowFrameUpdateEventListener>> m_windowFrameUpdateListeners;
我必须为每个事件复制此代码。如果有一个bug,你知道要纠正它需要很多工作,所以我希望你能帮助我找到一个更好的方法来实现它
谢谢您的帮助。您可以使用普通类:
class EventHandler{
public:
virtual void handle(sf::RenderWindow &window) = 0;
};
class EventManager {
public:
void registerKeyPressed(std::shared_ptr<EventHandler> listener);
void registerWindowResized(std::shared_ptr<EventHandler> listener);
void registerWindowFrameUpdate(std::shared_ptr<EventHandler> listener);
private:
std::vector<std::shared_ptr<EventHandler>> m_keyPressedListeners;
std::vector<std::shared_ptr<EventHandler>> m_windowResizedListeners;
std::vector<std::shared_ptr<EventHandler>> m_windowFrameUpdateListeners;
}
类事件处理程序{
公众:
虚拟空句柄(sf::RenderWindow&window)=0;
};
类事件管理器{
公众:
void registerKeyPressed(std::shared_ptr listener);
无效的寄存器为空(std::shared\u ptr listener);
无效注册表Windows框架更新(std::shared_ptr listener);
私人:
std::向量m_按键监听器;
std::vector m_windowResizedListeners;
std::向量m_windowFrameUpdateListeners;
}
现在可以在类中定义映射,键是事件类型,值是他的侦听器的向量
std::map<int,std::vector<std::shared_ptr<EventHandler>>*> eventType;
}
//...
EventManager::EventManager(){
eventType[sf::EventType::Resized] = &m_windowResizedListeners;
eventType[sf::EventType::KeyPressed] = &m_keyPressedListeners;
//Keep going...
}
std::map eventType;
}
//...
EventManager::EventManager(){
eventType[sf::eventType::Resized]=&m_windowResizedListeners;
eventType[sf::eventType::KeyPressed]=&m_keyPressedListeners;
//继续。。。
}
现在,OneEvent函数非常简单:
void EventManager::onEvent(sf::Event event, sf::RenderWindow* window) {
std::vector<std::shared_ptr<EventHandler>>* ptr = eventType[event.type];
for (int i = 0;i < ptr->size();i++)
(*ptr)[i]->handle(window);
}
void EventManager::onEvent(sf::事件,sf::RenderWindow*窗口){
std::vector*ptr=eventType[event.type];
对于(int i=0;isize();i++)
(*ptr)[i]->手柄(窗口);
}
让我们举一个例子:
class SettingsSaver : public EventHandler{
public:
void handle(sf::RenderWindow &window) override {
std::cout << "I am saving the state in the hardrive before of exit" << std::endl;
}
}
class MoveHero : public EventHandler{
public:
void handle(sf::RenderWindow &window) override {
std::cout << "I am moving the character" << std::endl;
}
}
// Main
std::shared_ptr<EventHandler> settingsSaver(new SettingsSaver);
std::shared_ptr<EventHandler> moveHero(new MoveHero);
EventManager manager;
manager.registerWindowClosed(settingsSaver);
manager.registerKeyPressed(moveHero);
类设置版本:公共事件处理程序{
公众:
无效句柄(sf::RenderWindow和window)覆盖{
std::难道你不能在OneVent中使用window参数吗?我进一步使用它,我只是不想显示6个侦听器的代码,因为这完全是一样的。嗯,谢谢!但是我怎样才能让一个类侦听,比方说,keyPressed
和windowResized
事件?对不起,我有点不好:客户端应该扩展EventHandler类并定义handle()函数的行为。我假设您知道“多态性”和“抽象类”。是的,我知道它^^我只是不知道如何知道它是哪个事件,但我想我将只使用sf::Event参数来检查handle()中的事件函数。@MegalovaniaPowa否否,我将用example@MegalovaniaPowa现在检查一下:)
class SettingsSaver : public EventHandler{
public:
void handle(sf::RenderWindow &window) override {
std::cout << "I am saving the state in the hardrive before of exit" << std::endl;
}
}
class MoveHero : public EventHandler{
public:
void handle(sf::RenderWindow &window) override {
std::cout << "I am moving the character" << std::endl;
}
}
// Main
std::shared_ptr<EventHandler> settingsSaver(new SettingsSaver);
std::shared_ptr<EventHandler> moveHero(new MoveHero);
EventManager manager;
manager.registerWindowClosed(settingsSaver);
manager.registerKeyPressed(moveHero);