《Cocos2d-x-3.2 Lua-tests》文件详解 之 进度条ActionsProgress
顾名思义,ProgressTimer的动画也是一种Action
创建ProgressTimer需要接收一个Sprite做参数,ProgressTimer可以理解为对Sprite的进一步封装。
下面是代码:
1 -- 2 local s = cc.Director:getInstance():getWinSize() 3 4 ------------------------------------ 5 -- SpriteProgressToRadial 6 ------------------------------------ 7 local function SpriteProgressToRadial() 8 --布局 9 local layer = cc.Layer:create() 10 Helper.initWithLayer(layer) 11 12 --创建进度条动作,2秒钟,飙到100% 13 local to1 = cc.ProgressTo:create(2, 100) 14 local to2 = cc.ProgressTo:create(2, 100) 15 16 --用一个精灵 创建进度条 17 local left = cc.ProgressTimer:create(cc.Sprite:create(s_pPathSister1)) 18 --进度条类型:旋转型 19 left:setType(cc.PROGRESS_TIMER_TYPE_RADIAL) 20 left:setPosition(cc.p(100, s.height / 2)) 21 22 --运行Action,这里用了一个cc.RepeatForever,其实下面那句效果相同。这是ProgressTimer与Sprite的区别 23 left:runAction(cc.RepeatForever:create(to1)) 24 --left:runAction(to1) 25 layer:addChild(left) 26 27 local right = cc.ProgressTimer:create(cc.Sprite:create(s_pPathBlock)) 28 right:setType(cc.PROGRESS_TIMER_TYPE_RADIAL) 29 -- Makes the ridial CCW 反向 30 right:setReverseDirection(true) 31 right:setPosition(cc.p(s.width - 100, s.height / 2)) 32 right:runAction(cc.RepeatForever:create(to2)) 33 layer:addChild(right) 34 35 Helper.subtitleLabel:setString("ProgressTo Radial") 36 return layer 37 end 38 39 ------------------------------------ 40 -- SpriteProgressToHorizontal 41 ------------------------------------ 42 --[[ 43 线性进度条,两点: 44 1、setMidpoint()设置起点,参数类为cc.p() 45 2、setBarChangeRate()设置进度增长的方向,cc.p() 46 --]] 47 local function SpriteProgressToHorizontal() 48 local layer = cc.Layer:create() 49 Helper.initWithLayer(layer) 50 51 local to1 = cc.ProgressTo:create(2, 100) 52 local to2 = cc.ProgressTo:create(2, 100) 53 54 local left = cc.ProgressTimer:create(cc.Sprite:create(s_pPathSister1)) 55 left:setType(cc.PROGRESS_TIMER_TYPE_BAR) 56 57 --以下两句密不可分 58 -- 从x = 0% 的地方为起点, 59 left:setMidpoint(cc.p(0, 0)) 60 -- 沿x轴增长 61 left:setBarChangeRate(cc.p(1,0)) 62 63 left:setPosition(cc.p(100, s.height / 2)) 64 left:runAction(cc.RepeatForever:create(to1)) 65 layer:addChild(left) 66 67 local right = cc.ProgressTimer:create(cc.Sprite:create(s_pPathSister2)) 68 right:setType(cc.PROGRESS_TIMER_TYPE_BAR) 69 70 --以下两句密不可分 71 --从x = 100%的地方为起点 72 right:setMidpoint(cc.p(1, 0)) 73 --逆着x轴增长 74 right:setBarChangeRate(cc.p(1, 0)) 75 76 right:setPosition(cc.p(s.width - 100, s.height / 2)) 77 right:runAction(cc.RepeatForever:create(to2)) 78 layer:addChild(right) 79 80 Helper.subtitleLabel:setString("ProgressTo Horizontal") 81 return layer 82 end 83 84 ------------------------------------ 85 -- SpriteProgressToVertical 86 ------------------------------------ 87 --还是线性进度条,只不过setMidpoint()和setBarChangeRage()不同,多感受一下这两个方法吧 88 --顺便提一下,场景过度cc.Transition中有一种cc.TransitionFadeBL的过渡动画,就是用这两个方法配合格子动画做到的 89 local function SpriteProgressToVertical() 90 local layer = cc.Layer:create() 91 Helper.initWithLayer(layer) 92 93 local to1 = cc.ProgressTo:create(2, 100) 94 local to2 = cc.ProgressTo:create(2, 100) 95 96 local left = cc.ProgressTimer:create(cc.Sprite:create(s_pPathSister1)) 97 left:setType(cc.PROGRESS_TIMER_TYPE_BAR) 98 99 left:setMidpoint(cc.p(0,0)) 100 left:setBarChangeRate(cc.p(0, 1)) 101 102 left:setPosition(cc.p(100, s.height / 2)) 103 left:runAction(cc.RepeatForever:create(to1)) 104 layer:addChild(left) 105 106 local right = cc.ProgressTimer:create(cc.Sprite:create(s_pPathSister2)) 107 right:setType(cc.PROGRESS_TIMER_TYPE_BAR) 108 109 right:setMidpoint(cc.p(0, 1)) 110 right:setBarChangeRate(cc.p(0, 1)) 111 112 right:setPosition(cc.p(s.width - 100, s.height / 2)) 113 right:runAction(cc.RepeatForever:create(to2)) 114 layer:addChild(right) 115 116 Helper.subtitleLabel:setString("ProgressTo Vertical") 117 return layer 118 end 119 120 ------------------------------------ 121 -- SpriteProgressToRadialMidpointChanged 122 ------------------------------------ 123 local function SpriteProgressToRadialMidpointChanged() 124 local layer = cc.Layer:create() 125 Helper.initWithLayer(layer) 126 127 local action = cc.ProgressTo:create(2, 100) 128 129 -- Our image on the left should be a radial progress indicator, clockwise 130 local left = cc.ProgressTimer:create(cc.Sprite:create(s_pPathBlock)) 131 132 --旋转型进度,可设置中心点的位置 133 --将ProgressTimer看成是左下角坐标为(0,0),右上角为(1,1)的图形,你可以随便在这里面挑一个坐标为中心点 134 --需要注意的是:不要取到边框上的点 135 left:setType(cc.PROGRESS_TIMER_TYPE_RADIAL) 136 left:setMidpoint(cc.p(0.5, 0.75)) 137 138 left:setPosition(cc.p(100, s.height / 2)) 139 left:runAction(cc.RepeatForever:create(cc.ProgressTo:create(2, 100))) 140 layer:addChild(left) 141 142 -- Our image on the left should be a radial progress indicator, counter clockwise 143 local right = cc.ProgressTimer:create(cc.Sprite:create(s_pPathBlock)) 144 right:setType(cc.PROGRESS_TIMER_TYPE_RADIAL) 145 right:setMidpoint(cc.p(0.1, 0.9)) 146 147 --[[ 148 Note the reverse property (default=NO) is only added to the right image. That's how 149 we get a counter clockwise progress. 150 ]] 151 right:setPosition(cc.p(s.width - 100, s.height / 2)) 152 right:runAction(cc.RepeatForever:create(cc.ProgressTo:create(2, 100))) 153 layer:addChild(right) 154 155 Helper.subtitleLabel:setString("Radial w/ Different Midpoints") 156 return layer 157 end 158 159 ------------------------------------ 160 -- SpriteProgressBarVarious 161 ------------------------------------ 162 --还是线性进度不过是setMidpoint()和setBarChangeRate()设置的位置不同而已,不多说 163 local function SpriteProgressBarVarious() 164 local layer = cc.Layer:create() 165 Helper.initWithLayer(layer) 166 167 local to = cc.ProgressTo:create(2, 100) 168 169 local left = cc.ProgressTimer:create(cc.Sprite:create(s_pPathSister1)) 170 left:setType(cc.PROGRESS_TIMER_TYPE_BAR) 171 172 -- Setup for a bar starting from the bottom since the midpoint is 0 for the y 173 left:setMidpoint(cc.p(0.5, 0.5)) 174 -- Setup for a vertical bar since the bar change rate is 0 for x meaning no horizontal change 175 left:setBarChangeRate(cc.p(1, 0)) 176 left:setPosition(cc.p(100, s.height / 2)) 177 left:runAction(cc.RepeatForever:create(cc.ProgressTo:create(2, 100))) 178 layer:addChild(left) 179 180 local middle = cc.ProgressTimer:create(cc.Sprite:create(s_pPathSister2)) 181 middle:setType(cc.PROGRESS_TIMER_TYPE_BAR) 182 -- Setup for a bar starting from the bottom since the midpoint is 0 for the y 183 middle:setMidpoint(cc.p(0.5, 0.5)) 184 -- Setup for a vertical bar since the bar change rate is 0 for x meaning no horizontal change 185 middle:setBarChangeRate(cc.p(1, 1)) 186 middle:setPosition(cc.p(s.width/2, s.height/2)) 187 middle:runAction(cc.RepeatForever:create(cc.ProgressTo:create(2, 100))) 188 layer:addChild(middle) 189 190 local right = cc.ProgressTimer:create(cc.Sprite:create(s_pPathSister2)) 191 right:setType(cc.PROGRESS_TIMER_TYPE_BAR) 192 -- Setup for a bar starting from the bottom since the midpoint is 0 for the y 193 right:setMidpoint(cc.p(0.5, 0.5)) 194 -- Setup for a vertical bar since the bar change rate is 0 for x meaning no horizontal change 195 right:setBarChangeRate(cc.p(0, 1)) 196 right:setPosition(cc.p(s.width-100, s.height/2)) 197 right:runAction(cc.RepeatForever:create(cc.ProgressTo:create(2, 100))) 198 layer:addChild(right) 199 200 Helper.subtitleLabel:setString("ProgressTo Bar Mid") 201 return layer 202 end 203 204 ------------------------------------ 205 -- SpriteProgressBarTintAndFade 206 ------------------------------------ 207 --线性进度条。进度条中加入其他Action,注意,这个例子有亮点 208 --进度Action 和普通Action在同一进度条上面可以同时播放/////////,不讲究顺序,即便不用前面提到的Spawn 209 local function SpriteProgressBarTintAndFade() 210 local layer = cc.Layer:create() 211 Helper.initWithLayer(layer) 212 213 local to = cc.ProgressTo:create(6, 100) 214 local tint = cc.Sequence:create(cc.TintTo:create(1, 255, 0, 0), cc.TintTo:create(1, 0, 255, 0), cc.TintTo:create(1, 0, 0, 255)) 215 local fade = cc.Sequence:create(cc.FadeTo:create(1.0, 0),cc.FadeTo:create(1.0, 255)) 216 local left = cc.ProgressTimer:create(cc.Sprite:create(s_pPathSister1)) 217 left:setType(cc.PROGRESS_TIMER_TYPE_BAR) 218 219 -- Setup for a bar starting from the bottom since the midpoint is 0 for the y 220 left:setMidpoint(cc.p(0.5, 0.5)) 221 -- Setup for a vertical bar since the bar change rate is 0 for x meaning no horizontal change 222 left:setBarChangeRate(cc.p(1, 0)) 223 224 left:setPosition(cc.p(100, s.height / 2)) 225 226 --进度Action 和普通Action在同一进度条上面可以同时播放/////////,即便讲究顺序,即便不用前面提到的Spawn 227 left:runAction(cc.RepeatForever:create(cc.ProgressTo:create(6, 100))) 228 left:runAction(cc.RepeatForever:create(cc.Sequence:create(cc.TintTo:create(1, 255, 0, 0), cc.TintTo:create(1, 0, 255, 0), cc.TintTo:create(1, 0, 0, 255)))) 229 230 layer:addChild(left) 231 left:addChild(cc.Label:createWithTTF("Tint", "fonts/Marker Felt.ttf", 20.0)) 232 233 local middle = cc.ProgressTimer:create(cc.Sprite:create(s_pPathSister2)) 234 middle:setType(cc.PROGRESS_TIMER_TYPE_BAR) 235 -- Setup for a bar starting from the bottom since the midpoint is 0 for the y 236 middle:setMidpoint(cc.p(0.5, 0.5)) 237 -- Setup for a vertical bar since the bar change rate is 0 for x meaning no horizontal change 238 middle:setBarChangeRate(cc.p(1, 1)) 239 middle:setPosition(cc.p(s.width / 2, s.height / 2)) 240 middle:runAction(cc.RepeatForever:create(cc.ProgressTo:create(6, 100))) 241 242 local fade2 = cc.Sequence:create(cc.FadeTo:create(1.0, 0), cc.FadeTo:create(1.0, 255)) 243 middle:runAction(cc.RepeatForever:create(fade2)) 244 layer:addChild(middle) 245 middle:addChild(cc.Label:createWithTTF("Fade", "fonts/Marker Felt.ttf", 20.0)) 246 247 local right = cc.ProgressTimer:create(cc.Sprite:create(s_pPathSister2)) 248 right:setType(cc.PROGRESS_TIMER_TYPE_BAR) 249 -- Setup for a bar starting from the bottom since the midpoint is 0 for the y 250 right:setMidpoint(cc.p(0.5, 0.5)) 251 -- Setup for a vertical bar since the bar change rate is 0 for x meaning no horizontal change 252 right:setBarChangeRate(cc.p(0, 1)) 253 right:setPosition(cc.p(s.width - 100, s.height / 2)) 254 right:runAction(cc.RepeatForever:create(cc.ProgressTo:create(6, 100))) 255 right:runAction(cc.RepeatForever:create(cc.Sequence:create(cc.TintTo:create(1, 255, 0, 0), cc.TintTo:create(1, 0, 255, 0), cc.TintTo:create(1, 0, 0, 255)))) 256 right:runAction(cc.RepeatForever:create(cc.Sequence:create(cc.FadeTo:create(1.0, 0), cc.FadeTo:create(1.0, 255)))) 257 layer:addChild(right) 258 259 right:addChild(cc.Label:createWithTTF("Tint and Fade", "fonts/Marker Felt.ttf", 20.0)) 260 261 Helper.subtitleLabel:setString("ProgressTo Bar Mid") 262 return layer 263 end 264 265 ------------------------------------ 266 -- SpriteProgressWithSpriteFrame 267 ------------------------------------ 268 --[[ 269 给精灵的帧加上进度动作,其实跟前面给单独的精灵加进度动作一样的 270 这里顺便提一下精灵资源的加载方法:首先加载plist文件,plist其实是一个xml类型的文件, 271 它对应有一个大的png图片,图片上包含了每个精灵的小图片,plist文件里面保存的就是如何切这个大png图片 272 的信息,当然还有每个精灵的各种属性 273 后面要创建精灵的话,用cc.Sprite:createWithSpriteFrameName()传入小图片的名称,直接从缓存中读取图片 274 创建精灵 275 276 你也许会有疑问?大图片是怎么来的,是用相关工具将多张小图片合成的, 277 为什么要合成大图片呢?因为一张图片(俗称纹理)的加载过程,耗去的内存是图片本身大小的将近4倍!所以主要 278 耗内存的不是纹理大小,而是纹理的加载,因此,较少纹理的加载次数,是至关重要的。实际工作中,通常将会在一起 279 使用的多张小图合成一张大图,然后用plist来管理,一次性加载,达到节省内存的目的。 280 --]] 281 282 local function SpriteProgressWithSpriteFrame() 283 local layer = cc.Layer:create() 284 Helper.initWithLayer(layer) 285 286 local to = cc.ProgressTo:create(6, 100) 287 --将精灵帧文件加载到缓存中,((什么是缓存?有是必要和技巧?后面慢慢讲 288 cc.SpriteFrameCache:getInstance():addSpriteFrames("zwoptex/grossini.plist") 289 290 local left = cc.ProgressTimer:create(cc.Sprite:createWithSpriteFrameName("grossini_dance_01.png")) 291 left:setType(cc.PROGRESS_TIMER_TYPE_BAR) 292 -- Setup for a bar starting from the bottom since the midpoint is 0 for the y 293 left:setMidpoint(cc.p(0.5, 0.5)) 294 -- Setup for a vertical bar since the bar change rate is 0 for x meaning no horizontal change 295 left:setBarChangeRate(cc.p(1, 0)) 296 left:setPosition(cc.p(100, s.height / 2)) 297 left:runAction(cc.RepeatForever:create(cc.ProgressTo:create(6, 100))) 298 layer:addChild(left) 299 300 local middle = cc.ProgressTimer:create(cc.Sprite:createWithSpriteFrameName("grossini_dance_02.png")) 301 middle:setType(cc.PROGRESS_TIMER_TYPE_BAR) 302 -- Setup for a bar starting from the bottom since the midpoint is 0 for the y 303 middle:setMidpoint(cc.p(0.5, 0.5)) 304 -- Setup for a vertical bar since the bar change rate is 0 for x meaning no horizontal change 305 middle:setBarChangeRate(cc.p(1, 1)) 306 middle:setPosition(cc.p(s.width / 2, s.height / 2)) 307 middle:runAction(cc.RepeatForever:create(cc.ProgressTo:create(6, 100))) 308 layer:addChild(middle) 309 310 local right = cc.ProgressTimer:create(cc.Sprite:createWithSpriteFrameName("grossini_dance_03.png")) 311 right:setType(cc.PROGRESS_TIMER_TYPE_BAR) 312 -- Setup for a bar starting from the bottom since the midpoint is 0 for the y 313 right:setMidpoint(cc.p(0.5, 0.5)) 314 -- Setup for a vertical bar since the bar change rate is 0 for x meaning no horizontal change 315 right:setBarChangeRate(cc.p(0, 1)) 316 right:setPosition(cc.p(s.width - 100, s.height / 2)) 317 right:runAction(cc.RepeatForever:create(cc.ProgressTo:create(6, 100))) 318 layer:addChild(right) 319 320 Helper.subtitleLabel:setString("Progress With Sprite Frame") 321 return layer 322 end 323 324 --[[ 325 总结:进度条可以理解为对Sprite的进一步封装,并且有自己特有的Action,属性和方法 326 327 以下是创建一个完整进度条的完整步骤: 328 1、cc.ProgressTimer:create(Sprite) --对精灵进一步封装,创建一个进度条 329 2、cc.setType() --设置进度条类型,1、旋转型,cc.PROGRESS_TIMEER_TYPE_RADIAL;2、条状,cc.PROGRESS_TIMER_TYPE_BAR 330 3、cc.ProgressTo:create(time,Percent)--创建进度条特有的Action:在时间time内飙到Percent 331 4、setReverseDirection(bool) --(可选)设置进度条的进度方向是否反向 332 5、runAction() --简单ProgressTo直接绑定给进度条,或者进一步封装成Sequence或Repeatforever等 333 334 另外: 335 1、setMidPoint(cc.p(x,x)) --设置起点,旋转型的则是设置中心, 336 2、setBarChangeRate(cc.p(x,x)) --对条状可用,设置进度方法 337 --]] 338 339 function ProgressActionsTest() 340 local scene = cc.Scene:create() 341 342 Helper.createFunctionTable = { 343 SpriteProgressToRadial, 344 SpriteProgressToHorizontal, 345 SpriteProgressToVertical, 346 SpriteProgressToRadialMidpointChanged, 347 SpriteProgressBarVarious, 348 SpriteProgressBarTintAndFade, 349 SpriteProgressWithSpriteFrame 350 } 351 scene:addChild(SpriteProgressToRadial()) 352 scene:addChild(CreateBackMenuItem()) 353 354 cc.Director:getInstance():replaceScene(scene) 355 end
浙公网安备 33010602011771号