• [cocos2d-x 3.0] 触摸显示器


    一、基本使用

    1、首先,声明一个监听器

    有两种,EventListenerTouchOneByOne 和 EventListenerTouchAllAtOnce,前者是单点触控。后者是多点触控。后者我没怎么用过。不是非常了解。所以这里主要讲单点触控。

    2、实现触碰监听各种事件的相应回调方法

    这里也有两种

    1)CC_CALLBACK_2 回调机制

    2)   直接用Lambda 表达式

    3、注冊监听

    演示样例

    1) 用CC_CALLBACK_2 回调机制

        //声明监听
        auto listener = EventListenerTouchOneByOne::create();
        
        //实现监听回调
        listener->onTouchBegan = CC_CALLBACK_2(Test::onTouchBegan, this);
    
        listener->onTouchMoved = CC_CALLBACK_2(Test::onTouchMoved, this);
        
        listener->onTouchEnded = CC_CALLBACK_2(Test::onTouchEnded, this);
        
        //注冊监听
        _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
    三个回调方法,这里没有写详细的内容
    bool Test::onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *event)
    {
        return true;
    }
    
    void Test::onTouchMoved(cocos2d::Touch *touch, cocos2d::Event *event)
    {
        
    }
    
    void Test::onTouchEnded(cocos2d::Touch *touch, cocos2d::Event *event)
    {
        
    }
    2) 用Lambda 表达式
        //声明监听
        auto listener = EventListenerTouchOneByOne::create();
        
        //实现监听回调
        listener->onTouchBegan = [](Touch * touch, Event *event){
            
            return true;
        };
        listener->onTouchMoved = [](Touch * touch, Event *event){
            
        };
        
        listener->onTouchEnded = [](Touch * touch, Event *event){
            
        };
        
        //注冊监听
        _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
    假设不是要反复多次使用的回调方法的话。用Lambda是非常不错的选择,直观,能省不少事。只是Lambda事实上也能多次调用的。这个暂且不说。

    二、拖动精灵移动

    这个我们要做下面步骤

    1、获取触碰坐标

    2、推断这个坐标是否包括在精灵里

    3、获取鼠标(即我们手指移动)移动的差值

    4、精灵移动对应的距离和方向

        listener->onTouchMoved = [=](Touch * touch, Event *event){
            
            //获取触碰坐标----这里getLocation()这种方法会自己主动将坐标转换成openGL坐标。不用我们手动转换
            auto touchPos = touch->getLocation();
            
            //推断是否在精灵里
            if (sp->getBoundingBox().containsPoint(touchPos)) {
                
                //获取差值
                auto movePos = touch->getDelta();
                
                //精灵移动
                sp->setPosition(sp->getPosition() + movePos);
            }
        };
    这里我要说一下getDelta()这种方法。曾经获取差值是要我们自己计算的,通过getPreviousLocation()这种方法获取上次的坐标,然后与如今的坐标相减来算出。如今已经有算差值的方法了。还是挺贴心的- -。

    哦对了。这里这个Lambda表达式须要在[ ]里面加 = 号,表示值传递。这像人才的外部引用和修改变量。关于本可以去看看Lambda要使用

    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    VS安装部署
    C#与C/C++的交互
    3、C#入门第3课
    登录接口,猜年龄
    安装sql server 2016 always on配置dtc支持时遇到的问题
    购物车第一版
    Oracle patch查看路径
    innobackup增量备份脚本
    在vmware workstation下安装linux6关闭防火墙
    线程池-连接池-JDBC实例-JDBC连接池技术
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4875121.html
Copyright © 2020-2023  润新知