[cocos2dx]点击android back虚拟键,关闭当前界面

版权声明:本文为博主原创文章,未经博主允许不得转载。 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()函数

猜你喜欢

转载自blog.csdn.net/ouyangshima/article/details/8670403