zoukankan      html  css  js  c++  java
  • cocos2dx-lua捕获用户touch事件的几种方式

    1.为每个关心的事件注册回调函数
    具体分为以下几种
    1>单点触摸
    注册函数为
    cc.Handler.EVENT_TOUCH_BEGAN = 40
    cc.Handler.EVENT_TOUCH_MOVED = 41
    cc.Handler.EVENT_TOUCH_ENDED = 42
    cc.Handler.EVENT_TOUCH_CANCELLED = 43
    注册的时候必须通过
    cc.EventListenerTouchOneByOne:create() 创建listener
    onTouchBegin/onTouchMove/onTouchEnd为自己注册的回调函数
    代码如下:
    local listener = cc.EventListenerTouchOneByOne:create();
    listener:registerScriptHandler(onTouchBegin,cc.Handler.EVENT_TOUCH_BEGAN);
    listener:registerScriptHandler(onTouchMove,cc.Handler.EVENT_TOUCH_MOVED);
    listener:registerScriptHandler(onTouchEnd,cc.Handler.EVENT_TOUCH_ENDED);

    2>多点点触摸
    cc.Handler.EVENT_TOUCHES_BEGAN = 44
    cc.Handler.EVENT_TOUCHES_MOVED = 45
    cc.Handler.EVENT_TOUCHES_ENDED = 46
    cc.Handler.EVENT_TOUCHES_CANCELLED = 47
    注册的时候必须通过
    cc.EventListenerTouchAllAtOnce:create() 创建listener
    onTouchesBegin/onTouchesMove/onTouchesEnd为自己注册的回调函数
    代码如下:
    local listener = cc.EventListenerTouchAllAtOnce:create();
    listener:registerScriptHandler(onTouchesBegin,cc.Handler.EVENT_TOUCHES_BEGAN);
    listener:registerScriptHandler(onTouchesMove,cc.Handler.EVENT_TOUCHES_MOVED);
    listener:registerScriptHandler(onTouchesEnd,cc.Handler.EVENT_TOUCHES_ENDED);

    最后通过下面的代码绑定listener
    cc.Director:getInstance():getEventDispatcher():addEventListenerWithSceneGraphPriority(listener,_layer);
    其中_layer是要需要事件的对象
    前面 cc.Director:getInstance() 也可用换成_layer 或者 _layer的父节点的对象

    这里有几点需要注意:
    1.onTouchesBegin/onTouchBegin 里面需要 return true,表示需要处理这个事件,不然不会掉用onTouchMove/onTouchEnd

    2.每个触摸函数都包含2个参数 以onTouchMove为例:
    local function onTouchMove(touch,event)
    end
    touch / event 都是userdata(可以理解为C/LUA共有的数据 只要实现了对应的方法 C/Lua可以直接访问/赋值/调用函数 由C管理这块内存)

    touch 是当前的触摸点 以下是它的方法
    /** Returns the current touch location in OpenGL coordinates.
    *
    * @return The current touch location in OpenGL coordinates.
    */
    Vec2 getLocation() const;
    /** Returns the previous touch location in OpenGL coordinates.
    *
    * @return The previous touch location in OpenGL coordinates.
    */
    Vec2 getPreviousLocation() const;
    /** Returns the start touch location in OpenGL coordinates.
    *
    * @return The start touch location in OpenGL coordinates.
    */
    Vec2 getStartLocation() const;
    /** Returns the delta of 2 current touches locations in screen coordinates.
    *
    * @return The delta of 2 current touches locations in screen coordinates.
    */
    Vec2 getDelta() const;
    /** Returns the current touch location in screen coordinates.
    *
    * @return The current touch location in screen coordinates.
    */
    Vec2 getLocationInView() const;
    /** Returns the previous touch location in screen coordinates.
    *
    * @return The previous touch location in screen coordinates.
    */
    Vec2 getPreviousLocationInView() const;
    /** Returns the start touch location in screen coordinates.
    *
    * @return The start touch location in screen coordinates.
    */
    如下面的代码可以在onTouchMove中直接获取 用户手指的移动距离
    local dis = touch:getDelta()
    print(dis.x,dis.y);
    如果是多点触摸 touch是一个table
    touch[1] touch[2] touch[3]…是触摸的对应点

    event 可以表明表明
    1.当前用户点击了那个object (event:getCurrentTarget())
    2.当前是press/move/release的那个状态 (event:getEventCode())
    cc.EventCode =
    {
    BEGAN = 0,
    MOVED = 1,
    ENDED = 2,
    CANCELLED = 3,
    }
    所以我们可以通过一个回调函数来判断当前是那个操作 而不用写3个函数

    示例代码

    local function onTouchBegin(touch,event)
    local p = touch:getLocation();
    p = _layer:convertToNodeSpace(p);
    print(p.x,p.y)
    return true;
    end

    local function onTouchMove(touch,event)
    end

    local function onTouchEnd(touch,event)
    end

    local function onTouchesBegin(touch,event)
    return true;
    end

    local function onTouchesMove(touch,event)

    end
    local function onTouchesEnd(touch,event)
    print(“onTouchesEnd”);
    end

    for i = 1,table.getn(touch) do  
        local location = touch[i]:getLocation()  
        print(i,location.x,location.y)
    end  
    _layer = cc.Layer:create();
    _layer:setTouchEnabled(true)
    local listener1 = cc.EventListenerTouchOneByOne:create();
    listener1:registerScriptHandler(onTouchBegin,cc.Handler.EVENT_TOUCH_BEGAN);
    listener1:registerScriptHandler(onTouchMove,cc.Handler.EVENT_TOUCH_MOVED);
    listener1:registerScriptHandler(onTouchEnd,cc.Handler.EVENT_TOUCH_ENDED);

    –多点触摸
    – local listener2 = cc.EventListenerTouchAllAtOnce:create()
    –listener2:registerScriptHandler(onTouchesBegin,cc.Handler.EVENT_TOUCHES_BEGAN )
    – listener2:registerScriptHandler(onTouchesMove,cc.Handler.EVENT_TOUCHES_MOVED )
    – listener2:registerScriptHandler(onTouchesEnd,cc.Handler.EVENT_TOUCHES_MOVED )

    local eventDispatcher = _layer:getEventDispatcher()
    eventDispatcher:addEventListenerWithSceneGraphPriority(listener1, _layer)
    --eventDispatcher:addEventListenerWithSceneGraphPriority(listener2, _layer)

    2.直接看代码

    local function onTouchEvent(state , … ) 
    local args
    = {…}; print(state); for k,v in pairs(args[1]) do print(k,v) end end

    _layer:registerScriptTouchHandler(onTouchEvent,true,0,false);

    @onTouchEvent 回调
    @ture表示捕获要捕获多点触摸
    @0优先级
    @false 是否吞没触摸事件
    如果是单点触摸 args[1] ->x,y,id
    如果是多点触摸 args[1] ->x1,y1,id1,x2,y2,id2

    这里cocos2dx-lua封装了 Layer:onTouch(callback, isMultiTouches, swallowTouches)
    建议直接使用

    这里如果你用cocos2dx-lua 的 lua-empty-test 做模板建立工程 有个bug
    需要在 didFinishLaunchingWithOptions 添加代码
    [eaglView setMultipleTouchEnabled:YES];
    来打开多点触摸

  • 相关阅读:
    【转载】SAP_ECC6.0_EHP4或SAP_ECC6.0_EHP5_基于Windows_Server_2008R2_和SQL_server_2008下的安装
    使用delphi 开发多层应用(二十四)KbmMW 的消息方式和创建WIB节点
    使用delphi 开发多层应用(二十三)KbmMW 的WIB
    实现KbmMw web server 支持https
    KbmMW 服务器架构简介
    Devexpress VCL Build v2014 vol 14.1.1 beta发布
    使用delphi 开发多层应用(二十二)使用kbmMW 的认证管理器
    KbmMW 4.50.00 测试版发布
    Basic4android v3.80 beta 发布
    KbmMW 认证管理器说明(转载)
  • 原文地址:https://www.cnblogs.com/aibox222/p/8656252.html
Copyright © 2011-2022 走看看