如同android中的用户交互,cocos2d-x通常也需要对一些用户点击、触摸事件进行监听;
一、 简单触摸事件
auto listener = EventListenerTouchAllAtOnce::create();
listener->onTouchesBegan = [](const std::vector<Touch*>&, Event*) {
log("onTouchesBegan");
};
listener->onTouchesMoved = [](const std::vector<Touch*>& ts, Event* e) {
log(" touch count is %ld" +ts.size());
};
Director::getInstance()->getEventDispatcher()
->addEventListenerWithSceneGraphPriority(listener, this);
触摸事件使用的监听接口是EventListenerTouchAllAtOnce,他有如下几个触摸事件回调函数;
public:
std::function<void(const std::vector<Touch*>&, Event*)> onTouchesBegan;
std::function<void(const std::vector<Touch*>&, Event*)> onTouchesMoved;
std::function<void(const std::vector<Touch*>&, Event*)> onTouchesEnded;
std::function<void(const std::vector<Touch*>&, Event*)> onTouchesCancelled;
4个函数不再说明具体对应功能,函数名已经表示得很清楚;
二、触摸事件传递
有时候需要对角摸事件一个一个的进行捕获,此时就需要用到EventListenerTouchOneByOne,它也有几个回调函数;
public:
std::function<bool(Touch*, Event*)> onTouchBegan;
std::function<void(Touch*, Event*)> onTouchMoved;
std::function<void(Touch*, Event*)> onTouchEnded;
std::function<void(Touch*, Event*)> onTouchCancelled;
注:onTouchBean返回值为bool类型
auto listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = [](Touch *t, Event * e) {
log("onTouchBegan");
return true;
};
listener->onTouchMoved = [](Touch* t, Event * e) {
log("onTouchMoved");
};
Director::getInstance()->getEventDispatcher()
->addEventListenerWithSceneGraphPriority(listener, this);
注意onTouchBegan事件,如果后面要继续获取其它触摸事件,需要让返回值为true;返回值true表示事件还要继续向后传递;
实际上,cocos2d-x为了程序运行的效率,如果返回值为false,表示事件不再向后传递,将不再捕获onTouchMoved等事件;返回true的时候,才表示事件还要向后传递;
三、加速传感器
Device::setAccelerometerEnabled(true); // @1
auto listener = EventListenerAcceleration::create([](Acceleration* a, Event*) {
log("x:%g,y:%g,z:%g", a->x, a->y, a->z);
});
Director::getInstance()->getEventDispatcher()
->addEventListenerWithSceneGraphPriority(listener, this);
上面是一个简单的使用加速传感器的例子,需要注意的是 @1 要设置启用加速传感器
四、按键事件
在Iphone手机上,不用处理按键事件,主要使用在android手机上,如同android
sdk中的按键事件一样,cocos2d-x也会返回一个按键对应的code;
auto listener = EventListenerKeyboard::create();
listener->onKeyReleased = [](EventKeyboard::KeyCode code, Event * e) {
log(" keycode is %d", code);
switch (code) {
case EventKeyboard::KeyCode::KEY_BACKSPACE:
Director::getInstance()->end(); // @1:cocos2d中,默认按返回键是不会退出应用程序的,需要添加处理才能退出应用程序
break;
default:
break;
}
};
Director::getInstance()->getEventDispatcher()
->addEventListenerWithSceneGraphPriority(listener, this);
注:@1
时间: 2024-10-29 19:11:48