quick-cocos2d-x 学习系列之七 drag

quick-cocos2d-x 学习系列之七 drag

该例主要是演示drag拖动的一些方法。主要是两个文件

一个DragScene.lua场景文件一个UIDrag.lua。两个文件的量都不小,那我们来细细品下吧。

1.DragScene

该场景定义个四个颜色C1,C2,C3,C4,定义了2个size 90X90和 80X80。

Ctor()函数定义了几个变量

self.t_data = {}

--拖拽对象

self.drag = nil

--索引

self._index = 0

self._indexMax = 3

调用几个函数

self:initUI()

self:_addUI()

--加载拖拽1

self:loadDrag1()

1.1_addUI函数

增加一个关闭按钮,一个向前按钮,向后按钮,重播按钮。这个3个按钮调用函数都是chaneLayer()函数,根据_index值的不同加载不同的函数

if self._index == 0 then

self:loadDrag1()

elseif self._index == 1 then

self:loadDrag2()

elseif self._index == 2 then

self:loadDrag3()

elseif self._index == 3 then

self:loadDrag4()

1.2initUI函数

通过函数createEquipmentBox来创建多个放装备的Box

创建一个Label显示“人物”

最后创建一个滚动的view如下:

self.view = cc.ui.UIScrollView.new(

{viewRect = cc.rect(0,0,bg:getContentSize().width,bg:getContentSize().height),direction = 1})

bg:addChild(self.view);

再创建100个用于存放装备的颜色层(LayerColor),在层上加上数字以表示第几个层。都存放在数组 t_data中。

最后将数组的颜色层填到哪个滚动view中。增加如下函数是的可以滚动。

SCROLL_HANDLER_SLIDE(self.view) S_XY(self.view:getScrollNode(),self.view:getViewRect().height-H(self.view:getScrollNode()))

1.3loadDrag1

这几个相似的函数都是加载UI的。

先创建一个对象UIDrag,赋值被变量self.drag,并添加到场景中。

创建武器盒子Box属性(共5个,这里只列一个,盒子拥有拖拽属性并设置其group)

self.drag:addDragItem(self.Box1):setGroup(1)

让背包(共100个格子)具备拖拽属性

self.drag:addDragItem(self.t_data[i]):setGroup(1000)

装备放入背包里

local equList = self:createEquipements()

下面函数将装备放入到UIDrag实例中的,_dragItems数组变量中。

self.drag:find(self.t_data[1]):setDragObj(equList[1])

此外还定义了三个函数

setonDragUpBeforeEvent,setonDragDownBeforeEvent,setonDragDownAfterEvent

其他三个函数loadDrag2,loadDrag3,loadDrag4大同小异。

2.UIDragItem

定义一个类UIDragItem.

源码中注释如下:

@param Box 绑定的盒子,此参数必须有。盒子是已经存在在其它容器里对象。 type:node

@param obj 拖拽物 type:node --可选

@param z 拖拽物对于盒子z的加成。 type:int --可选

@param tag 标记,用于拖拽事件的逻辑判定 type:int --可选

3.UIDrag

类UIDrag,考虑到拖拽本身是个大触摸层。

设置变量:

--放置框

self._dragItems = {}

--遮挡集合

self._hinderList = {}

--当前拖拽项

self._currentDragItem = nil

--当前拖拽物

self._currentDragObj = nil

--拖拽替换功能

self.isExchangeModel = false

--拖拽对象镜像模型

self.isISOModel = false

-- self._isBean = false

--标记第一次移动

self._isOnBean = false

self._beanPoint = cc.p(0,0)

如果初始化时候有带参数,则直接赋值给_dragItems.

定义事件:

--事件

--拖拽之前

self._onDragUpBeforeEvent = function(currentItem,point) return true end

--拖拽之后

self._onDragUpAfterEvent = function(currentItem,point) end

--拖拽移动之前

self._onDragMoveBeforeEvent = function(currentItem,point) end

--拖拽移动

self._onDragMoveEvent = function(currentItem,dragObj,worldPoint,dragPoint) end

--拖拽放下之前

self._onDragDownBeforeEvent = function(currentItem,targetItem,point) return true end

--拖拽放下之后

self._onDragDownAfterEvent= function(currentItem,point) end

--设置层的SIZE大小

S_SIZE(self,display.width,display.height)

self:setTouchEnabled(true)

--增加触摸监听,根据事件调用不同的函数

self:addNodeEventListener(cc.NODE_TOUCH_EVENT,function(event)

if event.name == "began" then

if self:onTouchBegan(cc.p(event.x,event.y)) then

return true

end

return false

elseif event.name == "moved" then

self:onTouchMoved(cc.p(event.x,event.y))

elseif event.name == "ended" then

self:onTouchEnded(cc.p(event.x,event.y))

end

end)

3.1onTouchBegan

UIDrag类中3个触摸相关的函数是理解拖拽的关键,需要细细查看之。

Begin函数显示判断是否点击到遮盖物,如果点击到遮盖物就直接退出

然后循环检测点击到哪个物品,直到找到被拖拽的物品。

同时设置一些变量:

