https://blog.youkuaiyun.com/wwj_748/article/details/38374723
本篇博客介绍Cocos2d-x 3.2Lua示例中点击移动的例子,在这个例子你可以得到如何创建单点触摸的事件和注册事件监听回调方法。

示例代码:
- --[[
- ClickAndMoveTest.lua
- 点击与移动
- ]]--
- -- 获取屏幕尺寸
- local size = cc.Director:getInstance():getWinSize()
- local layer = nil -- 层
- local kTagSprite = 1 --精灵标记
- local function initWithLayer()
- local sprite = cc.Sprite:create(s_pPathGrossini)
- -- 添加颜色层,黄色
- local bgLayer = cc.LayerColor:create(cc.c4b(255,255,0,255))
- layer:addChild(bgLayer, -1)
- -- 添加
- layer:addChild(sprite, 0, kTagSprite)
- -- 设置精灵位置到(20,150)
- sprite:setPosition(cc.p(20,150))
- -- 执行跳的动作,第一个参数为持续时间,第二个参数为位置,第三个参数为跳的高度,第四个参数跳的次数
- sprite:runAction(cc.JumpTo:create(4, cc.p(300,48), 100, 4))
- -- 背景层执行无限重复的动作序列,先淡进,再淡出
- bgLayer:runAction(cc.RepeatForever:create(cc.Sequence:create(
- cc.FadeIn:create(1),
- cc.FadeOut:create(1))))
- -- 触摸开始
- local function onTouchBegan(touch, event)
- return true
- end
- -- 触摸结束
- local function onTouchEnded(touch, event)
- -- 获取点击位置
- local location = touch:getLocation()
- -- 根据标记获取子节点
- local s = layer:getChildByTag(kTagSprite)
- s:stopAllActions()-- 停止所有动作
- -- 执行移动动作,移动到点击的位置
- s:runAction(cc.MoveTo:create(1, cc.p(location.x, location.y)))
- local posX, posY = s:getPosition() -- 获取精灵的位置
- local o = location.x - posX -- X轴的距离
- local a = location.y - posY -- Y轴的距离
- local at = math.atan(o / a) / math.pi * 180.0 --求角度 ,反正切函数求弧度/π*180.0
- --1弧度= 180/π, 1度=π/180
- -- 点击位置在下边
- if a < 0 then
- -- 点击位置在左边
- if o < 0 then
- at = 180 + math.abs(at)
- else
- -- 点击位置在右边
- at = 180 - math.abs(at)
- end
- end
- -- 执行旋转的动作
- s:runAction(cc.RotateTo:create(1, at))
- end
- -- 单点触摸的监听器
- local listener = cc.EventListenerTouchOneByOne:create()
- -- 注册两个回调监听方法
- listener:registerScriptHandler(onTouchBegan,cc.Handler.EVENT_TOUCH_BEGAN )
- listener:registerScriptHandler(onTouchEnded,cc.Handler.EVENT_TOUCH_ENDED )
- local eventDispatcher = layer:getEventDispatcher()-- 时间派发器
- -- 绑定触摸事件到层当中
- eventDispatcher:addEventListenerWithSceneGraphPriority(listener, layer)
- return layer
- end
- --------------------------------
- -- Click And Move Test
- --------------------------------
- function ClickAndMoveTest()
- cclog("ClickAndMoveTest")
- local scene = cc.Scene:create()
- layer = cc.Layer:create()
- initWithLayer()
- scene:addChild(layer)
- scene:addChild(CreateBackMenuItem())
- return scene
- end
Cocos2d-x有两种触摸事件,一种是单点触摸,一种是多点触摸,本篇博客例子使用的单点触摸事件。
EventListenerTouchOneByOne类
- -- 单点触摸的监听器
- local listener = cc.EventListenerTouchOneByOne:create()
- -- 注册两个回调监听方法
- listener:registerScriptHandler(onTouchBegan,cc.Handler.EVENT_TOUCH_BEGAN )
- listener:registerScriptHandler(onTouchEnded,cc.Handler.EVENT_TOUCH_ENDED )
- local eventDispatcher = layer:getEventDispatcher()-- 时间派发器
- -- 绑定触摸事件到层当中
- eventDispatcher:addEventListenerWithSceneGraphPriority(listener, layer)
最后的一个方法绑定节点到监听器中去,触摸优先级越低的越先被触摸。相同优先级的,后添加的先被触。