监听器:
- 触摸监听器(单点触摸/多点触摸)
EventListenerTouchOneByOne单点触摸EventListenerTouchAllAtOnce多点触摸
- 键盘监听器:
EventListenerKeyboard - 鼠标监听器:
EventListenerMouse - 加速监听器:
EventListenerAcceleration - 自定义监听器:
EventListenerCustom
EventListener是所有监听器的父类
-
创建监听器
-
创建监听对应的阶段函数
-
将监听器添加到分发器(分发消息)中
- 创建单点触摸监听器
EventListenerTouchOneByOne* eventListener = EventListenerTouchOneByOne::create();- 创建监听对于的阶段函数(触摸分为四个阶段)
- 触摸开始(return true表示执行后面三个阶段 return false 表示不执行后面三个阶段)
- 触摸移动
- 触摸结束
- 触摸取消
-
绑定事件 CC_CALLBACK_形参的个数(类名::函数名,调用的对象)
eventListener->onTouchBegan = CC_CALLBACK_2(Hero::onTouchBegan, this); eventListener->onTouchMoved = CC_CALLBACK_2(Hero::onTouchMoved, this); -
将监听器添加到事件分发中
- 第一种方式:通过渲染优先级添加:1.监听器 2.节点
_eventDispatcher->addEventListenerWithSceneGraphPriority(eventListener, this);- 第二种方式:通过固定优先级:1.监听器 2.优先级(值越小,越先监听事件)
_eventDispatcher->addEventListenerWithFixedPriority(eventListener,1); -
设置是否吞噬触摸:默认不吞噬(是否将触摸事件传递给下一个监听者)
eventListener->setSwallowTouches(false);
代码演示
当触摸开始时,要执行的函数
bool Hero::onTouchBegan(Touch* touch, Event* event) {
if (isShield == true) {
isMove = true;
}
//获取触摸点:屏幕坐标系(左上角为原点,y轴向下)
//需要屏幕转OpenGL坐标系
Vec2 touchPoint = touch->getLocation();
//Rect:1.containsPoint(点) 是否包含某个点
// 2.intersectsRect(矩形) 判断两个矩形是否相交
//getBoundingBox是获取原始矩形的宽高,如果对其做了缩放,获取到的矩形还是原始矩形
bool isContain = getBoundingBox().containsPoint(touchPoint);
//判断触摸的那个点是否在英雄的身上
if (isContain) {
return true;
}
return false;
}
当触摸移动时,要执行的函数
void Hero::onTouchMoved(Touch* touch, Event* event) {
if(isMove) {
//获取当前移动的值
Vec2 pos = touch->getLocation();
//判断飞机的位置应该在(0-480)之间
if (pos.x >= 480) {
pos = Vec2(480 - getContentSize().width / 2, pos.y);
} else if (pos.x <= 0) {
pos = Vec2(getContentSize().width / 2, pos.y);
}
//判断飞机的y轴可移动的值应该在(0-800)之间
if (pos.y >= (800 - getContentSize().height / 2)) {
pos = Vec2(pos.x, (800 - getContentSize().height / 2));
} else if (pos.y <= getContentSize().height / 4) {
pos = Vec2(pos.x, getContentSize().height / 4);
}
//判断是否创建了僚机
if (leftWa != nullptr && rightWa != nullptr) {
leftWa->setPosition(Vec2(getPosition().x - 60, getPosition().y + 30));
rightWa->setPosition(Vec2(getPosition().x + 60, getPosition().y + 30));
}
setPosition(pos);
}
}