版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ouyangshima/article/details/8670403
BaseKeyEvent头文件
//需要响应返回按钮的,继承这个类,重写 OnBaseKey
//EventKeyboard::KeyCode::KEY_BACK
class BaseKeyListener
{
public:
BaseKeyListener(void);
~BaseKeyListener(void);
virtual bool OnBaseKeyBack() = 0;
};
//继承这个,点返回直接remove,需要同时继承node
class BaseKeyListenerDoRemove : public BaseKeyListener
{
public:
BaseKeyListenerDoRemove(void){};
~BaseKeyListenerDoRemove(void){};
virtual bool OnBaseKeyBack();
};
class BaseKeyEvent
{
public:
static BaseKeyEvent* getInstance();
static void destroyInstance();
void AddListener(BaseKeyListener* p);
void RemoveListener(BaseKeyListener* p);
private:
BaseKeyEvent(void);
~BaseKeyEvent(void);
private:
std::vector<BaseKeyListener*> m_vListener;
};
BaseKeyEvent实现文件
BaseKeyListener::BaseKeyListener(void)
{
BaseKeyEvent::getInstance()->AddListener(this);
}
BaseKeyListener::~BaseKeyListener(void)
{
BaseKeyEvent::getInstance()->RemoveListener(this);
}
bool BaseKeyListenerDoRemove::OnBaseKeyBack()
{
auto p = this;
Node * p1 = dynamic_cast<Node * > (p);
if(p1)
{
p1->removeFromParent();
}
return true;
}
static BaseKeyEvent* gBKEventInstance = nullptr;
BaseKeyEvent* BaseKeyEvent::getInstance()
{
if (gBKEventInstance == nullptr) {
gBKEventInstance = new BaseKeyEvent;
}
return gBKEventInstance;
}
void BaseKeyEvent::destroyInstance()
{
if (gBKEventInstance) {
delete gBKEventInstance;
gBKEventInstance = nullptr;
}
}
BaseKeyEvent::BaseKeyEvent(void)
{
m_vListener.clear();
auto listener = EventListenerKeyboard::create();
listener->onKeyReleased = [this](EventKeyboard::KeyCode key, Event*){
if (m_vListener.size() > 0 && key == EventKeyboard::KeyCode::KEY_BACK) {
m_vListener[m_vListener.size() - 1]->OnBaseKeyBack();
}
};
EventDispatcher* dispatcher = Director::getInstance()->getEventDispatcher();
dispatcher->addEventListenerWithFixedPriority(listener, 1);
}
BaseKeyEvent::~BaseKeyEvent(void)
{
m_vListener.clear();
}
void BaseKeyEvent::AddListener(BaseKeyListener* p)
{
RemoveListener(p);
m_vListener.push_back(p);
}
void BaseKeyEvent::RemoveListener(BaseKeyListener* p)
{
for (auto it = m_vListener.begin(); it != m_vListener.end(); it++) {
if (*it == p) {
m_vListener.erase(it);
break;
}
}
}
使用
直接继承BaseKeyListenerDoRemove类就可以了;
或继承BaseKeyListener类,重写OnBaseKeyBack()函数