第九章用户事件-键盘事件

Cocos2d-x学习笔记


键盘事件

键盘事件和触摸事件不同,它没有空间方面的信息。键盘事件不仅可以响应键盘,也可以响应设备的菜单。
键盘事件监听器是EventListenerKeyboard,其中属性如下:

  • std::function<void(EventKeyboard::KeyCode, Event *)> onKeyPressed:当键盘按下时回调该函数所指定的函数。
  • std::function<void(EventKeyboard::KeyCode, Event *)> onKeyReleased:当键抬起时回调该函数所指定的函数。

示例

void HelloWorld::onEnter()
{
    Layer::onEnter();
    log("HelloWorld onEnter");

    auto listener = EventListenerKeyboard::create();

    listener->onKeyPressed = [](EventKeyboard::KeyCode keyCode, Event * event) {
        log("Key with keycode % d pressed", keyCode);
    }

    listener->onKeyReleased = [](EventKeyboard::KeyCode keyCode, Event * event) {
        log("Key with keycode % d released", keyCode);
    }

    EventDispatcher * eventDispatcher = Director::getInstance()->getEventDispatcher();
    eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
}

鼠标事件

鼠标事件监听器是EventListenerMouse。

  • std::function<void(Event * event)> onMouseDown:当鼠标键按下时回调该属性所指定函数。
  • std::function<void(Event * event)> onMouseMove:当鼠标键移动时回调该属性所指定函数。
  • std::funtion<void(Event * event)> onMouseScroll:当鼠标滚轮滚动时回调该属性所指定函数。
  • std::funtion<void(Event * event)> onMouseUp:当鼠标键抬起时回调该属性所指定的函数。

示例

void HelloWorld::onEnter()
{
    Layer::onEnter();
    log("HelloWorld onEnter");

    auto listener = EventListenerMouse::create();

    listener->onMouseMove = [](Event * event) {
        EventMouse * e = (EventMouse *)event;
        log("Mouse Down detected, onMouseMove");
    };

    listener->onMouseUp = [](Event * event) {
        EventMouse * e = (EventMouse *)event;
        log("Mouse Down detected, onMouseUp");
    }

    listener->onMouseDown = [](Event * event) {
        EventMouse * e = (EventMouse *)event;
        log("Mouse Down detected, onMouseDown");
    }

    listener->onMouseScroll = [](Event * event) {
        EventMouse * e = (EventMouse *)event;
        log("Mouse Down detected, onMouseScroll");
    }

    EventDispatcher * eventDispatcher = Director::getInstance()->getEventDispatcher();
    eventDispatcher->addEventListenerWIthSceneGraphPriority(listener, this);
}

在层中进行事件处理

层时节点的派生类。我们可以在层中响应事件处理,但是层是一个非常特殊的节点,场景中的主要工作都是在层中完成的。因此,Layer定义了一些与事件相关的函数。

Layer中单点触摸事件相关的函数
  • bool onTouchBegan(Touch * touch, Event * event)
  • void onTouchCancelled(Touch * touch, Event * event)
  • void onTouchEnded(Touch * touch, Event * event)
  • void onTouchMoved(Touch * touch, Event * event)
Lyer中多点触摸事件相关的函数
  • void onTouchesBegan(const std::vector<Touch *>&touches, Event * event)
  • void onTouchesCancelled(const std::vector<Touch *>&touches, Event * event)
  • void onTouchesEnded(const std::vector<Touch *>&touches, Event * event)
  • void onTouchesMoved(const std::vector<Touch *>&touches, Event * event)
Layer中键盘事件相关的函数
  • void onKeyPressed(EventKeyboard::KeyCode keyCode, Event * event)
  • void onKeyReleased(EventKeyboard::KerCode keyCode, Event * event)
Layer中加速度事件相关的函数
  • void onAcceleration(Acceleration * arc, Event * event)

触摸事件

层中的触摸事件使用起来比较简单,由于事件监听的对象是层,而不是层中的精灵等对象,当判断是否点击了哪个精灵对象时比较麻烦,我们需要使用Rect的containsPoint函数逐一判断每个精灵对象。
在层中的触摸事件的一般流程开发是,首先在层的h文件中定义要重写的事件相关函数,代码如下:

class HelloWorld : public cocos2d::Layer
{
public:
···
    virtual bool onTouchBegan(cocos2d::Touch * touch, cocos2d::Event * event);
    virtual void onTouchMoved(cocos2d::Touch * touch, cocos2d::Event * event);
    virtual void onTouchEnded(cocos2d::Touch * touch, cocos2d::Event * event);

    CREATE_FUNC(HelloWorld);
}

然后在CPP文件中实现相关代码:

bool HelloWorld::init()
{
    if(!Layer::init())
    {
        return false;
    }
    ···
    setTouchEnabled(true);// 开始触摸事件的支持
    // 设置为单点触摸
    setTouchMode(Touch::DispathcMode::ONE_BY_ONE);

    return true;
}

// 重写三个事件函数
bool HelloWorld::onTouchBegan(Touch * touch, Event * event)
{
    log("onTouchBegan");
    ···
    return false;
}

void HelloWorld::onTouchMoved(Touch * touch, Event * event)
{
    log("onTouchMoved");
    ···
}

void HelloWorld::onTouchEnded(Touch * touch, Event * event)
{
    log("onTouchEnded");
    ···
}

有关事件处理的初始化可以放在onEnter函数中,也可以放在init函数中,与上次代码进行比较,可以发现,层中的事件处理比较简单,不需要注册监听器,不需要指定它的事件响应的优先级别,但也有缺点,在处理多个精灵的时候,不是很方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值