Cocos2d-x 3.2 Lua示例 ActionTest(动作测试)
2014年博文大赛,请投上您宝贵的一票:http://vote.blog.csdn.net/Article/Details?articleid=38272837
移动开发狂热者群: 299402133,欢迎广大开发者加入
Cocos2d-x官方真够给力的,3.1.1还没有熟悉完,3.2就出来,本篇博客继续介绍Cocos2d-x的Lua示例,关于3.2的例子变动不是很大,稍微介绍一下3.2的新特性吧:
3.2版本的新特性
* 新的3D动画节点Animation3D/Animate3D
* 支持fbx-conv工具生成Sprite3D支持的二进制格式
* 支持游戏手柄
* 支持快速瓦片地图
* 加入utils::cpatureScreen方法用于截屏
* Physics body支持缩放和旋转
* 加入Node::enumerateChildren 和 utils::findChildren方法,且支持C++ 11的正则表达式
* 加入Node::setNormalizedPosition方法, Node的位置像素会根据它的服节点的尺寸大小计算
想了解更多详细的内容,可以这个链接:http://cn.cocos2d-x.org/tutorial/show?id=1180
本篇博客继续介绍Lua的一个实例,这个实例基本上涵盖了Cocos2d-x的所有基本动作,在这个例子中Cocos2d-x Lua开发者可以了解到如何来使用这些动作。
小巫这里根据官网文档类给大家解析一遍,也顺便加深自己的印象:
注:笔者不把一大段代码贴出来,分段解释比较舒服一点
MoveBy:通过修改节点对象的位置属性来改变节点对象的x,y像素。 x,y的坐标是相对于这个对象的位置来说的。 几个MoveBy动作可以同时被调用,最终的运动是这几个单独运动的综合
MoveTo:移动节点对象到位置x,y。x,y是绝对坐标,通过修改它的位置属性来改变它们的值。 几个MoveTo动作可以被同时调用,并且最终的运动是几个单独运动的综合。
---------------------------------------- ActionMove-- 动作移动--------------------------------------local function ActionMove() -- 创建层 local layer = cc.Layer:create() -- 初始化层 initWithLayer(layer) centerSprites(3) -- MoveBy动作 local actionBy = cc.MoveBy:create(2, cc.p(80, 80)) -- MoveBy的逆反操作 local actionByBack = actionBy:reverse() -- tamara:runAction(cc.MoveTo:create(2, cc.p(size.width - 40, size.height - 40))) grossini:runAction(cc.Sequence:create(actionBy, actionByBack)) kathia:runAction(cc.MoveTo:create(1, cc.p(40, 40))) Helper.subtitleLabel:setString("MoveTo / MoveBy") return layerend
ScaleTo:缩放动作ScaleBy: 缩放动作,继承自ScaleTo,提供reverse方法
---------------------------------------- ActionScale-- 动作缩放--------------------------------------local function ActionScale() local layer = cc.Layer:create() initWithLayer(layer) centerSprites(3) -- ScaleTo,第一个参数是缩放时间,第二个参数为缩放因子 local actionTo = cc.ScaleTo:create(2.0, 0.5) -- ScaleBy, 第一个参数为缩放时间,第二、三个参数为缩放因子 local actionBy = cc.ScaleBy:create(2.0, 1.0, 10.0) local actionBy2 = cc.ScaleBy:create(2.0, 5.0, 1.0) -- 执行动作 grossini:runAction(actionTo) -- 执行动作序列,先正常缩放,然后反执行相反操作 tamara:runAction(cc.Sequence:create(actionBy, actionBy:reverse())) kathia:runAction(cc.Sequence:create(actionBy2, actionBy2:reverse())) Helper.subtitleLabel:setString("ScaleTo / ScaleBy") return layerend
RotateBy类/RotateTo:旋转一个节点
---------------------------------------- ActionRotate-- 动作旋转--------------------------------------local function ActionRotate() local layer = cc.Layer:create() initWithLayer(layer) centerSprites(3) -- RotateTo,第一个参数为持续时间,第二个参数为旋转角度 local actionTo = cc.RotateTo:create( 2, 45) local actionTo2 = cc.RotateTo:create( 2, -45) local actionTo0 = cc.RotateTo:create(2 , 0) -- 执行动作序列,先选择45度之后, tamara:runAction(cc.Sequence:create(actionTo, actionTo0)) -- RotateBy,持续时间为2秒,旋转360度 local actionBy = cc.RotateBy:create(2 , 360) local actionByBack = actionBy:reverse() -- 相反操作 grossini:runAction(cc.Sequence:create(actionBy, actionByBack)) local action0Retain = cc.RotateTo:create(2 , 0) kathia:runAction(cc.Sequence:create(actionTo2, action0Retain)) Helper.subtitleLabel:setString("RotateTo / RotateBy") return layerend
SkewTo:通过修改节点对象的skewX和skewY属性来使节点对象倾斜到一个给定的角度。
SkewBy:通过skewX和skewY的度数来使节点对象倾斜。
---------------------------------------- ActionSkew-- 斜歪动作--------------------------------------local function ActionSkew() local layer = cc.Layer:create() initWithLayer(layer) centerSprites(3) -- SkewTo,第一个参数是持续时间,第二个参数是X轴倾斜的角度,第三个是Y轴的倾斜角度 local actionTo = cc.SkewTo:create(2, 37.2, -37.2) local actionToBack = cc.SkewTo:create(2, 0, 0)-- 返回的一个动作 local actionBy = cc.SkewBy:create(2, 0.0, -90.0) local actionBy2 = cc.SkewBy:create(2, 45.0, 45.0) local actionByBack = actionBy:reverse() -- 三个精灵执行动作序列 tamara:runAction(cc.Sequence:create(actionTo, actionToBack)) grossini:runAction(cc.Sequence:create(actionBy, actionByBack)) kathia:runAction(cc.Sequence:create(actionBy2, actionBy2:reverse())) Helper.subtitleLabel:setString("SkewTo / SkewBy") return layerend
--ActionRotationalSkewVSStandardSkew--轮转的倾斜动作和标准的倾斜动作local function ActionRotationalSkewVSStandardSkew() local layer = cc.Layer:create() initWithLayer(layer) -- 从父节点中删除一个节点,有一个cleanup参数。 如果这个节点是一个孤节点,那么什么都不会发生。 tamara:removeFromParent(true); grossini:removeFromParent(true); kathia:removeFromParent(true); -- 返回以点为单位的 OpenGL 视图的大小 local s = cc.Director:getInstance():getWinSize(); -- 宽高均为100的盒子 local boxSize = cc.size(100.0, 100.0); -- 创建层颜色块,c4b,第一个参数是r,代表红色,第二个参数是g,代表绿色,第三个参数是b,代表蓝色,第四个参数是a,代表透明度 local box = cc.LayerColor:create(cc.c4b(255,255,0,255)); -- 设置锚点 box:setAnchorPoint(cc.p(0.5,0.5)); -- 设置盒子大小 box:setContentSize( boxSize ); -- 设置锚点为(0,0)当你摆放这个节点的时候。 -- 这是一个内部方法,仅仅被Layer和Scene使用。不要在框架外调用。 默认值是false,但是在Layer和Scene中是true. box:ignoreAnchorPointForPosition(false); -- 设置显示位置 box:setPosition(cc.p(s.width/2, s.height - 100 - box:getContentSize().height/2)); -- 添加到层中 layer:addChild(box); -- 创建一个标签 local label = cc.Label:createWithTTF("Standard cocos2d Skew", s_markerFeltFontPath, 16); -- 设置锚点,这里是中心 label:setAnchorPoint(cc.p(0.5, 0.5)) label:setPosition(cc.p(s.width/2, s.height - 100 + label:getContentSize().height)); layer:addChild(label); -- X轴倾斜360度 local actionTo = cc.SkewBy:create(2, 360, 0); -- 动作返回 local actionToBack = cc.SkewBy:create(2, -360, 0); local seq = cc.Sequence:create(actionTo, actionToBack) -- 运行动作序列 box:runAction(seq); -- 创建层黄颜色块,c4b,第一个参数是r,代表红色,第二个参数是g,代表绿色,第三个参数是b,代表蓝色,第四个参数是a,代表透明度 box = cc.LayerColor:create(cc.c4b(255,255,0,255)); box:setAnchorPoint(cc.p(0.5,0.5)); box:setContentSize(boxSize); box:ignoreAnchorPointForPosition(false); box:setPosition(cc.p(s.width/2, s.height - 250 - box:getContentSize().height/2)); layer:addChild(box); label = cc.Label:createWithTTF("Rotational Skew", s_markerFeltFontPath, 16); label:setAnchorPoint(cc.p(0.5, 0.5)) label:setPosition(cc.p(s.width/2, s.height - 250 + label:getContentSize().height/2)); layer:addChild(label); local actionTo2 = cc.RotateBy:create(2, 360, 0); local actionToBack2 = cc.RotateBy:create(2, -360, 0); seq = cc.Sequence:create(actionTo2, actionToBack2) box:runAction(seq); Helper.subtitleLabel:setString("Skew Comparison") return layer;end
---------------------------------------- ActionSkewRotate-- 歪斜+旋转+缩放--------------------------------------local function ActionSkewRotate() -- 创建层 local layer = cc.Layer:create() initWithLayer(layer) -- 从父节点移除子节点 tamara:removeFromParent(true) grossini:removeFromParent(true) kathia:removeFromParent(true) -- 盒子大小 local boxSize = cc.size(100.0, 100.0) -- 层颜色,第1、2、3分别为红绿篮颜色值,第4个为透明度值 local box = cc.LayerColor:create(cc.c4b(255, 255, 0, 255)) -- 设置锚点 box:setAnchorPoint(cc.p(0, 0)) -- 设置位置 box:setPosition(190, 110) -- 设置内容大小 box:setContentSize(boxSize) --标记大小 local markrside = 10.0 local uL = cc.LayerColor:create(cc.c4b(255, 0, 0, 255)) box:addChild(uL) uL:setContentSize(cc.size(markrside, markrside)) uL:setPosition(0, boxSize.height - markrside) uL:setAnchorPoint(cc.p(0, 0)) local uR = cc.LayerColor:create(cc.c4b(0, 0, 255, 255)) box:addChild(uR) uR:setContentSize(cc.size(markrside, markrside)) uR:setPosition(boxSize.width - markrside, boxSize.height - markrside) uR:setAnchorPoint(cc.p(0, 0)) layer:addChild(box) -- 三个动作SkewTo、RotateTo、ScaleTo local actionTo = cc.SkewTo:create(2, 0, 2) local rotateTo = cc.RotateTo:create(2, 61.0) local actionScaleTo = cc.ScaleTo:create(2, -0.44, 0.47) local actionScaleToBack = cc.ScaleTo:create(2, 1.0, 1.0) local rotateToBack = cc.RotateTo:create(2, 0) local actionToBack = cc.SkewTo:create(2, 0, 0) -- 顺序执行三个动作序列 box:runAction(cc.Sequence:create(actionTo, actionToBack)) box:runAction(cc.Sequence:create(rotateTo, rotateToBack)) box:runAction(cc.Sequence:create(actionScaleTo, actionScaleToBack)) Helper.subtitleLabel:setString("Skew + Rotate + Scale") return layerend
JumpTo类:模仿跳跃的轨迹移动节点JumpBy类:模仿跳跃的轨迹移动节点.提供reverse方法
---------------------------------------- ActionJump-- 跳的动作--------------------------------------local function ActionJump() -- 创建层 local layer = cc.Layer:create() initWithLayer(layer) centerSprites(3) -- 模仿跳跃的轨迹移动节点,第一个参数为持续时间,第二个参数为位置,第三个参数为跳的高度,第四个参数跳的次数 local actionTo = cc.JumpTo:create(2, cc.p(300,300), 50, 4) local actionBy = cc.JumpBy:create(2, cc.p(300,0), 50, 4) local actionUp = cc.JumpBy:create(2, cc.p(0,0), 80, 4) local actionByBack = actionBy:reverse()-- 相反操作 -- 执行actionTo动作 tamara:runAction(actionTo) -- 执行序列动作 grossini:runAction(cc.Sequence:create(actionBy, actionByBack)) -- 执行无限循环动作 kathia:runAction(cc.RepeatForever:create(actionUp)) Helper.subtitleLabel:setString("JumpTo / JumpBy") return layerend
CardinalSplineBy类:基础曲线路径
---------------------------------------- ActionCardinalSpline-- 曲线运动--------------------------------------local function ActionCardinalSpline() local layer = cc.Layer:create() initWithLayer(layer) centerSprites(2) -- 位置数组 local array = { cc.p(0, 0), cc.p(size.width / 2 - 30, 0), cc.p(size.width / 2 - 30, size.height - 80), cc.p(0, size.height - 80), cc.p(0, 0), } -- 创建一个连续的基础曲线动作的点数组集合 local action = cc.CardinalSplineBy:create(3, array, 0) -- 返回执行与本Action对象相反操作的新Action对象 local reverse = action:reverse() -- 动作序列 local seq = cc.Sequence:create(action, reverse) tamara:setPosition(cc.p(50, 50)) tamara:runAction(seq) -- 第一个参数是duration:持续时间,第二个参数为位置数组,第三个参数为tension,表示张力 local action2 = cc.CardinalSplineBy:create(3, array, 1) local reverse2 = action2:reverse() -- 创建动作序列 local seq2 = cc.Sequence:create(action2, reverse2) kathia:setPosition(cc.p(size.width / 2, 50)) kathia:runAction(seq2) --[[ local function drawCardinalSpline() kmGLPushMatrix() kmGLTranslatef(50, 50, 0) cc.DrawPrimitives.drawCardinalSpline(array, 0, 100) kmGLPopMatrix() kmGLPushMatrix() kmGLTranslatef(size.width / 2, 50, 0) cc.DrawPrimitives.drawCardinalSpline(array, 1, 100) kmGLPopMatrix() end array:retain() local glNode = gl.glNodeCreate() glNode:setContentSize(cc.size(size.width, size.height)) glNode:setAnchorPoint(cc.p(0.5, 0.5)) glNode:registerScriptDrawHandler(drawCardinalSpline) layer:addChild(glNode,-10) glNode:setPosition( size.width / 2, size.height / 2) ]]-- Helper.titleLabel:setString("CardinalSplineBy / CardinalSplineAt") Helper.subtitleLabel:setString("Cardinal Spline paths.\nTesting different tensions for one array") return layerend
CatmullRomBy类 :这是一个按照笛卡尔曲线移动目标点的动作.
---------------------------------------- ActionCatmullRom-- 笛卡尔曲线运动--------------------------------------local function ActionCatmullRom() local layer = cc.Layer:create() initWithLayer(layer) centerSprites(2) -- 设置精灵位置 tamara:setPosition(cc.p(50, 50)) -- 定义位置数组 local array = { cc.p(0, 0), cc.p(80, 80), cc.p(size.width - 80, 80), cc.p(size.width - 80, size.height - 80), cc.p(80, size.height - 80), cc.p(80, 80), cc.p(size.width / 2, size.height / 2), } -- 创建笛卡尔曲线运动,第一个参数为持续时间,第二个参数为位置数组 local action = cc.CatmullRomBy:create(3, array) local reverse = action:reverse()-- 相反操作 -- 创建动作序列 local seq = cc.Sequence:create(action, reverse) tamara:runAction(seq) local array2 = { cc.p(size.width / 2, 30), cc.p(size.width -80, 30), cc.p(size.width - 80, size.height - 80), cc.p(size.width / 2, size.height - 80), cc.p(size.width / 2, 30), } local action2 = cc.CatmullRomTo:create(3, array2) local reverse2 = action2:reverse() local seq2 = cc.Sequence:create(action2, reverse2) kathia:runAction(seq2) --[[ local function drawCatmullRom() kmGLPushMatrix() kmGLTranslatef(50, 50, 0) cc.DrawPrimitives.drawCatmullRom(array, 50) kmGLPopMatrix() cc.DrawPrimitives.drawCatmullRom(array2,50) end array:retain() array2:retain() local glNode = gl.glNodeCreate() glNode:setContentSize(cc.size(size.width, size.height)) glNode:setAnchorPoint(cc.p(0.5, 0.5)) glNode:registerScriptDrawHandler(drawCatmullRom) layer:addChild(glNode,-10) glNode:setPosition( size.width / 2, size.height / 2) ]]-- -- 设置标题 Helper.titleLabel:setString("CatmullRomBy / CatmullRomTo") Helper.subtitleLabel:setString("Catmull Rom spline paths. Testing reverse too") return layerend
BezierBy类:贝塞尔曲线动作。提供reverse方法,用于执行相反操作
BezierTo类:贝塞尔曲线动作。
请发表评论