quick-cocos2d-x游戏开发【11】——多点触摸

在前面已经谈过单点触摸的用法了,所以对于多点触摸来说,也是非常简单容易的。


多点触摸其拥有added,removed这么两个独有事件。

added  屏幕中增加了一个触点

removed  屏幕中移除了一个触点


另外,还有这么一个event.points 屏幕中全部触点信息,

每一个触点依然可以获取到其,

point.x, point.y                         触摸点的当前位置
point.prevX, point.prevY         触摸点之前的位置
point.id                                     触摸点 id,用于确定触摸点的变化


结合单点触摸的几个事件,所以多点触摸事件发生时,会有began,added,moved,removed,ended,canclled这些响应事件。

你可能会疑惑began和added触发的顺序,我们在使用cocos2d-x c++的时候,多点触摸还是写在began当中,只是触摸点参数是一个集合,包含了全部触点的信息。但在quick中,将多点信息封装得更加方便。当第一个触点触摸到屏幕时,响应的是began事件,之后再有触点在屏幕时,就会触发added事件了,这样一来,我们就能清楚的知道玩家什么时候第二个手指也接触到屏幕了。如果在c++中,就需要再写些代码来判断了。


因此,removed和ended响应事件也就容易理解了触发顺序了,当有触点离开屏幕时,只要event.points中触点的个数大于等于2,那么会响应removed事件,当屏幕中最后一个触点离开时,会响应ended事件。


对于event.points中每个触点的信息,我们通过循环就可以依次获取了。

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. for id, point in pairs(event.points) do  
  2.     printf("%d, %f, %f", id, event.points[id].x, event.points[id].y)  
  3. end  


是不是很简单,好了,咱们来个完整点的代码,

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. function MyScene:ctor()   
  2.       
  3.     local layer = display.newLayer()  
  4.     self:addChild(layer)  
  5.     layer:setTouchEnabled(true)  
  6.     layer:setTouchMode(cc.TOUCH_MODE_ALL_AT_ONCE)  
  7.     layer:addNodeEventListener(cc.NODE_TOUCH_EVENT, function (event)  
  8.         if event.name == "began" or event.name == "added" then  
  9.             for id, point in pairs(event.points) do  
  10.                 printf("%d, %f, %f", id, event.points[id].x, event.points[id].y)  
  11.             end  
  12.         elseif event.name == "removed" then  
  13.             print("touch removed")  
  14.         elseif event.name == "moved" then  
  15.             print("touch moved")  
  16.         elseif event.name == "ended" then  
  17.             print("touch ended")  
  18.         end  
  19.   
  20.         return true  
  21.     end)  
  22.       
  23. end  

不过这个测试,只有放到真机上检验了,quick的模拟器还只能做单点检测。


此外,还要说明的一个就是,单点和多点触摸的区域,一旦一个node上有多个精灵,那么它的触摸响应区域则是它们共同区域的大小,下图中红色区域的大小。


这里要更正一个小问题,在第二节创建场景中,newScene的参数是场景的名称,这里需要和创建的lua文件名称相同,否则虽然在模拟器中运行没有问题,在android设备上就会提示没有找到这个lua文件。

所以我们之前创建的MyScene.lua文件,里面的代码需要更正下。

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. local MyScene = class("MyScene", function ()    
  2.     return display.newScene("MyScene") --场景名称要一致   
  3. end)   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值