cocos2d学习笔记----监听器

303 阅读2分钟

监听器:

  • 触摸监听器(单点触摸/多点触摸)
    • 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);
    }
    
}