键盘鼠标等事件响应机制

发表于2016-04-05
评论0 698浏览
  在说明其他事件处理机制之前,先看看c++11中的一个新特性lambda表达式,也就是匿名函数,当我们的函数比较小,代码量少的时候,为了简洁和效率使用匿名函数,用法如下。
int x = 10;
    //使用lambda表达式的好处是简洁效率高,当你的函数只有一行代码的时候用它省的定义函数了,如果函数的代码很多
    //最好写成普通的函数,lambda是代替函数指针的一个好方法
    //lambda表达式(匿名函数)[]代表的就是一个lambda表达式,()是函数的参数列表,{}是函数体,->void代表的是返回值类型
    auto func = [](int i)->void
    {
        std::cout<<"hello cocos!"<
        std::cout<
    };
    /*
    []中可以填写如下的一些内容
    [] 不截取任何变量
    [&} 截取外部作用域中所有变量,并作为引用在函数体中使用
    [=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
    [=, &foo]   截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
    [bar]   截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量
    [this]  截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。
    */
    auto func2 = [x]()
    {
        std::cout<
        //这里的return是默认的,在lambda表达式处没有写
       return x;
    };
    func(2);
    func2();
  先来看对键盘事件的响应,用法和触摸事件的处理类似。除了键盘,还可以是终端设备的各个菜单,他们使用同一个监听器来进行处理,下面看看代码中如何使用。
bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }
    //键盘事件处理监听器
    auto listener = EventListenerKeyboard::create();
    //和回调函数绑定
    listener->onKeyPressed = CC_CALLBACK_2(HelloWorld::onKeyPressed,this);
    listener->onKeyReleased = CC_CALLBACK_2(HelloWorld::onKeyReleased,this);
    //添加到事件分发器中
    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,this);
    return true;
}
void HelloWorld::onKeyPressed(EventKeyboard::KeyCode keyCode,Event * pEvent)
{
    CCLOG("keycode %c is pressed!",keyCode);
    //KEY_KP_UP = 0x10B8
    if(keyCode == EventKeyboard::KeyCode::KEY_UP_ARROW)
        CCLOG("up");
    else if(keyCode == EventKeyboard::KeyCode::KEY_DOWN_ARROW)
        CCLOG("down");
    else if(keyCode == EventKeyboard::KeyCode::KEY_LEFT_ARROW)
        CCLOG("left");
    else if(keyCode == EventKeyboard::KeyCode::KEY_RIGHT_ARROW)
        CCLOG("right");
}
void HelloWorld::onKeyReleased(EventKeyboard::KeyCode keyCode,Event * pEvent)
{
    CCLOG("keycode %c is released!",keyCode);
}


//鼠标处理事件监听器
    auto mouse_listener = EventListenerMouse::create();
    mouse_listener->onMouseDown = [](Event * pEvent)
    {
        CCLOG("down");
    };
    mouse_listener->onMouseUp = [](Event * pEvent)
    {
        CCLOG("up");
    };
    mouse_listener->onMouseMove =  [](Event * pEvent)
    {
         EventMouse* e = (EventMouse*)pEvent;
         CCLOG("MousePosition X: %f , Y:%f",e->getCursorX(),e->getCursorY());
    };
    mouse_listener->onMouseScroll = [](Event * pEvent)
    {
        CCLOG("scroll");
    };
    _eventDispatcher->addEventListenerWithSceneGraphPriority(mouse_listener,this);


  还有加速度计事件监听器和自定义的事件监听器,因为没有用到这里就不写了,大家自己研究吧。事件监听器的移除可以使用_eventDispatcher->removeEventListener(listener);这个方法是移除指定的事件监听器的,_eventDispatcher->removeAllEventListeners();是移除所有的事件监听器,包括菜单的事件监听器,所以我们最好使用第一种方法。

  加入GAD的核心用户QQ群:484290331,各类活动奖励任你拿,最新资讯任你读,众多教学任你免费学,如此好地方赶紧加入吧!另VR专属群:476511561,专业VR技术分享,专业导师指导为你答疑解惑,大型小型活动奖励等你拿,免费学习赚奖励的天地,欢迎你加入哟!

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引