cocos2d-x基础 - 用户交互事件处理

試著忘記壹切 提交于 2020-02-02 00:44:01

cocos2d-x基础 - 用户交互事件处理

1. 单触摸点

单触摸点的侦听器定义方式:

auto listener = EventListenerTouchOneByOne::create();

接下来定义单触摸点事件函数:

// 触摸开始
listener->onTouchBegan = [](Touch *t, Event *e){

    if (e->getCurrentTarget()->getBoundingBox().containsPoint(t->getLocation())) {
        log("点击事件");
    }

    return true;    // onTouchBegan如果后面还有侦听移动和结束信息就要true
};

// 触摸点移动
listener->onTouchMoved = [](Touch *t, Event *e){
    if (e->getCurrentTarget()->getBoundingBox().containsPoint(t->getLocation())) {
        log("触摸点移动了");
    }
};

//
listener->onTouchEnded = [](Touch *t, Event *e){
    if (e->getCurrentTarget()->getBoundingBox().containsPoint(t->getLocation())) {
        log("触摸结束");
    }
};

可以看到一共有三种触摸事件

注意其中触摸事件的传递,只有在onTouchBegin>中返回true才能启动后面的移动和结束侦听函数

2. 多触摸点

多触摸点的侦听器的定义方式:

auto listener = EventListenerTouchAllAtOnce::create();  // 多点触控的侦听器

实现多点触控:

// 多触摸点
listener->onTouchesBegan = [](std::vector<Touch*> ts, Event *e){
    log("多点触摸开始");
};
//
listener->onTouchesMoved = [](std::vector<Touch*> ts, Event *e){
    log("%ld points in total", ts.size());
};

listener->onTouchesEnded = [](std::vector<Touch*> ts, Event *e){
    log("多点触摸结束");
};

Director::getInstance()
    ->getEventDispatcher()>addEventListenerWithSceneGraphPriority(listener, this);

在iphone上调试时发现只能侦测到一个点,原因是未开启多点触控支持,解决方法如下:

ios文件夹下的RootViewController.mm文件中修改如下:

// Enable or disable multiple touches   // 开启或关闭多点触控
[eaglView setMultipleTouchEnabled:YES];

就可以实现多点触控了:

3. 加速度传感器

使用方法:

Device::setAccelerometerEnabled(true);  // 开启加速度传感器
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(
    EventListenerAcceleration::create([](Acceleration *a, Event *e){

        // 内容
        log("加速度传感器:x=%.7lf, y=%.7lf, z=%.7lf", a->x, a->y, a->z);

    }), this);

这里直接在函数中间创建了一个事件侦听器,侦听的对象是当前场景的全局

使用闭包函数直接给create方法添加具体的函数内容

实现效果:

在这里插入图片描述

侦测到了手机的各方向的加速度变化

4. 侦听物理按键

实现方法:

auto listener = EventListenerKeyboard::create();
listener->onKeyReleased = [](EventKeyboard::KeyCode code, Event *e){
    log("key code : %d", code);   // 输出按键代码
    // 用switch实现按下某返回键时关闭程序
    switch (code) {
        case EventKeyboard::KeyCode::KEY_BACKSPACE:
            // 关闭程序
            Director::getInstance()->end();
            break;
        default:
            break;
    }
};

由于iPhone只有home键,而且home键侦听不到,就不做演示了

想要在iphone中响应home键,可以修改AppDelegate.cpp中的两个方法:

void AppDelegate::applicationDidEnterBackground()	// 进入后台
void AppDelegate::applicationWillEnterForeground()	// 回到前台
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!