quick-cocos2d 拖拽事件

如上,左边是5个放指定装备属性的盒子,右边是一个滚动窗口,内有100个盒子,前5个盒子已经放有装备。

代码实现:

1、界面:左边由5个cc.LayerColor和1个Label组成,,右边添加一个cc.ui.UIScrollView,内部由100个cc.LayerColor填满。

2、拖拽项数据类,拖拽的核心是基于一对逻辑数据,分别为,盒子和拖拽物。self._dragItems = {}用来放数据类,将左边5个box和背包里100个盒子都加入self._dragItems,,并设置五个盒子的Group分别为1~5,而背包里的盒子所有的Group为1000。然后将5个装备放入背包的前5个盒子里(装备已设置tag为1~5)

3、添加触摸层,在触摸层里响应拖拽,由于拖拽的要覆盖所有界面ui(一个界面可能有多个不同的ui),所以z是很大的,,注册触摸监听事件addNodeEventListener,设置listener的onTouchBegan,onTouchMoved,onTouchEnded。

onTouchBegan:

是否点击到遮盖物,因为触摸层的优先级设置的最大,有些层级的按钮在拖拽物上面,如果点击按钮会优先进行拖拽,所以以需要把这个按钮注册成遮挡物,这样的话,如果按钮在盒子上面,点击按钮就可以安心的点击了,而不会触发拖拽。

扫描二维码关注公众号,回复: 2711153 查看本文章

遍历整个self._dragItems,得到拖拽项和其绑定的盒子,判断是否点击到了盒子并且盒子内有拖拽物,满足条件即可发生拖拽。然后计算触摸点与拖拽物锚点的坐标偏差值self._beanPoint。要注意的是触摸点得到的是世界坐标,需转换到基于触摸层的相对坐标。

onTouchMoved:

此过程拖拽物跟着鼠标一直在移动,就是让拖拽物从前一个坐标位置消失,添加到新的触摸点位置。其实就是不断更新坐标的过程。触摸点坐标减去坐标偏差值self._beanPoint,就是拖拽物新位置的坐标。

部分代码:

local dragPoint = self:convertToNodeSpace(point)
dragPoint = cc.p(dragPoint.x-self._beanPoint.x, dragPoint.y-self._beanPoint.y)
self._currentDragObj:retain()
self._currentDragObj:removeFromParent()
self:addChild(self._currentDragObj)
self._currentDragObj:release()
self._currentDragObj:setPosition(dragPoint)

onTouchEnded:

遍历整个self._dragItems,得到目标放置框和其绑定的盒子。

判断点击点是否离开当前物品所在框,如果没有离开当前物品所在框,则视为不做任何操作和回调。

如果拖拽离开盒子,点到其他盒子,得到该盒子的Group值,若为1000,即背包里的盒子则可以随意拖放,而背包里对应的装备只能装备到指定的位置上,即装备的tag值要与盒子的Group值一样。

如果目标框没有对象存在,则把拖拽物放到目标框。

self._currentDragObj:retain()
 --###ios新加
self._currentDragObj:removeFromParent()
--当前框设置空
self._currentDragItem:setDragObj(nil)
--目标框存放
self._currentDragObj:setOpacity(255)
target:setDragObj(self._currentDragObj)
self._currentDragObj:release()

如果目标框有对象存在,且不做交换处理:

self._currentDragObj:retain()
self._currentDragObj:removeFromParent()
self._currentDragItem:setDragObj(nil)
self._currentDragObj:setOpacity(255)
self._currentDragItem:setDragObj(self._currentDragObj)
self._currentDragObj:release()

如果目标框有对象存在,可以做交换处理:

if self.isExchangeModel then
--目标拖拽对象暂存
local tempTagObj = target.dragObj
target.dragObj:retain()
target:setDragObj(nil)

self._currentDragObj:retain()
 --当前框设置空
self._currentDragObj:removeFromParent()
self._currentDragItem:setDragObj(nil)
--目标框存放
self._currentDragObj:setOpacity(255)
target:setDragObj(self._currentDragObj)
self._currentDragObj:release()
--当前框置放目标框的对象
self._currentDragItem:setDragObj(tempTagObj)
tempTagObj:release()

猜你喜欢

转载自blog.csdn.net/Super_Cola/article/details/81324621