self._isOnBean = true

--当前操作项

self._currentDragItem = item

--当前拖拽物

self._currentDragObj = self._currentDragItem.dragObj

以备下面函数使用。

3.2onTouchMoved

计算得到移动点坐标。

判断_ isOnBean变量值,进行相关函数调用

包括保留该物品,从父节点移除,如果设置了镜像就进行复制处理,最重要的动态的改变物品的位置。

3.3onTouchEnded

遍历所有的物品,判断是否离开了当前所在框,没有离开则不做任何操作和回调。如果离开了之前所在的框,则判断是否有对象,以及是否支持交换。

3.4Find函数

实现放装备到包。

在初始化loadDrag函数的时候,需要将装备放入到背包中。调用FIND函数

查看_dragItems数组中的是否与传入参数想的呢过,如果相等则返回当前的_dragItems[i].

该数组中每个变量都不一样。

3.5setDragObj函数

函数传入参数obj.

该参数是表示正在拖拽的对象,如果不存在,则把当前的变量self.dragObj从父节点移除,并设置为nil,最后返回self.

如果存在,则设置self.dragObj=obj

找到self.dragBox的中心点,设置盒子和拖拽物的坐标,最后设置拖拽物的坐标。

3.6addDragItem

一个盒子变成可拖拽的,创建一个UIDragItem类对象,第一个参数表示盒子,第二个参数表示放入盒子的对象,第三个参数表示Z坐标,第四个参数表示tag。并加入到UIDrag._dragItems变量中。

最后返回该UIDragItem类。

3.7handler_ScrollView

判断是否按中。

如果没有按中则返回true,按中则返回false.

if scroll:getScrollNode():hitTest(point) then

local rect = scroll:getViewRect()

local lp = scroll:convertToWorldspace(cc.p(0,0))

local temp = cc.rect(lp.x,lp.y,rect.width,rect.height)

if not cc.rectContainsPoint(temp,point) then

return true

end

end

return false

3.8setonDragUpBeforeEvent

拖拽前事件

设置变量如:self._onDragUpBeforeEvent = fun

Fun是setonDragUpBeforeEvent函数的输入参数。

函数在DragScene:LoadDrag1函数中被设置。

具体实现是:

拖拽物之前,判断是否触摸到SCROLL内部窗体。

3.9setonDragDownBeforeEvent

同setonDragUpBeforeEvent

放下拖拽物之前,判定是否真正的触摸到scroll的内部窗体

3.10setonDragDownAfterEvent

拖拽物之后输出打印信息。“放下成功”

4.其他函数

4.1S_SIZE函数

定义在文件Utility.lua中。

S_SIZE = function(node,w,h) if not node thenreturn nil end returnnode:setContentSize(cc.size(w,h)); end

设置NODE的长和宽,如果NODE为空则直接返回NIL。

4.2SIZE

SIZE = function(node)

if not node then return nil end

local size = node:getContentSize()

if size.width == 0 and size.height == 0 then

local w,h = node:getLayoutSize()

return cc.size(w,h)

else

return size

end

end

获取NODE的大小,如果长、宽有一个为0,则返回Layout大小。

4.3X

X = function(node) if not node then return nilend return node:getPositionX(); end

返回输入参数node的x位置坐标。

4.4Y

Y = function(node) if not node then return nilend return node:getPositionY(); end

返回输入参数node的Y位置坐标。

4.5XY

XY = function(node) if not node then return nilend return node:getPosition(); end

返回坐标

4.6S_X

S_X = function(node,x) if not node then returnnil end node:setPosition(cc.p(x,Y(node)));end

设置X坐标

4.7S_Y

S_Y = function(node,y) if not node then returnnil endnode:setPosition(cc.p(X(node),y)); end

设置Y坐标

4.8S_XY

S_XY = function(node,x,y) if not node thenreturn nil end node:setPosition(x,y);end

设置XY坐标

4.9W

W = function(node) if not node then return nilend return SIZE(node).width; end

返回NODE的宽度

4.10W2

W2 = function(node) if not node then return nilend return W(node)/2;end

返回宽度的1/2

4.11H2

返回高度的1/2

4.12H

返回高度

4.13AX

AX = function(node) if not node then return nilend return node:getAnchorPoint().x; end

返回NODE的锚点坐标X

4.14AY

返回NODE的锚点坐标y

4.15SCROLL_HANDLER_SLIDE

SCROLL_HANDLER_SLIDE = function(scvollView)

scvollView.scrollListener_ = SCROLL_EVENT_SLIDE

end

函数设置scrollView的scrollListener为SCROLL_EVENT_SLIDE.

此处就是设置了Scrollview的触摸监听函数

该常量指向函数如下。根据状态设置变量SCROLL_EVENT_STATUS值。

SCROLL_EVENT_SLIDE =function(event)

if event.name== "began" then

returntrue

elseifevent.name == "moved" then SCROLL_EVENT_STATUS = -1

elseifevent.name == "ended" then SCROLL_EVENT_STATUS = 0 end

end

SCROLL_EVENT_STATUS 变量用于标记scroll是否滑动之类的状态。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是