├── .cocos-project.json ├── .gitignore ├── LICENSE ├── README.md ├── frameworks ├── cocos2d-js-v3.3.full.js └── cocos2d-js-v3.3.js ├── index.html ├── main.js ├── project.json ├── res ├── AltarScene.json ├── AltarScene │ ├── LV9_4.png │ ├── bg_tree01.png │ ├── bg_tree02.png │ ├── bg_tree03.png │ ├── guard01.png │ ├── guard02.png │ ├── lv1-1.PNG │ ├── lv10_3.png │ ├── lv10_5.png │ ├── lv10_chengqiang.png │ ├── lv10_fangzi.png │ ├── lv10_fangzi_down.png │ ├── lv10_tielian.png │ ├── lv1qiang.png │ ├── lv2-1.PNG │ ├── lv2-2.PNG │ ├── lv2_3.png │ ├── lv3-1.png │ ├── lv3_1(lv4_1).png │ ├── lv4-1.png │ ├── lv5-1.png │ ├── lv5_1.png │ ├── lv6_1.png │ ├── lv9_1.png │ └── staging.png ├── Common │ ├── Cn16.png │ ├── Cn17.png │ └── Cn19.png ├── Default │ ├── Button_Disable.png │ └── defaultParticle.plist ├── DifficultySelection.json ├── DifficultySelection │ ├── DS01.png │ ├── DS02.png │ ├── DS03.png │ ├── DS05.png │ ├── DS07.png │ ├── DS08.png │ ├── DS09.png │ ├── DS10.png │ ├── DS11.png │ ├── DS12.png │ ├── DS13.png │ ├── DS15.png │ └── DS16.png ├── MainMenu.json ├── MainMenu │ ├── MM01.png │ ├── MM02.png │ ├── MM03.png │ ├── MM04.png │ ├── MM05.png │ ├── MM06.png │ ├── MM07.png │ ├── MM08.png │ ├── MM09.png │ ├── MM10.png │ ├── MM12.png │ ├── MM13.png │ ├── MM14.png │ ├── MM15.png │ ├── MM16.png │ ├── MM17.png │ ├── MM18.png │ ├── MM19.png │ ├── MM20.png │ ├── MM21.png │ ├── MM22.png │ ├── MM23.png │ └── MM24.png ├── MainScreen.json ├── PlayerStats.json └── finger.png └── src ├── guideConfig.js ├── lib ├── Guide.js ├── UILoader.js └── async.js ├── resource.js └── ui └── MainScreen.js /.cocos-project.json: -------------------------------------------------------------------------------- 1 | { 2 | "has_native": true, 3 | "project_type": "js" 4 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | *.DS_Store 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 ShawnZhang2015 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | sz.Guide 2 | ======== 3 | 4 | cocos2d-js游戏简单引导框架 5 | 6 | ##在线演示 7 | www.ixuexie.com/Guide/index.html 8 | 9 | ## 博客教程 10 | 11 | [一、原理和框架](http://blog.csdn.net/6346289/article/details/44001005) 12 | [二、定位器细节](http://blog.csdn.net/6346289/article/details/44150147) 13 | [三、框架分析](http://blog.csdn.net/6346289/article/details/44586595) 14 | [四、使用方法](http://blog.csdn.net/6346289/article/details/44745771) 15 | 16 | ## 快速使用 17 | 18 | ### 创建引导层 19 | ```javascript 20 | //在Layer的onEnter时创建引导层对象(sz.GuideLayer) 21 | onEnter: function() { 22 | this._super(); 23 | //guideConfig 为引导配置对象 24 | new sz.GuideLayer(this, guideConfig); 25 | } 26 | ``` 27 | ### 引导配置 28 | 29 | 导引配置主要是编写**引导任务**, 引导任务可能由1个或多个引导步骤组成。当任务中的步骤全部完成sz.Guide会自动保存进度。 30 | ```javascript 31 | tasks = { 32 | '任务1':[ 33 | //任务数组中,每一个对象为一个step 34 | { 35 | log: '用于调试日志字符串', 36 | //引导指令:手型提示 37 | command: sz.GuideCommand.GC_FINGER_HINT, 38 | //定位器 39 | locator:'定位器字符串,一般为节点的Name' 40 | } 41 | ], 42 | '任务2':[...] 43 | '任务3':[...] 44 | } 45 | ``` 46 | 47 | ###定位器语法 48 | ```javascript 49 | “/” :名字(name)定位符,例如: ‘a/b/c’ 、’dialogLayer/_closeButton’ 50 | “#”:tag(id)定位符,例如:’a#123’ 51 | “.”:变量名(var)定位符,例如:’a._okButton’ 52 | “>”:子节点(child)定位符,例如:’a>c’ 53 | ``` 54 | 55 | ###创建引导 56 | 之前使用new sz.Guide(this, config);会自动将引导层添加到第一个参数(target)上。 57 | 新的用法需要自己将创建出的引导层添加到一个节点上: 58 | ```javascript 59 | var guide =new sz.Guide(this, config); 60 | cc.director.getRunningScene().addChild(guide); 61 | ``` 62 | 63 | ###自动引导 64 | 新增自动引导功能通过isAutoGuide开启,主要用于开发测试,需要注意**自动引导期间不能随便移动鼠标** 65 | ```javascript 66 | guideConfig = { 67 | tasks:{...}, //引导任务 68 | fingerImage:'res/finger.png',//手型图片 69 | isShowMask: false, //是否开启遮罩 70 | isAutoGuide: true //是否自动引导 71 | } 72 | ``` 73 | 74 | 75 | 参请见代码guideConfig.js文件 -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Hello Cocos2d-JS 6 | 7 | 17 | 18 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 |

34 | sz.Guide是基于 cocos2d-js 实现的一个简易的新手引导框架,使用json配置文件就能方便编写游戏引导。 35 | sz.Guide库githut源码地址 36 |

37 | 38 |
39 | 40 | 41 |
42 | 43 |
44 | 45 |
46 | 47 | 48 |

49 |
50 |
51 | 52 | 53 | 54 | 55 | 67 | 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | 2 | cc.game.onStart = function(){ 3 | 4 | cc.view.adjustViewPort(true); 5 | cc.view.setDesignResolutionSize(640, 960,cc.ResolutionPolicy.SHOW_ALL); 6 | cc.view.resizeWithBrowserSize(true); 7 | cc.LoaderScene.preload([].concat(G_JSON, G_ALTARSCENE, G_COMMON, G_DEFAULT, G_MAINMENU), function () { 8 | var scene = new cc.Scene(); 9 | scene.addChild(new MainScreen()); 10 | cc.director.runScene(scene); 11 | }, this); 12 | 13 | 14 | var textarea = document.getElementById('text'); 15 | textarea.value = JSON.stringify(guideConfig, null, 4); 16 | 17 | }; 18 | cc.game.run(); -------------------------------------------------------------------------------- /project.json: -------------------------------------------------------------------------------- 1 | { 2 | "debugMode" : 1, 3 | "frameRate" : 25, 4 | "id" : "gameCanvas", 5 | "renderMode" : 1, 6 | "engineDir" : "frameworks/cocos2d-js-v3.3.js", 7 | "jsList" : [ 8 | "src/lib/async.js", 9 | "src/lib/UILoader.js", 10 | "src/lib/Guide.js", 11 | "src/resource.js", 12 | "src/guideConfig.js", 13 | "src/ui/MainScreen.js" 14 | 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /res/AltarScene/LV9_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/LV9_4.png -------------------------------------------------------------------------------- /res/AltarScene/bg_tree01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/bg_tree01.png -------------------------------------------------------------------------------- /res/AltarScene/bg_tree02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/bg_tree02.png -------------------------------------------------------------------------------- /res/AltarScene/bg_tree03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/bg_tree03.png -------------------------------------------------------------------------------- /res/AltarScene/guard01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/guard01.png -------------------------------------------------------------------------------- /res/AltarScene/guard02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/guard02.png -------------------------------------------------------------------------------- /res/AltarScene/lv1-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/lv1-1.PNG -------------------------------------------------------------------------------- /res/AltarScene/lv10_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/lv10_3.png -------------------------------------------------------------------------------- /res/AltarScene/lv10_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/lv10_5.png -------------------------------------------------------------------------------- /res/AltarScene/lv10_chengqiang.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/lv10_chengqiang.png -------------------------------------------------------------------------------- /res/AltarScene/lv10_fangzi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/lv10_fangzi.png -------------------------------------------------------------------------------- /res/AltarScene/lv10_fangzi_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/lv10_fangzi_down.png -------------------------------------------------------------------------------- /res/AltarScene/lv10_tielian.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/lv10_tielian.png -------------------------------------------------------------------------------- /res/AltarScene/lv1qiang.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/lv1qiang.png -------------------------------------------------------------------------------- /res/AltarScene/lv2-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/lv2-1.PNG -------------------------------------------------------------------------------- /res/AltarScene/lv2-2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/lv2-2.PNG -------------------------------------------------------------------------------- /res/AltarScene/lv2_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/lv2_3.png -------------------------------------------------------------------------------- /res/AltarScene/lv3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/lv3-1.png -------------------------------------------------------------------------------- /res/AltarScene/lv3_1(lv4_1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/lv3_1(lv4_1).png -------------------------------------------------------------------------------- /res/AltarScene/lv4-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/lv4-1.png -------------------------------------------------------------------------------- /res/AltarScene/lv5-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/lv5-1.png -------------------------------------------------------------------------------- /res/AltarScene/lv5_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/lv5_1.png -------------------------------------------------------------------------------- /res/AltarScene/lv6_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/lv6_1.png -------------------------------------------------------------------------------- /res/AltarScene/lv9_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/lv9_1.png -------------------------------------------------------------------------------- /res/AltarScene/staging.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/AltarScene/staging.png -------------------------------------------------------------------------------- /res/Common/Cn16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/Common/Cn16.png -------------------------------------------------------------------------------- /res/Common/Cn17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/Common/Cn17.png -------------------------------------------------------------------------------- /res/Common/Cn19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/Common/Cn19.png -------------------------------------------------------------------------------- /res/Default/Button_Disable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/Default/Button_Disable.png -------------------------------------------------------------------------------- /res/Default/defaultParticle.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | angle 6 | 360 7 | angleVariance 8 | 360 9 | blendFuncDestination 10 | 1 11 | blendFuncSource 12 | 775 13 | duration 14 | -1 15 | emitterType 16 | 0.0 17 | finishColorAlpha 18 | 0.8399999737739563 19 | finishColorBlue 20 | 0.0771484375 21 | finishColorGreen 22 | 0.63492840528488159 23 | finishColorRed 24 | 0.68082684278488159 25 | finishColorVarianceAlpha 26 | 0.74000000953674316 27 | finishColorVarianceBlue 28 | 0.98000001907348633 29 | finishColorVarianceGreen 30 | 0.98000001907348633 31 | finishColorVarianceRed 32 | 0.41999998688697815 33 | finishParticleSize 34 | 30.319999694824219 35 | finishParticleSizeVariance 36 | 0.0 37 | gravityx 38 | 0.25 39 | gravityy 40 | 0.86000001430511475 41 | maxParticles 42 | 200 43 | maxRadius 44 | 100 45 | maxRadiusVariance 46 | 0.0 47 | minRadius 48 | 0.0 49 | particleLifespan 50 | 0.20000000298023224 51 | particleLifespanVariance 52 | 0.5 53 | radialAccelVariance 54 | 65.790000915527344 55 | radialAcceleration 56 | -671.04998779296875 57 | rotatePerSecond 58 | 0.0 59 | rotatePerSecondVariance 60 | 0.0 61 | rotationEnd 62 | -47.369998931884766 63 | rotationEndVariance 64 | -142.11000061035156 65 | rotationStart 66 | -47.369998931884766 67 | rotationStartVariance 68 | 0.0 69 | sourcePositionVariancex 70 | 7 71 | sourcePositionVariancey 72 | 7 73 | sourcePositionx 74 | 373.72775268554688 75 | sourcePositiony 76 | 478.40472412109375 77 | speed 78 | 0.0 79 | speedVariance 80 | 190.78999328613281 81 | startColorAlpha 82 | 0.63999998569488525 83 | startColorBlue 84 | 0.3375650942325592 85 | startColorGreen 86 | 0.78792315721511841 87 | startColorRed 88 | 0.794921875 89 | startColorVarianceAlpha 90 | 0.77999997138977051 91 | startColorVarianceBlue 92 | 0.68000000715255737 93 | startColorVarianceGreen 94 | 1 95 | startColorVarianceRed 96 | 0.89999997615814209 97 | startParticleSize 98 | 3.369999885559082 99 | startParticleSizeVariance 100 | 50 101 | tangentialAccelVariance 102 | 65.790000915527344 103 | tangentialAcceleration 104 | -92.110000610351562 105 | textureFileName 106 | particleTexture.png 107 | textureImageData 108 | H4sIAAAAAAAAAwGLDnTxiVBORw0KGgoAAAANSUhEUgAAAB8AAAAfCAYAAAAfrhY5AAAKQWlDQ1BJQ0MgUHJvZmlsZQAAeAGdlndUU9kWh8+9N73QEiIgJfQaegkg0jtIFQRRiUmAUAKGhCZ2RAVGFBEpVmRUwAFHhyJjRRQLg4Ji1wnyEFDGwVFEReXdjGsJ7601896a/cdZ39nnt9fZZ+9917oAUPyCBMJ0WAGANKFYFO7rwVwSE8vE9wIYEAEOWAHA4WZmBEf4RALU/L09mZmoSMaz9u4ugGS72yy/UCZz1v9/kSI3QyQGAApF1TY8fiYX5QKUU7PFGTL/BMr0lSkyhjEyFqEJoqwi48SvbPan5iu7yZiXJuShGlnOGbw0noy7UN6aJeGjjAShXJgl4GejfAdlvVRJmgDl9yjT0/icTAAwFJlfzOcmoWyJMkUUGe6J8gIACJTEObxyDov5OWieAHimZ+SKBIlJYqYR15hp5ejIZvrxs1P5YjErlMNN4Yh4TM/0tAyOMBeAr2+WRQElWW2ZaJHtrRzt7VnW5mj5v9nfHn5T/T3IevtV8Sbsz55BjJ5Z32zsrC+9FgD2JFqbHbO+lVUAtG0GQOXhrE/vIADyBQC03pzzHoZsXpLE4gwnC4vs7GxzAZ9rLivoN/ufgm/Kv4Y595nL7vtWO6YXP4EjSRUzZUXlpqemS0TMzAwOl89k/fcQ/+PAOWnNycMsnJ/AF/GF6FVR6JQJhIlou4U8gViQLmQKhH/V4X8YNicHGX6daxRodV8AfYU5ULhJB8hvPQBDIwMkbj96An3rWxAxCsi+vGitka9zjzJ6/uf6Hwtcim7hTEEiU+b2DI9kciWiLBmj34RswQISkAd0oAo0gS4wAixgDRyAM3AD3iAAhIBIEAOWAy5IAmlABLJBPtgACkEx2AF2g2pwANSBetAEToI2cAZcBFfADXALDIBHQAqGwUswAd6BaQiC8BAVokGqkBakD5lC1hAbWgh5Q0FQOBQDxUOJkBCSQPnQJqgYKoOqoUNQPfQjdBq6CF2D+qAH0CA0Bv0BfYQRmALTYQ3YALaA2bA7HAhHwsvgRHgVnAcXwNvhSrgWPg63whfhG/AALIVfwpMIQMgIA9FGWAgb8URCkFgkAREha5EipAKpRZqQDqQbuY1IkXHkAwaHoWGYGBbGGeOHWYzhYlZh1mJKMNWYY5hWTBfmNmYQM4H5gqVi1bGmWCesP3YJNhGbjS3EVmCPYFuwl7ED2GHsOxwOx8AZ4hxwfrgYXDJuNa4Etw/XjLuA68MN4SbxeLwq3hTvgg/Bc/BifCG+Cn8cfx7fjx/GvyeQCVoEa4IPIZYgJGwkVBAaCOcI/YQRwjRRgahPdCKGEHnEXGIpsY7YQbxJHCZOkxRJhiQXUiQpmbSBVElqIl0mPSa9IZPJOmRHchhZQF5PriSfIF8lD5I/UJQoJhRPShxFQtlOOUq5QHlAeUOlUg2obtRYqpi6nVpPvUR9Sn0vR5Mzl/OX48mtk6uRa5Xrl3slT5TXl3eXXy6fJ18hf0r+pvy4AlHBQMFTgaOwVqFG4bTCPYVJRZqilWKIYppiiWKD4jXFUSW8koGStxJPqUDpsNIlpSEaQtOledK4tE20Otpl2jAdRzek+9OT6cX0H+i99AllJWVb5SjlHOUa5bPKUgbCMGD4M1IZpYyTjLuMj/M05rnP48/bNq9pXv+8KZX5Km4qfJUilWaVAZWPqkxVb9UU1Z2qbapP1DBqJmphatlq+9Uuq43Pp893ns+dXzT/5PyH6rC6iXq4+mr1w+o96pMamhq+GhkaVRqXNMY1GZpumsma5ZrnNMe0aFoLtQRa5VrntV4wlZnuzFRmJbOLOaGtru2nLdE+pN2rPa1jqLNYZ6NOs84TXZIuWzdBt1y3U3dCT0svWC9fr1HvoT5Rn62fpL9Hv1t/ysDQINpgi0GbwaihiqG/YZ5ho+FjI6qRq9Eqo1qjO8Y4Y7ZxivE+41smsImdSZJJjclNU9jU3lRgus+0zwxr5mgmNKs1u8eisNxZWaxG1qA5wzzIfKN5m/krCz2LWIudFt0WXyztLFMt6ywfWSlZBVhttOqw+sPaxJprXWN9x4Zq42Ozzqbd5rWtqS3fdr/tfTuaXbDdFrtOu8/2DvYi+yb7MQc9h3iHvQ732HR2KLuEfdUR6+jhuM7xjOMHJ3snsdNJp9+dWc4pzg3OowsMF/AX1C0YctFx4bgccpEuZC6MX3hwodRV25XjWuv6zE3Xjed2xG3E3dg92f24+ysPSw+RR4vHlKeT5xrPC16Il69XkVevt5L3Yu9q76c+Oj6JPo0+E752vqt9L/hh/QL9dvrd89fw5/rX+08EOASsCegKpARGBFYHPgsyCRIFdQTDwQHBu4IfL9JfJFzUFgJC/EN2hTwJNQxdFfpzGC4sNKwm7Hm4VXh+eHcELWJFREPEu0iPyNLIR4uNFksWd0bJR8VF1UdNRXtFl0VLl1gsWbPkRoxajCCmPRYfGxV7JHZyqffS3UuH4+ziCuPuLjNclrPs2nK15anLz66QX8FZcSoeGx8d3xD/iRPCqeVMrvRfuXflBNeTu4f7kufGK+eN8V34ZfyRBJeEsoTRRJfEXYljSa5JFUnjAk9BteB1sl/ygeSplJCUoykzqdGpzWmEtPi000IlYYqwK10zPSe9L8M0ozBDuspp1e5VE6JA0ZFMKHNZZruYjv5M9UiMJJslg1kLs2qy3mdHZZ/KUcwR5vTkmuRuyx3J88n7fjVmNXd1Z752/ob8wTXuaw6thdauXNu5Tnddwbrh9b7rj20gbUjZ8MtGy41lG99uit7UUaBRsL5gaLPv5sZCuUJR4b0tzlsObMVsFWzt3WazrWrblyJe0fViy+KK4k8l3JLr31l9V/ndzPaE7b2l9qX7d+B2CHfc3em681iZYlle2dCu4F2t5czyovK3u1fsvlZhW3FgD2mPZI+0MqiyvUqvakfVp+qk6oEaj5rmvep7t+2d2sfb17/fbX/TAY0DxQc+HhQcvH/I91BrrUFtxWHc4azDz+ui6rq/Z39ff0TtSPGRz0eFR6XHwo911TvU1zeoN5Q2wo2SxrHjccdv/eD1Q3sTq+lQM6O5+AQ4ITnx4sf4H++eDDzZeYp9qukn/Z/2ttBailqh1tzWibakNml7THvf6YDTnR3OHS0/m/989Iz2mZqzymdLz5HOFZybOZ93fvJCxoXxi4kXhzpXdD66tOTSna6wrt7LgZevXvG5cqnbvfv8VZerZ645XTt9nX297Yb9jdYeu56WX+x+aem172296XCz/ZbjrY6+BX3n+l37L972un3ljv+dGwOLBvruLr57/17cPel93v3RB6kPXj/Mejj9aP1j7OOiJwpPKp6qP6391fjXZqm99Oyg12DPs4hnj4a4Qy//lfmvT8MFz6nPK0a0RupHrUfPjPmM3Xqx9MXwy4yX0+OFvyn+tveV0auffnf7vWdiycTwa9HrmT9K3qi+OfrW9m3nZOjk03dp76anit6rvj/2gf2h+2P0x5Hp7E/4T5WfjT93fAn88ngmbWbm3/eE8/ul8iYiAAAEBUlEQVRIDY3UT2+bRRAG8LHTxqEpNCGq+KMKcQGJb8GVG5+YW64cEEUcerJUUQlImjZukrqx2d9rP2YJbtKRJjM7O/s8z+y+zmj543f1ATZe9yxaTD5a15Y3zuv5IAvQbc16QnR/ne+0iFSd64m3dLA7sW9ryB4Sbi3ea84IUBNZYvZX1Vv+vq8xxAEPuf5M63rlEWdNgKhPdF7catvIAYRMnmtNDaBaniDg71rter3XwpBHmP702RtsGzkAdcSZXEze0s0VyxEAjkg5IdbMObVEtcF68mwizcQRkXUvKODEsnlz+2ImJSJGpLo4WE9OncMhcq0E6YkIUU0PEDnyTIZMXS1kCCNmK7kioMTd9RoZETwiRPsxRKblbDNZy4kKIfx+bwC0yWwATnMIxcnakcr1AeOmvVx7zsIiyn5uVO1/5Cnkuh1AaC0i3Gv+YB3lD5vrY2+bv2k+aw4LGctzJNdvP3HZT0A172sRYFrkSA+aE7A7dNdo3uDOGuW4lkuE3G3AkYewf4JhYA0SLmcEIKWwJ0f4qMajw/pi/8v65uDb+njyUf11Oa1nL5/Wq6uqq3fe3RO0xSDAeYaYENixMcJMTEBI1ZDH1fXu1dHeUX3/5If66tOv69H+pM4vZ3X4x6SOnx838rPW45YI8BzOI4YtdyMZbgHQJvA0iKxXmStb1Of7h3X04LN6fDCuTx7u1ORipx6/fFKLZXuG0U67eiS9+ORwgzkIymQWsTRbR4j91W/44rp9XKPXbWdc8/miZhdV07PndX71phEHIwKyhsk1bLjyzpps8DSllg9o9VW/mL2oZyc/t7ZF3b+3W9PT3+qXP5824qZi+K3nI+vxgkVU6sM7WigyOWUciOcwMWIf0axmb0/qp+lx/fr37617WacXp3U+P2l758395PT58GBlkGCqsWF6k4cQEUMmd1AERNyKfNnql9dXNX112mrOqr9ujpwTyuHEW7rhcQbe8MFlQ1GzfywIM7VGa9dKENXAM5U9E9snxJcOx81xlohjY/2bK+Z6QowAkUNyBgiJtRwRAf3vOxPDs9eTyod1yAFlatG0IWvpsAYOzD5xAKwjQJ1Qa4RiLH3iBjfkKYY4aqNYTK8eBiSg9p3JOcT2spbrGd66xcECaAGsJwMQlTkMzJm+HgF9TB6B7chGrHywntyBCIhyTXJ9UW5yfelV5+piiFs6nLVW1/8f68ltaGJiPrpE4P3U+gDHkhObWxO3Ejt0k1wtAgKWmjUnRsz0yUPkfPzm7bStf20beXaBxjKJmpwFOB9R3x9BmToDrU6u/zp4m/UE+jJRciT9W6vHQpiY+ibeNrmmHOxjJidcncDU0tdKd9td5EHor1QNYWo9YZ/n7HvjP//hqoX9yBbEAAAAAElFTkSuQmCCAXYDSYsOAAA= 109 | 110 | 111 | -------------------------------------------------------------------------------- /res/DifficultySelection/DS01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/DifficultySelection/DS01.png -------------------------------------------------------------------------------- /res/DifficultySelection/DS02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/DifficultySelection/DS02.png -------------------------------------------------------------------------------- /res/DifficultySelection/DS03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/DifficultySelection/DS03.png -------------------------------------------------------------------------------- /res/DifficultySelection/DS05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/DifficultySelection/DS05.png -------------------------------------------------------------------------------- /res/DifficultySelection/DS07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/DifficultySelection/DS07.png -------------------------------------------------------------------------------- /res/DifficultySelection/DS08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/DifficultySelection/DS08.png -------------------------------------------------------------------------------- /res/DifficultySelection/DS09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/DifficultySelection/DS09.png -------------------------------------------------------------------------------- /res/DifficultySelection/DS10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/DifficultySelection/DS10.png -------------------------------------------------------------------------------- /res/DifficultySelection/DS11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/DifficultySelection/DS11.png -------------------------------------------------------------------------------- /res/DifficultySelection/DS12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/DifficultySelection/DS12.png -------------------------------------------------------------------------------- /res/DifficultySelection/DS13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/DifficultySelection/DS13.png -------------------------------------------------------------------------------- /res/DifficultySelection/DS15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/DifficultySelection/DS15.png -------------------------------------------------------------------------------- /res/DifficultySelection/DS16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/DifficultySelection/DS16.png -------------------------------------------------------------------------------- /res/MainMenu.json: -------------------------------------------------------------------------------- 1 | { 2 | "ID": "24997fd0-1c17-46c3-b351-335ce98a3bbf", 3 | "Version": "2.1.5.0", 4 | "Name": "MainMenu", 5 | "Content": { 6 | "Content": { 7 | "Animation": { 8 | "Duration": 0, 9 | "Speed": 1.0, 10 | "Timelines": [], 11 | "ctype": "TimelineActionData" 12 | }, 13 | "AnimationList": [], 14 | "ObjectData": { 15 | "PrePosition": { 16 | "X": 0.0, 17 | "Y": 0.0 18 | }, 19 | "PreSize": { 20 | "X": 0.0, 21 | "Y": 0.0 22 | }, 23 | "Children": [ 24 | { 25 | "BackColorAlpha": 0, 26 | "ComboBoxIndex": 1, 27 | "SingleColor": { 28 | "R": 150, 29 | "G": 200 30 | }, 31 | "FirstColor": { 32 | "R": 150, 33 | "G": 200 34 | }, 35 | "EndColor": {}, 36 | "ColorVector": { 37 | "ScaleX": 1.0 38 | }, 39 | "Scale9Enable": true, 40 | "TouchEnable": true, 41 | "Tag": 5, 42 | "PrePosition": { 43 | "X": 0.0, 44 | "Y": 0.0 45 | }, 46 | "PreSize": { 47 | "X": 0.0, 48 | "Y": 0.0 49 | }, 50 | "Children": [ 51 | { 52 | "FileData": { 53 | "Type": "Normal", 54 | "Path": "MainMenu/MM05.png" 55 | }, 56 | "Scale9Width": 625, 57 | "Scale9Height": 143, 58 | "Tag": 96, 59 | "PrePosition": { 60 | "X": 0.4898, 61 | "Y": 0.7607 62 | }, 63 | "PreSize": { 64 | "X": 0.0, 65 | "Y": 0.0 66 | }, 67 | "Children": [ 68 | { 69 | "FontSize": 14, 70 | "ButtonText": "", 71 | "TextColor": { 72 | "R": 65, 73 | "G": 65, 74 | "B": 70 75 | }, 76 | "DisabledFileData": { 77 | "Type": "Default", 78 | "Path": "Default/Button_Disable.png" 79 | }, 80 | "PressedFileData": { 81 | "Type": "Normal", 82 | "Path": "MainMenu/MM07.png" 83 | }, 84 | "NormalFileData": { 85 | "Type": "Normal", 86 | "Path": "MainMenu/MM01.png" 87 | }, 88 | "Scale9Width": 98, 89 | "Scale9Height": 30, 90 | "TouchEnable": true, 91 | "Tag": 99, 92 | "PrePosition": { 93 | "X": 0.5049, 94 | "Y": 0.9545 95 | }, 96 | "PreSize": { 97 | "X": 0.0, 98 | "Y": 0.0 99 | }, 100 | "ActionTag": 143011305, 101 | "Position": { 102 | "X": 315.5425, 103 | "Y": 136.4905 104 | }, 105 | "Scale": { 106 | "ScaleX": 1.0, 107 | "ScaleY": 1.0 108 | }, 109 | "AnchorPoint": { 110 | "ScaleX": 0.5, 111 | "ScaleY": 0.5 112 | }, 113 | "CColor": {}, 114 | "Size": { 115 | "X": 98.0, 116 | "Y": 30.0 117 | }, 118 | "FrameEvent": "", 119 | "Name": "_btnss", 120 | "ctype": "ButtonObjectData" 121 | } 122 | ], 123 | "ActionTag": 125810464, 124 | "Position": { 125 | "X": 313.4468, 126 | "Y": 125.5103 127 | }, 128 | "Scale": { 129 | "ScaleX": 1.0, 130 | "ScaleY": 1.0 131 | }, 132 | "AnchorPoint": { 133 | "ScaleX": 0.5, 134 | "ScaleY": 0.5 135 | }, 136 | "CColor": {}, 137 | "Size": { 138 | "X": 625.0, 139 | "Y": 143.0 140 | }, 141 | "FrameEvent": "", 142 | "Name": "pc_bg2", 143 | "ctype": "ImageViewObjectData" 144 | }, 145 | { 146 | "FileData": { 147 | "Type": "Normal", 148 | "Path": "MainMenu/MM10.png" 149 | }, 150 | "Scale9Enable": true, 151 | "Scale9OriginX": 320, 152 | "Scale9Width": 316, 153 | "Scale9Height": 166, 154 | "Tag": 96, 155 | "PrePosition": { 156 | "X": 0.5004, 157 | "Y": 0.5463 158 | }, 159 | "PreSize": { 160 | "X": 1.0, 161 | "Y": 1.0061 162 | }, 163 | "ActionTag": 15863004, 164 | "Position": { 165 | "X": 320.2844, 166 | "Y": 90.1313 167 | }, 168 | "Scale": { 169 | "ScaleX": 1.0, 170 | "ScaleY": 1.0 171 | }, 172 | "AnchorPoint": { 173 | "ScaleX": 0.5, 174 | "ScaleY": 0.5 175 | }, 176 | "CColor": {}, 177 | "Size": { 178 | "X": 640.0, 179 | "Y": 166.0 180 | }, 181 | "FrameEvent": "", 182 | "Name": "pc_bg", 183 | "ctype": "ImageViewObjectData" 184 | }, 185 | { 186 | "FontSize": 14, 187 | "ButtonText": "", 188 | "TextColor": { 189 | "R": 65, 190 | "G": 65, 191 | "B": 70 192 | }, 193 | "DisabledFileData": { 194 | "Type": "Default", 195 | "Path": "Default/Button_Disable.png" 196 | }, 197 | "PressedFileData": { 198 | "Type": "Normal", 199 | "Path": "MainMenu/MM08.png" 200 | }, 201 | "NormalFileData": { 202 | "Type": "Normal", 203 | "Path": "MainMenu/MM19.png" 204 | }, 205 | "Scale9Width": 78, 206 | "Scale9Height": 112, 207 | "TouchEnable": true, 208 | "Tag": 5, 209 | "PrePosition": { 210 | "X": 0.1006, 211 | "Y": 0.5327 212 | }, 213 | "PreSize": { 214 | "X": 0.0, 215 | "Y": 0.0 216 | }, 217 | "ActionTag": 1033611853, 218 | "Position": { 219 | "X": 64.3548, 220 | "Y": 87.9 221 | }, 222 | "Scale": { 223 | "ScaleX": 1.0, 224 | "ScaleY": 1.0 225 | }, 226 | "AnchorPoint": { 227 | "ScaleX": 0.5, 228 | "ScaleY": 0.5 229 | }, 230 | "CColor": {}, 231 | "Size": { 232 | "X": 78.0, 233 | "Y": 112.0 234 | }, 235 | "FrameEvent": "", 236 | "Name": "_btnHome", 237 | "ctype": "ButtonObjectData" 238 | }, 239 | { 240 | "FontSize": 14, 241 | "ButtonText": "", 242 | "TextColor": { 243 | "R": 65, 244 | "G": 65, 245 | "B": 70 246 | }, 247 | "DisabledFileData": { 248 | "Type": "Default", 249 | "Path": "Default/Button_Disable.png" 250 | }, 251 | "PressedFileData": { 252 | "Type": "Normal", 253 | "Path": "MainMenu/MM09.png" 254 | }, 255 | "NormalFileData": { 256 | "Type": "Normal", 257 | "Path": "MainMenu/MM18.png" 258 | }, 259 | "Scale9Width": 92, 260 | "Scale9Height": 110, 261 | "TouchEnable": true, 262 | "Tag": 9, 263 | "PrePosition": { 264 | "X": 0.261, 265 | "Y": 0.5279 266 | }, 267 | "PreSize": { 268 | "X": 0.0, 269 | "Y": 0.0 270 | }, 271 | "ActionTag": 559723805, 272 | "Position": { 273 | "X": 167.0388, 274 | "Y": 87.1 275 | }, 276 | "Scale": { 277 | "ScaleX": 1.0, 278 | "ScaleY": 1.0 279 | }, 280 | "AnchorPoint": { 281 | "ScaleX": 0.5, 282 | "ScaleY": 0.5 283 | }, 284 | "CColor": {}, 285 | "Size": { 286 | "X": 92.0, 287 | "Y": 110.0 288 | }, 289 | "FrameEvent": "", 290 | "Name": "_btnTask", 291 | "ctype": "ButtonObjectData" 292 | }, 293 | { 294 | "FontSize": 14, 295 | "ButtonText": "", 296 | "TextColor": { 297 | "R": 65, 298 | "G": 65, 299 | "B": 70 300 | }, 301 | "DisabledFileData": { 302 | "Type": "Default", 303 | "Path": "Default/Button_Disable.png" 304 | }, 305 | "PressedFileData": { 306 | "Type": "Normal", 307 | "Path": "MainMenu/MM23.png" 308 | }, 309 | "NormalFileData": { 310 | "Type": "Normal", 311 | "Path": "MainMenu/MM17.png" 312 | }, 313 | "Scale9Width": 76, 314 | "Scale9Height": 105, 315 | "TouchEnable": true, 316 | "Tag": 10, 317 | "PrePosition": { 318 | "X": 0.4207, 319 | "Y": 0.5261 320 | }, 321 | "PreSize": { 322 | "X": 0.0, 323 | "Y": 0.0 324 | }, 325 | "ActionTag": 394964240, 326 | "Position": { 327 | "X": 269.2231, 328 | "Y": 86.8 329 | }, 330 | "Scale": { 331 | "ScaleX": 1.0, 332 | "ScaleY": 1.0 333 | }, 334 | "AnchorPoint": { 335 | "ScaleX": 0.5, 336 | "ScaleY": 0.5 337 | }, 338 | "CColor": {}, 339 | "Size": { 340 | "X": 76.0, 341 | "Y": 105.0 342 | }, 343 | "FrameEvent": "", 344 | "Name": "_btnPlunder", 345 | "ctype": "ButtonObjectData" 346 | }, 347 | { 348 | "FontSize": 14, 349 | "ButtonText": "", 350 | "TextColor": { 351 | "R": 65, 352 | "G": 65, 353 | "B": 70 354 | }, 355 | "DisabledFileData": { 356 | "Type": "Default", 357 | "Path": "Default/Button_Disable.png" 358 | }, 359 | "PressedFileData": { 360 | "Type": "Normal", 361 | "Path": "MainMenu/MM21.png" 362 | }, 363 | "NormalFileData": { 364 | "Type": "Normal", 365 | "Path": "MainMenu/MM15.png" 366 | }, 367 | "Scale9Width": 81, 368 | "Scale9Height": 110, 369 | "TouchEnable": true, 370 | "Tag": 11, 371 | "PrePosition": { 372 | "X": 0.5717, 373 | "Y": 0.5315 374 | }, 375 | "PreSize": { 376 | "X": 0.0, 377 | "Y": 0.0 378 | }, 379 | "ActionTag": 177272830, 380 | "Position": { 381 | "X": 365.9074, 382 | "Y": 87.7 383 | }, 384 | "Scale": { 385 | "ScaleX": 1.0, 386 | "ScaleY": 1.0 387 | }, 388 | "AnchorPoint": { 389 | "ScaleX": 0.5, 390 | "ScaleY": 0.5 391 | }, 392 | "CColor": {}, 393 | "Size": { 394 | "X": 81.0, 395 | "Y": 110.0 396 | }, 397 | "FrameEvent": "", 398 | "Name": "_btnBag", 399 | "ctype": "ButtonObjectData" 400 | }, 401 | { 402 | "FontSize": 14, 403 | "ButtonText": "", 404 | "TextColor": { 405 | "R": 65, 406 | "G": 65, 407 | "B": 70 408 | }, 409 | "DisabledFileData": { 410 | "Type": "Default", 411 | "Path": "Default/Button_Disable.png" 412 | }, 413 | "PressedFileData": { 414 | "Type": "Normal", 415 | "Path": "MainMenu/MM22.png" 416 | }, 417 | "NormalFileData": { 418 | "Type": "Normal", 419 | "Path": "MainMenu/MM16.png" 420 | }, 421 | "Scale9Width": 90, 422 | "Scale9Height": 105, 423 | "TouchEnable": true, 424 | "Tag": 12, 425 | "PrePosition": { 426 | "X": 0.7345, 427 | "Y": 0.5303 428 | }, 429 | "PreSize": { 430 | "X": 0.0, 431 | "Y": 0.0 432 | }, 433 | "ActionTag": 413092005, 434 | "Position": { 435 | "X": 470.0915, 436 | "Y": 87.5 437 | }, 438 | "Scale": { 439 | "ScaleX": 1.0, 440 | "ScaleY": 1.0 441 | }, 442 | "AnchorPoint": { 443 | "ScaleX": 0.5, 444 | "ScaleY": 0.5 445 | }, 446 | "CColor": {}, 447 | "Size": { 448 | "X": 90.0, 449 | "Y": 105.0 450 | }, 451 | "FrameEvent": "", 452 | "Name": "_btnFriend", 453 | "ctype": "ButtonObjectData" 454 | }, 455 | { 456 | "FontSize": 14, 457 | "ButtonText": "", 458 | "TextColor": { 459 | "R": 65, 460 | "G": 65, 461 | "B": 70 462 | }, 463 | "DisabledFileData": { 464 | "Type": "Default", 465 | "Path": "Default/Button_Disable.png" 466 | }, 467 | "PressedFileData": { 468 | "Type": "Normal", 469 | "Path": "MainMenu/MM20.png" 470 | }, 471 | "NormalFileData": { 472 | "Type": "Normal", 473 | "Path": "MainMenu/MM14.png" 474 | }, 475 | "Scale9Width": 77, 476 | "Scale9Height": 106, 477 | "TouchEnable": true, 478 | "Tag": 15, 479 | "PrePosition": { 480 | "X": 0.8934, 481 | "Y": 0.5273 482 | }, 483 | "PreSize": { 484 | "X": 0.0, 485 | "Y": 0.0 486 | }, 487 | "ActionTag": 978247239, 488 | "Position": { 489 | "X": 571.7745, 490 | "Y": 87.0 491 | }, 492 | "Scale": { 493 | "ScaleX": 1.0, 494 | "ScaleY": 1.0 495 | }, 496 | "AnchorPoint": { 497 | "ScaleX": 0.5, 498 | "ScaleY": 0.5 499 | }, 500 | "CColor": {}, 501 | "Size": { 502 | "X": 77.0, 503 | "Y": 106.0 504 | }, 505 | "FrameEvent": "", 506 | "Name": "_btnSetting", 507 | "ctype": "ButtonObjectData" 508 | } 509 | ], 510 | "ActionTag": 4901574, 511 | "Position": { 512 | "X": 0.0, 513 | "Y": 0.0 514 | }, 515 | "Scale": { 516 | "ScaleX": 1.0, 517 | "ScaleY": 1.0 518 | }, 519 | "AnchorPoint": {}, 520 | "CColor": {}, 521 | "Size": { 522 | "X": 640.0, 523 | "Y": 165.0 524 | }, 525 | "FrameEvent": "", 526 | "Name": "BottomBar", 527 | "ctype": "PanelObjectData" 528 | } 529 | ], 530 | "Position": { 531 | "X": 0.0, 532 | "Y": 0.0 533 | }, 534 | "Scale": { 535 | "ScaleX": 1.0, 536 | "ScaleY": 1.0 537 | }, 538 | "AnchorPoint": {}, 539 | "CColor": {}, 540 | "Size": { 541 | "X": 0.0, 542 | "Y": 0.0 543 | }, 544 | "FrameEvent": "", 545 | "Name": "Node_0", 546 | "ctype": "NodeObjectData" 547 | }, 548 | "ctype": "GameProjectData" 549 | } 550 | }, 551 | "Type": "Node" 552 | } -------------------------------------------------------------------------------- /res/MainMenu/MM01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM01.png -------------------------------------------------------------------------------- /res/MainMenu/MM02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM02.png -------------------------------------------------------------------------------- /res/MainMenu/MM03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM03.png -------------------------------------------------------------------------------- /res/MainMenu/MM04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM04.png -------------------------------------------------------------------------------- /res/MainMenu/MM05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM05.png -------------------------------------------------------------------------------- /res/MainMenu/MM06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM06.png -------------------------------------------------------------------------------- /res/MainMenu/MM07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM07.png -------------------------------------------------------------------------------- /res/MainMenu/MM08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM08.png -------------------------------------------------------------------------------- /res/MainMenu/MM09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM09.png -------------------------------------------------------------------------------- /res/MainMenu/MM10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM10.png -------------------------------------------------------------------------------- /res/MainMenu/MM12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM12.png -------------------------------------------------------------------------------- /res/MainMenu/MM13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM13.png -------------------------------------------------------------------------------- /res/MainMenu/MM14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM14.png -------------------------------------------------------------------------------- /res/MainMenu/MM15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM15.png -------------------------------------------------------------------------------- /res/MainMenu/MM16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM16.png -------------------------------------------------------------------------------- /res/MainMenu/MM17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM17.png -------------------------------------------------------------------------------- /res/MainMenu/MM18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM18.png -------------------------------------------------------------------------------- /res/MainMenu/MM19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM19.png -------------------------------------------------------------------------------- /res/MainMenu/MM20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM20.png -------------------------------------------------------------------------------- /res/MainMenu/MM21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM21.png -------------------------------------------------------------------------------- /res/MainMenu/MM22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM22.png -------------------------------------------------------------------------------- /res/MainMenu/MM23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM23.png -------------------------------------------------------------------------------- /res/MainMenu/MM24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/MainMenu/MM24.png -------------------------------------------------------------------------------- /res/MainScreen.json: -------------------------------------------------------------------------------- 1 | { 2 | "ID": "24997fd0-1c17-46c3-b351-335ce98a3bbf", 3 | "Version": "2.1.5.0", 4 | "Name": "MainScreen", 5 | "Content": { 6 | "Content": { 7 | "Animation": { 8 | "Duration": 0, 9 | "Speed": 1.0, 10 | "Timelines": [], 11 | "ctype": "TimelineActionData" 12 | }, 13 | "AnimationList": [], 14 | "ObjectData": { 15 | "PrePosition": { 16 | "X": 0.0, 17 | "Y": 0.0 18 | }, 19 | "PreSize": { 20 | "X": 0.0, 21 | "Y": 0.0 22 | }, 23 | "Children": [ 24 | { 25 | "InnerNodeSize": { 26 | "Width": 750, 27 | "Height": 700 28 | }, 29 | "ScrollDirectionType": "Horizontal", 30 | "BackColorAlpha": 102, 31 | "ComboBoxIndex": 1, 32 | "SingleColor": { 33 | "G": 150, 34 | "B": 100 35 | }, 36 | "FirstColor": { 37 | "G": 150, 38 | "B": 100 39 | }, 40 | "EndColor": {}, 41 | "ColorVector": { 42 | "ScaleX": 1.0 43 | }, 44 | "Scale9Enable": true, 45 | "TouchEnable": true, 46 | "Tag": 695, 47 | "PrePosition": { 48 | "X": 0.0, 49 | "Y": 0.1715 50 | }, 51 | "PreSize": { 52 | "X": 0.0, 53 | "Y": 0.0 54 | }, 55 | "LeftMargin": 0.3151, 56 | "RightMargin": -0.3151, 57 | "TopMargin": 94.1431, 58 | "BottomMargin": 165.857, 59 | "Children": [ 60 | { 61 | "FileData": { 62 | "Type": "Normal", 63 | "Path": "AltarScene.json" 64 | }, 65 | "Tag": 1085, 66 | "PrePosition": { 67 | "X": 0.0, 68 | "Y": 0.0 69 | }, 70 | "PreSize": { 71 | "X": 0.0, 72 | "Y": 0.0 73 | }, 74 | "ActionTag": 692171387, 75 | "Position": { 76 | "X": 0.0, 77 | "Y": 0.0 78 | }, 79 | "Scale": { 80 | "ScaleX": 1.0, 81 | "ScaleY": 1.0 82 | }, 83 | "AnchorPoint": {}, 84 | "CColor": {}, 85 | "Size": { 86 | "X": 0.0, 87 | "Y": 0.0 88 | }, 89 | "FrameEvent": "", 90 | "Name": "ProjectNode_5", 91 | "ctype": "ProjectNodeObjectData" 92 | } 93 | ], 94 | "ActionTag": 772686604, 95 | "Position": { 96 | "X": -0.0049, 97 | "Y": 164.597 98 | }, 99 | "Scale": { 100 | "ScaleX": 1.0, 101 | "ScaleY": 1.0 102 | }, 103 | "AnchorPoint": { 104 | "ScaleX": -0.0005, 105 | "ScaleY": -0.0018 106 | }, 107 | "CColor": {}, 108 | "Size": { 109 | "X": 640.0, 110 | "Y": 700.0 111 | }, 112 | "FrameEvent": "", 113 | "Name": "ScrollView_1", 114 | "ctype": "ScrollViewObjectData" 115 | }, 116 | { 117 | "FileData": { 118 | "Type": "Normal", 119 | "Path": "MainMenu.json" 120 | }, 121 | "Tag": 5198, 122 | "PrePosition": { 123 | "X": 0.0, 124 | "Y": 0.0 125 | }, 126 | "PreSize": { 127 | "X": 0.0, 128 | "Y": 0.0 129 | }, 130 | "ActionTag": 2120884265, 131 | "Position": { 132 | "X": -0.5, 133 | "Y": -5.5 134 | }, 135 | "Scale": { 136 | "ScaleX": 1.0, 137 | "ScaleY": 1.0 138 | }, 139 | "AnchorPoint": {}, 140 | "CColor": {}, 141 | "Size": { 142 | "X": 0.0, 143 | "Y": 0.0 144 | }, 145 | "FrameEvent": "", 146 | "Name": "ProjectNode_7", 147 | "ctype": "ProjectNodeObjectData" 148 | }, 149 | { 150 | "FileData": { 151 | "Type": "Normal", 152 | "Path": "PlayerStats.json" 153 | }, 154 | "Tag": 5368, 155 | "PrePosition": { 156 | "X": 0.0, 157 | "Y": 0.0 158 | }, 159 | "PreSize": { 160 | "X": 0.0, 161 | "Y": 0.0 162 | }, 163 | "ActionTag": 2120884435, 164 | "Position": { 165 | "X": 0.4997, 166 | "Y": -5.5013 167 | }, 168 | "Scale": { 169 | "ScaleX": 1.0, 170 | "ScaleY": 1.0 171 | }, 172 | "AnchorPoint": {}, 173 | "CColor": {}, 174 | "Size": { 175 | "X": 0.0, 176 | "Y": 0.0 177 | }, 178 | "FrameEvent": "", 179 | "Name": "ProjectNode_8", 180 | "ctype": "ProjectNodeObjectData" 181 | } 182 | ], 183 | "Position": { 184 | "X": 0.0, 185 | "Y": 0.0 186 | }, 187 | "Scale": { 188 | "ScaleX": 1.0, 189 | "ScaleY": 1.0 190 | }, 191 | "AnchorPoint": {}, 192 | "CColor": {}, 193 | "Size": { 194 | "X": 640.0, 195 | "Y": 960.0 196 | }, 197 | "FrameEvent": "", 198 | "Name": "Node_0", 199 | "ctype": "NodeObjectData" 200 | }, 201 | "ctype": "GameProjectData" 202 | } 203 | }, 204 | "Type": "Scene" 205 | } -------------------------------------------------------------------------------- /res/PlayerStats.json: -------------------------------------------------------------------------------- 1 | { 2 | "ID": "24997fd0-1c17-46c3-b351-335ce98a3bbf", 3 | "Version": "2.1.5.0", 4 | "Name": "PlayerStats", 5 | "Content": { 6 | "Content": { 7 | "Animation": { 8 | "Duration": 0, 9 | "Speed": 1.0, 10 | "Timelines": [], 11 | "ctype": "TimelineActionData" 12 | }, 13 | "AnimationList": [], 14 | "ObjectData": { 15 | "PrePosition": { 16 | "X": 0.0, 17 | "Y": 0.0 18 | }, 19 | "PreSize": { 20 | "X": 0.0, 21 | "Y": 0.0 22 | }, 23 | "Children": [ 24 | { 25 | "FileData": { 26 | "Type": "Normal", 27 | "Path": "MainMenu/MM24.png" 28 | }, 29 | "Scale9Enable": true, 30 | "Scale9Width": 640, 31 | "Scale9Height": 150, 32 | "Tag": 22, 33 | "PrePosition": { 34 | "X": 0.0, 35 | "Y": 0.0 36 | }, 37 | "PreSize": { 38 | "X": 0.0, 39 | "Y": 0.0 40 | }, 41 | "Children": [ 42 | { 43 | "BackColorAlpha": 0, 44 | "ComboBoxIndex": 1, 45 | "SingleColor": { 46 | "R": 150, 47 | "G": 200 48 | }, 49 | "FirstColor": { 50 | "R": 150, 51 | "G": 200 52 | }, 53 | "EndColor": {}, 54 | "ColorVector": { 55 | "ScaleX": 1.0 56 | }, 57 | "Scale9Enable": true, 58 | "TouchEnable": true, 59 | "Tag": 17, 60 | "PrePosition": { 61 | "X": 0.0424, 62 | "Y": 0.5138 63 | }, 64 | "PreSize": { 65 | "X": 0.0, 66 | "Y": 0.0 67 | }, 68 | "Children": [ 69 | { 70 | "BackColorAlpha": 0, 71 | "ComboBoxIndex": 1, 72 | "SingleColor": { 73 | "R": 150, 74 | "G": 200 75 | }, 76 | "FirstColor": { 77 | "R": 150, 78 | "G": 200 79 | }, 80 | "EndColor": {}, 81 | "ColorVector": { 82 | "ScaleX": 1.0 83 | }, 84 | "Scale9Enable": true, 85 | "TouchEnable": true, 86 | "Tag": 18, 87 | "PrePosition": { 88 | "X": 0.545, 89 | "Y": 0.4219 90 | }, 91 | "PreSize": { 92 | "X": 0.875, 93 | "Y": 0.265 94 | }, 95 | "Children": [ 96 | { 97 | "FileData": { 98 | "Type": "Normal", 99 | "Path": "MainMenu/MM06.png" 100 | }, 101 | "Scale9Enable": true, 102 | "Scale9Width": 278, 103 | "Scale9Height": 53, 104 | "Tag": 19, 105 | "PrePosition": { 106 | "X": 0.4971, 107 | "Y": 0.5 108 | }, 109 | "PreSize": { 110 | "X": 0.9029, 111 | "Y": 1.0 112 | }, 113 | "ActionTag": 813685588, 114 | "Position": { 115 | "X": 87.0, 116 | "Y": 26.5 117 | }, 118 | "Scale": { 119 | "ScaleX": 1.0, 120 | "ScaleY": 1.0 121 | }, 122 | "AnchorPoint": { 123 | "ScaleX": 0.5, 124 | "ScaleY": 0.5 125 | }, 126 | "CColor": {}, 127 | "Size": { 128 | "X": 158.0, 129 | "Y": 53.0 130 | }, 131 | "FrameEvent": "", 132 | "Name": "pic_bg", 133 | "ctype": "ImageViewObjectData" 134 | }, 135 | { 136 | "FileData": { 137 | "Type": "Normal", 138 | "Path": "MainMenu/MM02.png" 139 | }, 140 | "Scale9Width": 188, 141 | "Scale9Height": 54, 142 | "Tag": 20, 143 | "PrePosition": { 144 | "X": 0.4857, 145 | "Y": 0.5 146 | }, 147 | "PreSize": { 148 | "X": 1.0743, 149 | "Y": 1.0189 150 | }, 151 | "ActionTag": 614339633, 152 | "Position": { 153 | "X": 85.0, 154 | "Y": 26.5 155 | }, 156 | "Scale": { 157 | "ScaleX": 1.0, 158 | "ScaleY": 1.0 159 | }, 160 | "AnchorPoint": { 161 | "ScaleX": 0.5, 162 | "ScaleY": 0.5 163 | }, 164 | "CColor": {}, 165 | "Size": { 166 | "X": 188.0, 167 | "Y": 54.0 168 | }, 169 | "FrameEvent": "", 170 | "Name": "pic_cv", 171 | "ctype": "ImageViewObjectData" 172 | } 173 | ], 174 | "ActionTag": 226223213, 175 | "Position": { 176 | "X": 109.0, 177 | "Y": 27.0 178 | }, 179 | "Scale": { 180 | "ScaleX": 1.0, 181 | "ScaleY": 1.0 182 | }, 183 | "AnchorPoint": { 184 | "ScaleX": 0.5, 185 | "ScaleY": 0.5 186 | }, 187 | "CColor": {}, 188 | "Size": { 189 | "X": 175.0, 190 | "Y": 53.0 191 | }, 192 | "FrameEvent": "", 193 | "Name": "pic_bandbg", 194 | "ctype": "PanelObjectData" 195 | }, 196 | { 197 | "FontSize": 26, 198 | "LabelText": "Cocos", 199 | "Tag": 11, 200 | "PrePosition": { 201 | "X": 0.545, 202 | "Y": 0.4171 203 | }, 204 | "PreSize": { 205 | "X": 0.0, 206 | "Y": 0.0 207 | }, 208 | "ActionTag": 50203699, 209 | "Position": { 210 | "X": 109.0, 211 | "Y": 26.6926 212 | }, 213 | "Scale": { 214 | "ScaleX": 1.0, 215 | "ScaleY": 1.0 216 | }, 217 | "AnchorPoint": { 218 | "ScaleX": 0.5, 219 | "ScaleY": 0.5 220 | }, 221 | "CColor": { 222 | "R": 246, 223 | "B": 133 224 | }, 225 | "Size": { 226 | "X": 76.0, 227 | "Y": 35.0 228 | }, 229 | "FrameEvent": "", 230 | "Name": "playername", 231 | "ctype": "TextObjectData" 232 | } 233 | ], 234 | "ActionTag": 943009350, 235 | "Position": { 236 | "X": 27.1422, 237 | "Y": 71.9285 238 | }, 239 | "Scale": { 240 | "ScaleX": 1.0, 241 | "ScaleY": 1.0 242 | }, 243 | "AnchorPoint": {}, 244 | "CColor": {}, 245 | "Size": { 246 | "X": 200.0, 247 | "Y": 64.0 248 | }, 249 | "FrameEvent": "", 250 | "Name": "namepanel", 251 | "ctype": "PanelObjectData" 252 | }, 253 | { 254 | "BackColorAlpha": 0, 255 | "ComboBoxIndex": 1, 256 | "SingleColor": { 257 | "R": 150, 258 | "G": 200 259 | }, 260 | "FirstColor": { 261 | "R": 150, 262 | "G": 200 263 | }, 264 | "EndColor": {}, 265 | "ColorVector": { 266 | "ScaleX": 1.0 267 | }, 268 | "Scale9Enable": true, 269 | "TouchEnable": true, 270 | "Tag": 14, 271 | "PrePosition": { 272 | "X": 0.0033, 273 | "Y": 0.4781 274 | }, 275 | "PreSize": { 276 | "X": 0.0, 277 | "Y": 0.0 278 | }, 279 | "Children": [ 280 | { 281 | "FileData": { 282 | "Type": "Normal", 283 | "Path": "MainMenu/MM03.png" 284 | }, 285 | "Tag": 15, 286 | "PrePosition": { 287 | "X": 0.535, 288 | "Y": 0.4802 289 | }, 290 | "PreSize": { 291 | "X": 0.8442, 292 | "Y": 0.6753 293 | }, 294 | "Children": [ 295 | { 296 | "FontSize": 20, 297 | "LabelText": "3", 298 | "Tag": 16, 299 | "PrePosition": { 300 | "X": 0.5079, 301 | "Y": 0.382 302 | }, 303 | "PreSize": { 304 | "X": 0.2308, 305 | "Y": 0.5769 306 | }, 307 | "ActionTag": 982078612, 308 | "Position": { 309 | "X": 33.0119, 310 | "Y": 27.8855 311 | }, 312 | "Scale": { 313 | "ScaleX": 1.0, 314 | "ScaleY": 1.0 315 | }, 316 | "AnchorPoint": { 317 | "ScaleX": 0.5, 318 | "ScaleY": 0.5 319 | }, 320 | "CColor": { 321 | "R": 246, 322 | "B": 133 323 | }, 324 | "Size": { 325 | "X": 12.0, 326 | "Y": 27.0 327 | }, 328 | "FrameEvent": "", 329 | "Name": "starscount", 330 | "ctype": "TextObjectData" 331 | } 332 | ], 333 | "ActionTag": 289793238, 334 | "Position": { 335 | "X": 41.1929, 336 | "Y": 36.9769 337 | }, 338 | "Scale": { 339 | "ScaleX": 1.0, 340 | "ScaleY": 1.0 341 | }, 342 | "AnchorPoint": { 343 | "ScaleX": 0.5, 344 | "ScaleY": 0.5 345 | }, 346 | "CColor": {}, 347 | "Size": { 348 | "X": 65.0, 349 | "Y": 73.0 350 | }, 351 | "FrameEvent": "", 352 | "Name": "Stars", 353 | "ctype": "SpriteObjectData" 354 | } 355 | ], 356 | "ActionTag": 64613858, 357 | "Position": { 358 | "X": 2.1424, 359 | "Y": 66.9283 360 | }, 361 | "Scale": { 362 | "ScaleX": 1.0, 363 | "ScaleY": 1.0 364 | }, 365 | "AnchorPoint": {}, 366 | "CColor": {}, 367 | "Size": { 368 | "X": 77.0, 369 | "Y": 77.0 370 | }, 371 | "FrameEvent": "", 372 | "Name": "seniorPanel", 373 | "ctype": "PanelObjectData" 374 | }, 375 | { 376 | "BackColorAlpha": 0, 377 | "ComboBoxIndex": 1, 378 | "SingleColor": { 379 | "R": 150, 380 | "G": 200 381 | }, 382 | "FirstColor": { 383 | "R": 150, 384 | "G": 200 385 | }, 386 | "EndColor": {}, 387 | "ColorVector": { 388 | "ScaleX": 1.0 389 | }, 390 | "Scale9Enable": true, 391 | "TouchEnable": true, 392 | "Tag": 26, 393 | "PrePosition": { 394 | "X": 0.3476, 395 | "Y": 0.4816 396 | }, 397 | "PreSize": { 398 | "X": 0.3125, 399 | "Y": 0.4267 400 | }, 401 | "Children": [ 402 | { 403 | "BackColorAlpha": 0, 404 | "ComboBoxIndex": 1, 405 | "SingleColor": { 406 | "R": 150, 407 | "G": 200 408 | }, 409 | "FirstColor": { 410 | "R": 150, 411 | "G": 200 412 | }, 413 | "EndColor": {}, 414 | "ColorVector": { 415 | "ScaleX": 1.0 416 | }, 417 | "Scale9Enable": true, 418 | "TouchEnable": true, 419 | "Tag": 27, 420 | "PrePosition": { 421 | "X": 0.0, 422 | "Y": 0.0 423 | }, 424 | "PreSize": { 425 | "X": 0.875, 426 | "Y": 0.8281 427 | }, 428 | "Children": [ 429 | { 430 | "FileData": { 431 | "Type": "Normal", 432 | "Path": "MainMenu/MM06.png" 433 | }, 434 | "Scale9Enable": true, 435 | "Scale9Width": 278, 436 | "Scale9Height": 53, 437 | "Tag": 28, 438 | "PrePosition": { 439 | "X": 0.4686, 440 | "Y": 0.5 441 | }, 442 | "PreSize": { 443 | "X": 0.9429, 444 | "Y": 1.0 445 | }, 446 | "ActionTag": 126338286, 447 | "Position": { 448 | "X": 82.0, 449 | "Y": 26.5 450 | }, 451 | "Scale": { 452 | "ScaleX": 1.0, 453 | "ScaleY": 1.0 454 | }, 455 | "AnchorPoint": { 456 | "ScaleX": 0.5, 457 | "ScaleY": 0.5 458 | }, 459 | "CColor": {}, 460 | "Size": { 461 | "X": 165.0, 462 | "Y": 53.0 463 | }, 464 | "FrameEvent": "", 465 | "Name": "pic_bg", 466 | "ctype": "ImageViewObjectData" 467 | }, 468 | { 469 | "FileData": { 470 | "Type": "Normal", 471 | "Path": "MainMenu/MM02.png" 472 | }, 473 | "Scale9Enable": true, 474 | "Scale9Width": 188, 475 | "Scale9Height": 54, 476 | "Tag": 29, 477 | "PrePosition": { 478 | "X": 0.0, 479 | "Y": 0.0 480 | }, 481 | "PreSize": { 482 | "X": 1.0743, 483 | "Y": 1.0189 484 | }, 485 | "ActionTag": 525807031, 486 | "Position": { 487 | "X": 85.0, 488 | "Y": 26.5 489 | }, 490 | "Scale": { 491 | "ScaleX": 1.0, 492 | "ScaleY": 1.0 493 | }, 494 | "AnchorPoint": { 495 | "ScaleX": 0.5, 496 | "ScaleY": 0.5 497 | }, 498 | "CColor": {}, 499 | "Size": { 500 | "X": 188.0, 501 | "Y": 54.0 502 | }, 503 | "FrameEvent": "", 504 | "Name": "pic_cv", 505 | "ctype": "ImageViewObjectData" 506 | } 507 | ], 508 | "ActionTag": 516143622, 509 | "Position": { 510 | "X": 109.0, 511 | "Y": 27.0 512 | }, 513 | "Scale": { 514 | "ScaleX": 1.0, 515 | "ScaleY": 1.0 516 | }, 517 | "AnchorPoint": { 518 | "ScaleX": 0.5, 519 | "ScaleY": 0.5 520 | }, 521 | "CColor": {}, 522 | "Size": { 523 | "X": 175.0, 524 | "Y": 53.0 525 | }, 526 | "FrameEvent": "", 527 | "Name": "pic_bandbg", 528 | "ctype": "PanelObjectData" 529 | }, 530 | { 531 | "FontSize": 26, 532 | "LabelText": "10000000", 533 | "Tag": 30, 534 | "PrePosition": { 535 | "X": 0.5652, 536 | "Y": 0.4171 537 | }, 538 | "PreSize": { 539 | "X": 0.0, 540 | "Y": 0.0 541 | }, 542 | "ActionTag": 106985078, 543 | "Position": { 544 | "X": 113.0372, 545 | "Y": 26.6926 546 | }, 547 | "Scale": { 548 | "ScaleX": 1.0, 549 | "ScaleY": 1.0 550 | }, 551 | "AnchorPoint": { 552 | "ScaleX": 0.5, 553 | "ScaleY": 0.5 554 | }, 555 | "CColor": { 556 | "R": 246, 557 | "B": 133 558 | }, 559 | "Size": { 560 | "X": 120.0, 561 | "Y": 35.0 562 | }, 563 | "FrameEvent": "", 564 | "Name": "mocoinscount", 565 | "ctype": "TextObjectData" 566 | }, 567 | { 568 | "FileData": { 569 | "Type": "Normal", 570 | "Path": "Common/Cn16.png" 571 | }, 572 | "Scale9Width": 57, 573 | "Scale9Height": 53, 574 | "Tag": 31, 575 | "PrePosition": { 576 | "X": 0.1669, 577 | "Y": 0.4518 578 | }, 579 | "PreSize": { 580 | "X": 0.0, 581 | "Y": 0.0 582 | }, 583 | "ActionTag": 219812278, 584 | "Position": { 585 | "X": 33.3852, 586 | "Y": 28.913 587 | }, 588 | "Scale": { 589 | "ScaleX": 1.0, 590 | "ScaleY": 1.0 591 | }, 592 | "AnchorPoint": { 593 | "ScaleX": 0.5, 594 | "ScaleY": 0.5 595 | }, 596 | "CColor": {}, 597 | "Size": { 598 | "X": 57.0, 599 | "Y": 53.0 600 | }, 601 | "FrameEvent": "", 602 | "Name": "mocoins", 603 | "ctype": "ImageViewObjectData" 604 | } 605 | ], 606 | "ActionTag": 937535227, 607 | "Position": { 608 | "X": 222.4818, 609 | "Y": 72.243 610 | }, 611 | "Scale": { 612 | "ScaleX": 1.0, 613 | "ScaleY": 1.0 614 | }, 615 | "AnchorPoint": {}, 616 | "CColor": {}, 617 | "Size": { 618 | "X": 200.0, 619 | "Y": 64.0 620 | }, 621 | "FrameEvent": "", 622 | "Name": "micoinPanel", 623 | "ctype": "PanelObjectData" 624 | }, 625 | { 626 | "BackColorAlpha": 0, 627 | "ComboBoxIndex": 1, 628 | "SingleColor": { 629 | "R": 150, 630 | "G": 200 631 | }, 632 | "FirstColor": { 633 | "R": 150, 634 | "G": 200 635 | }, 636 | "EndColor": {}, 637 | "ColorVector": { 638 | "ScaleX": 1.0 639 | }, 640 | "Scale9Enable": true, 641 | "TouchEnable": true, 642 | "Tag": 32, 643 | "PrePosition": { 644 | "X": 0.6937, 645 | "Y": 0.4816 646 | }, 647 | "PreSize": { 648 | "X": 0.3125, 649 | "Y": 0.4267 650 | }, 651 | "Children": [ 652 | { 653 | "BackColorAlpha": 0, 654 | "ComboBoxIndex": 1, 655 | "SingleColor": { 656 | "R": 150, 657 | "G": 200 658 | }, 659 | "FirstColor": { 660 | "R": 150, 661 | "G": 200 662 | }, 663 | "EndColor": {}, 664 | "ColorVector": { 665 | "ScaleX": 1.0 666 | }, 667 | "Scale9Enable": true, 668 | "TouchEnable": true, 669 | "Tag": 33, 670 | "PrePosition": { 671 | "X": 0.0, 672 | "Y": 0.0 673 | }, 674 | "PreSize": { 675 | "X": 0.95, 676 | "Y": 0.8281 677 | }, 678 | "Children": [ 679 | { 680 | "FileData": { 681 | "Type": "Normal", 682 | "Path": "MainMenu/MM06.png" 683 | }, 684 | "Scale9Enable": true, 685 | "Scale9Width": 278, 686 | "Scale9Height": 53, 687 | "Tag": 34, 688 | "PrePosition": { 689 | "X": 0.4053, 690 | "Y": 0.5 691 | }, 692 | "PreSize": { 693 | "X": 0.9368, 694 | "Y": 1.0 695 | }, 696 | "ActionTag": 472261624, 697 | "Position": { 698 | "X": 77.0, 699 | "Y": 26.5 700 | }, 701 | "Scale": { 702 | "ScaleX": 1.0, 703 | "ScaleY": 1.0 704 | }, 705 | "AnchorPoint": { 706 | "ScaleX": 0.5, 707 | "ScaleY": 0.5 708 | }, 709 | "CColor": {}, 710 | "Size": { 711 | "X": 178.0, 712 | "Y": 53.0 713 | }, 714 | "FrameEvent": "", 715 | "Name": "pic_bg", 716 | "ctype": "ImageViewObjectData" 717 | }, 718 | { 719 | "FileData": { 720 | "Type": "Normal", 721 | "Path": "MainMenu/MM02.png" 722 | }, 723 | "Scale9Enable": true, 724 | "Scale9Width": 188, 725 | "Scale9Height": 54, 726 | "Tag": 35, 727 | "PrePosition": { 728 | "X": 0.4474, 729 | "Y": 0.5 730 | }, 731 | "PreSize": { 732 | "X": 1.0, 733 | "Y": 1.0 734 | }, 735 | "ActionTag": 312799703, 736 | "Position": { 737 | "X": 85.0, 738 | "Y": 26.5 739 | }, 740 | "Scale": { 741 | "ScaleX": 1.0, 742 | "ScaleY": 1.0 743 | }, 744 | "AnchorPoint": { 745 | "ScaleX": 0.5, 746 | "ScaleY": 0.5 747 | }, 748 | "CColor": {}, 749 | "Size": { 750 | "X": 188.0, 751 | "Y": 54.0 752 | }, 753 | "FrameEvent": "", 754 | "Name": "pic_cv", 755 | "ctype": "ImageViewObjectData" 756 | } 757 | ], 758 | "ActionTag": 706281390, 759 | "Position": { 760 | "X": 109.0, 761 | "Y": 27.0 762 | }, 763 | "Scale": { 764 | "ScaleX": 1.0, 765 | "ScaleY": 1.0 766 | }, 767 | "AnchorPoint": { 768 | "ScaleX": 0.5, 769 | "ScaleY": 0.5 770 | }, 771 | "CColor": {}, 772 | "Size": { 773 | "X": 190.0, 774 | "Y": 53.0 775 | }, 776 | "FrameEvent": "", 777 | "Name": "pic_bandbg", 778 | "ctype": "PanelObjectData" 779 | }, 780 | { 781 | "FontSize": 26, 782 | "LabelText": "1000000000", 783 | "Tag": 36, 784 | "PrePosition": { 785 | "X": 0.4723, 786 | "Y": 0.4045 787 | }, 788 | "PreSize": { 789 | "X": 0.0, 790 | "Y": 0.0 791 | }, 792 | "ActionTag": 607737376, 793 | "Position": { 794 | "X": 94.4527, 795 | "Y": 25.8851 796 | }, 797 | "Scale": { 798 | "ScaleX": 1.0, 799 | "ScaleY": 1.0 800 | }, 801 | "AnchorPoint": { 802 | "ScaleX": 0.5, 803 | "ScaleY": 0.5 804 | }, 805 | "CColor": { 806 | "R": 246, 807 | "B": 133 808 | }, 809 | "Size": { 810 | "X": 150.0, 811 | "Y": 35.0 812 | }, 813 | "FrameEvent": "", 814 | "Name": "coinscount", 815 | "ctype": "TextObjectData" 816 | }, 817 | { 818 | "FileData": { 819 | "Type": "Normal", 820 | "Path": "Common/Cn19.png" 821 | }, 822 | "Scale9Enable": true, 823 | "Scale9Width": 62, 824 | "Scale9Height": 62, 825 | "Tag": 37, 826 | "PrePosition": { 827 | "X": 0.0132, 828 | "Y": 0.4199 829 | }, 830 | "PreSize": { 831 | "X": 0.27, 832 | "Y": 0.8438 833 | }, 834 | "ActionTag": 416689186, 835 | "Position": { 836 | "X": 2.6421, 837 | "Y": 26.8759 838 | }, 839 | "Scale": { 840 | "ScaleX": 1.0, 841 | "ScaleY": 1.0 842 | }, 843 | "AnchorPoint": { 844 | "ScaleX": 0.5, 845 | "ScaleY": 0.5 846 | }, 847 | "CColor": {}, 848 | "Size": { 849 | "X": 62.0, 850 | "Y": 62.0 851 | }, 852 | "FrameEvent": "", 853 | "Name": "coins", 854 | "ctype": "ImageViewObjectData" 855 | } 856 | ], 857 | "ActionTag": 829058971, 858 | "Position": { 859 | "X": 443.9559, 860 | "Y": 72.243 861 | }, 862 | "Scale": { 863 | "ScaleX": 1.0, 864 | "ScaleY": 1.0 865 | }, 866 | "AnchorPoint": {}, 867 | "CColor": {}, 868 | "Size": { 869 | "X": 200.0, 870 | "Y": 64.0 871 | }, 872 | "FrameEvent": "", 873 | "Name": "coinPanel", 874 | "ctype": "PanelObjectData" 875 | }, 876 | { 877 | "BackColorAlpha": 0, 878 | "ComboBoxIndex": 1, 879 | "SingleColor": { 880 | "R": 150, 881 | "G": 200 882 | }, 883 | "FirstColor": { 884 | "R": 150, 885 | "G": 200 886 | }, 887 | "EndColor": {}, 888 | "ColorVector": { 889 | "ScaleX": 1.0 890 | }, 891 | "TouchEnable": true, 892 | "Tag": 48, 893 | "PrePosition": { 894 | "X": 0.0455, 895 | "Y": 0.0223 896 | }, 897 | "PreSize": { 898 | "X": 0.0, 899 | "Y": 0.0 900 | }, 901 | "Children": [ 902 | { 903 | "FileData": { 904 | "Type": "Normal", 905 | "Path": "MainMenu/MM06.png" 906 | }, 907 | "Scale9Enable": true, 908 | "Scale9Width": 278, 909 | "Scale9Height": 53, 910 | "Tag": 38, 911 | "PrePosition": { 912 | "X": 0.5808, 913 | "Y": 0.4531 914 | }, 915 | "PreSize": { 916 | "X": 0.9615, 917 | "Y": 0.8281 918 | }, 919 | "ActionTag": 133761885, 920 | "Position": { 921 | "X": 151.0, 922 | "Y": 29.0 923 | }, 924 | "Scale": { 925 | "ScaleX": 1.0, 926 | "ScaleY": 1.0 927 | }, 928 | "AnchorPoint": { 929 | "ScaleX": 0.5, 930 | "ScaleY": 0.5 931 | }, 932 | "CColor": {}, 933 | "Size": { 934 | "X": 278.0, 935 | "Y": 53.0 936 | }, 937 | "FrameEvent": "", 938 | "Name": "pic_bg", 939 | "ctype": "ImageViewObjectData" 940 | }, 941 | { 942 | "FileData": { 943 | "Type": "Normal", 944 | "Path": "MainMenu/MM04.png" 945 | }, 946 | "Scale9Enable": true, 947 | "Scale9Width": 61, 948 | "Scale9Height": 59, 949 | "Tag": 49, 950 | "PrePosition": { 951 | "X": 0.1077, 952 | "Y": 0.4688 953 | }, 954 | "PreSize": { 955 | "X": 0.2115, 956 | "Y": 0.9844 957 | }, 958 | "ActionTag": 335578568, 959 | "Position": { 960 | "X": 28.0, 961 | "Y": 30.0 962 | }, 963 | "Scale": { 964 | "ScaleX": 1.0, 965 | "ScaleY": 1.0 966 | }, 967 | "AnchorPoint": { 968 | "ScaleX": 0.5, 969 | "ScaleY": 0.5 970 | }, 971 | "CColor": {}, 972 | "Size": { 973 | "X": 61.0, 974 | "Y": 59.0 975 | }, 976 | "FrameEvent": "", 977 | "Name": "energy", 978 | "ctype": "ImageViewObjectData" 979 | }, 980 | { 981 | "BackColorAlpha": 0, 982 | "ComboBoxIndex": 1, 983 | "SingleColor": { 984 | "R": 150, 985 | "G": 200 986 | }, 987 | "FirstColor": { 988 | "R": 150, 989 | "G": 200 990 | }, 991 | "EndColor": {}, 992 | "ColorVector": { 993 | "ScaleX": 1.0 994 | }, 995 | "Scale9Enable": true, 996 | "TouchEnable": true, 997 | "Tag": 51, 998 | "PrePosition": { 999 | "X": 0.2192, 1000 | "Y": 0.4063 1001 | }, 1002 | "PreSize": { 1003 | "X": 0.3846, 1004 | "Y": 0.3125 1005 | }, 1006 | "Children": [ 1007 | { 1008 | "FontSize": 20, 1009 | "LabelText": "00:00:00", 1010 | "Tag": 56, 1011 | "PrePosition": { 1012 | "X": 0.5406, 1013 | "Y": 0.3694 1014 | }, 1015 | "PreSize": { 1016 | "X": 0.8, 1017 | "Y": 1.0 1018 | }, 1019 | "ActionTag": 1029051470, 1020 | "Position": { 1021 | "X": 54.0647, 1022 | "Y": 7.3883 1023 | }, 1024 | "Scale": { 1025 | "ScaleX": 1.0, 1026 | "ScaleY": 1.0 1027 | }, 1028 | "AnchorPoint": { 1029 | "ScaleX": 0.5, 1030 | "ScaleY": 0.5 1031 | }, 1032 | "CColor": { 1033 | "R": 185, 1034 | "B": 147 1035 | }, 1036 | "Size": { 1037 | "X": 82.0, 1038 | "Y": 27.0 1039 | }, 1040 | "FrameEvent": "", 1041 | "Name": "countdownLbl", 1042 | "ctype": "TextObjectData" 1043 | } 1044 | ], 1045 | "ActionTag": 850031813, 1046 | "Position": { 1047 | "X": 57.0, 1048 | "Y": 26.0 1049 | }, 1050 | "Scale": { 1051 | "ScaleX": 1.0, 1052 | "ScaleY": 1.0 1053 | }, 1054 | "AnchorPoint": {}, 1055 | "CColor": {}, 1056 | "Size": { 1057 | "X": 100.0, 1058 | "Y": 20.0 1059 | }, 1060 | "FrameEvent": "", 1061 | "Name": "energyCountdown", 1062 | "ctype": "PanelObjectData" 1063 | }, 1064 | { 1065 | "FontSize": 20, 1066 | "LabelText": "120/120", 1067 | "Tag": 50, 1068 | "PrePosition": { 1069 | "X": 0.7538, 1070 | "Y": 0.5 1071 | }, 1072 | "PreSize": { 1073 | "X": 0.35, 1074 | "Y": 0.3906 1075 | }, 1076 | "ActionTag": 985096894, 1077 | "Position": { 1078 | "X": 196.0, 1079 | "Y": 32.0 1080 | }, 1081 | "Scale": { 1082 | "ScaleX": 1.0, 1083 | "ScaleY": 1.0 1084 | }, 1085 | "AnchorPoint": { 1086 | "ScaleX": 0.5, 1087 | "ScaleY": 0.5 1088 | }, 1089 | "CColor": { 1090 | "R": 246, 1091 | "B": 133 1092 | }, 1093 | "Size": { 1094 | "X": 81.0, 1095 | "Y": 27.0 1096 | }, 1097 | "FrameEvent": "", 1098 | "Name": "energycount", 1099 | "ctype": "TextObjectData" 1100 | }, 1101 | { 1102 | "FileData": { 1103 | "Type": "Normal", 1104 | "Path": "MainMenu/MM13.png" 1105 | }, 1106 | "Scale9Enable": true, 1107 | "Scale9Width": 115, 1108 | "Scale9Height": 13, 1109 | "Tag": 39, 1110 | "PrePosition": { 1111 | "X": 0.6454, 1112 | "Y": 0.2782 1113 | }, 1114 | "PreSize": { 1115 | "X": 0.8462, 1116 | "Y": 0.2031 1117 | }, 1118 | "ActionTag": 736533316, 1119 | "Position": { 1120 | "X": 167.8165, 1121 | "Y": 17.8025 1122 | }, 1123 | "Scale": { 1124 | "ScaleX": 1.0, 1125 | "ScaleY": 1.0 1126 | }, 1127 | "AnchorPoint": { 1128 | "ScaleX": 0.5, 1129 | "ScaleY": 0.5 1130 | }, 1131 | "CColor": {}, 1132 | "Size": { 1133 | "X": 220.0, 1134 | "Y": 13.0 1135 | }, 1136 | "FrameEvent": "", 1137 | "Name": "pic_barbg", 1138 | "ctype": "ImageViewObjectData" 1139 | }, 1140 | { 1141 | "ProgressInfo": 100, 1142 | "ImageFileData": { 1143 | "Type": "Normal", 1144 | "Path": "MainMenu/MM12.png" 1145 | }, 1146 | "Tag": 40, 1147 | "PrePosition": { 1148 | "X": 0.6425, 1149 | "Y": 0.2813 1150 | }, 1151 | "PreSize": { 1152 | "X": 0.6538, 1153 | "Y": 0.1719 1154 | }, 1155 | "ActionTag": 994979630, 1156 | "Position": { 1157 | "X": 167.056, 1158 | "Y": 18.0 1159 | }, 1160 | "Scale": { 1161 | "ScaleX": 2.27, 1162 | "ScaleY": 1.0 1163 | }, 1164 | "AnchorPoint": { 1165 | "ScaleX": 0.5, 1166 | "ScaleY": 0.5 1167 | }, 1168 | "CColor": {}, 1169 | "Size": { 1170 | "X": 94.0, 1171 | "Y": 10.0 1172 | }, 1173 | "FrameEvent": "", 1174 | "Name": "bar_energy", 1175 | "ctype": "LoadingBarObjectData" 1176 | } 1177 | ], 1178 | "ActionTag": 702407125, 1179 | "Position": { 1180 | "X": 29.1476, 1181 | "Y": 3.3428 1182 | }, 1183 | "Scale": { 1184 | "ScaleX": 1.0, 1185 | "ScaleY": 1.0 1186 | }, 1187 | "AnchorPoint": {}, 1188 | "CColor": {}, 1189 | "Size": { 1190 | "X": 260.0, 1191 | "Y": 64.0 1192 | }, 1193 | "FrameEvent": "", 1194 | "Name": "energyPanel", 1195 | "ctype": "PanelObjectData" 1196 | }, 1197 | { 1198 | "BackColorAlpha": 0, 1199 | "ComboBoxIndex": 1, 1200 | "SingleColor": { 1201 | "R": 150, 1202 | "G": 200 1203 | }, 1204 | "FirstColor": { 1205 | "R": 150, 1206 | "G": 200 1207 | }, 1208 | "EndColor": {}, 1209 | "ColorVector": { 1210 | "ScaleX": 1.0 1211 | }, 1212 | "Scale9Enable": true, 1213 | "TouchEnable": true, 1214 | "Tag": 42, 1215 | "PrePosition": { 1216 | "X": 0.5159, 1217 | "Y": 0.0223 1218 | }, 1219 | "PreSize": { 1220 | "X": 0.4063, 1221 | "Y": 0.4267 1222 | }, 1223 | "Children": [ 1224 | { 1225 | "FileData": { 1226 | "Type": "Normal", 1227 | "Path": "MainMenu/MM06.png" 1228 | }, 1229 | "Scale9Enable": true, 1230 | "Scale9Width": 278, 1231 | "Scale9Height": 53, 1232 | "Tag": 43, 1233 | "PrePosition": { 1234 | "X": 0.5808, 1235 | "Y": 0.4531 1236 | }, 1237 | "PreSize": { 1238 | "X": 0.0, 1239 | "Y": 0.0 1240 | }, 1241 | "ActionTag": 975972766, 1242 | "Position": { 1243 | "X": 151.0, 1244 | "Y": 29.0 1245 | }, 1246 | "Scale": { 1247 | "ScaleX": 1.0, 1248 | "ScaleY": 1.0 1249 | }, 1250 | "AnchorPoint": { 1251 | "ScaleX": 0.5, 1252 | "ScaleY": 0.5 1253 | }, 1254 | "CColor": {}, 1255 | "Size": { 1256 | "X": 278.0, 1257 | "Y": 53.0 1258 | }, 1259 | "FrameEvent": "", 1260 | "Name": "pic_bg", 1261 | "ctype": "ImageViewObjectData" 1262 | }, 1263 | { 1264 | "FlipX": true, 1265 | "FlipY": true, 1266 | "FileData": { 1267 | "Type": "Normal", 1268 | "Path": "Common/Cn17.png" 1269 | }, 1270 | "Scale9Enable": true, 1271 | "Scale9Width": 55, 1272 | "Scale9Height": 63, 1273 | "Tag": 44, 1274 | "PrePosition": { 1275 | "X": 0.0, 1276 | "Y": 0.0 1277 | }, 1278 | "PreSize": { 1279 | "X": 0.0, 1280 | "Y": 0.0 1281 | }, 1282 | "ActionTag": 446291272, 1283 | "Position": { 1284 | "X": 28.0, 1285 | "Y": 30.0 1286 | }, 1287 | "Scale": { 1288 | "ScaleX": 1.0, 1289 | "ScaleY": 1.0 1290 | }, 1291 | "Rotation": 179.6827, 1292 | "RotationSkewX": 179.6827, 1293 | "RotationSkewY": 179.6827, 1294 | "AnchorPoint": { 1295 | "ScaleX": 0.5, 1296 | "ScaleY": 0.5 1297 | }, 1298 | "CColor": {}, 1299 | "Size": { 1300 | "X": 55.0, 1301 | "Y": 63.0 1302 | }, 1303 | "FrameEvent": "", 1304 | "Name": "energy", 1305 | "ctype": "ImageViewObjectData" 1306 | }, 1307 | { 1308 | "BackColorAlpha": 0, 1309 | "ComboBoxIndex": 1, 1310 | "SingleColor": { 1311 | "R": 150, 1312 | "G": 200 1313 | }, 1314 | "FirstColor": { 1315 | "R": 150, 1316 | "G": 200 1317 | }, 1318 | "EndColor": {}, 1319 | "ColorVector": { 1320 | "ScaleX": 1.0 1321 | }, 1322 | "Scale9Enable": true, 1323 | "TouchEnable": true, 1324 | "Tag": 45, 1325 | "PrePosition": { 1326 | "X": 0.285, 1327 | "Y": 0.13 1328 | }, 1329 | "PreSize": { 1330 | "X": 0.5, 1331 | "Y": 0.1 1332 | }, 1333 | "Children": [ 1334 | { 1335 | "FontSize": 20, 1336 | "LabelText": "00:00:00", 1337 | "Tag": 46, 1338 | "PrePosition": { 1339 | "X": 0.0, 1340 | "Y": 0.0 1341 | }, 1342 | "PreSize": { 1343 | "X": 0.0, 1344 | "Y": 0.0 1345 | }, 1346 | "ActionTag": 5505226, 1347 | "Position": { 1348 | "X": 54.0647, 1349 | "Y": 7.3883 1350 | }, 1351 | "Scale": { 1352 | "ScaleX": 1.0, 1353 | "ScaleY": 1.0 1354 | }, 1355 | "AnchorPoint": { 1356 | "ScaleX": 0.5, 1357 | "ScaleY": 0.5 1358 | }, 1359 | "CColor": { 1360 | "R": 185, 1361 | "B": 147 1362 | }, 1363 | "Size": { 1364 | "X": 82.0, 1365 | "Y": 27.0 1366 | }, 1367 | "FrameEvent": "", 1368 | "Name": "countdownLbl", 1369 | "ctype": "TextObjectData" 1370 | } 1371 | ], 1372 | "ActionTag": 933848944, 1373 | "Position": { 1374 | "X": 57.0, 1375 | "Y": 26.0 1376 | }, 1377 | "Scale": { 1378 | "ScaleX": 1.0, 1379 | "ScaleY": 1.0 1380 | }, 1381 | "AnchorPoint": {}, 1382 | "CColor": {}, 1383 | "Size": { 1384 | "X": 100.0, 1385 | "Y": 20.0 1386 | }, 1387 | "FrameEvent": "", 1388 | "Name": "pvpenergyCountdown", 1389 | "ctype": "PanelObjectData" 1390 | }, 1391 | { 1392 | "FontSize": 20, 1393 | "LabelText": "120/120", 1394 | "Tag": 47, 1395 | "PrePosition": { 1396 | "X": 0.0, 1397 | "Y": 0.0 1398 | }, 1399 | "PreSize": { 1400 | "X": 0.0, 1401 | "Y": 0.0 1402 | }, 1403 | "ActionTag": 244896851, 1404 | "Position": { 1405 | "X": 196.0, 1406 | "Y": 32.0 1407 | }, 1408 | "Scale": { 1409 | "ScaleX": 1.0, 1410 | "ScaleY": 1.0 1411 | }, 1412 | "AnchorPoint": { 1413 | "ScaleX": 0.5, 1414 | "ScaleY": 0.5 1415 | }, 1416 | "CColor": { 1417 | "R": 246, 1418 | "B": 133 1419 | }, 1420 | "Size": { 1421 | "X": 81.0, 1422 | "Y": 27.0 1423 | }, 1424 | "FrameEvent": "", 1425 | "Name": "energycount", 1426 | "ctype": "TextObjectData" 1427 | }, 1428 | { 1429 | "FileData": { 1430 | "Type": "Normal", 1431 | "Path": "MainMenu/MM13.png" 1432 | }, 1433 | "Scale9Enable": true, 1434 | "Scale9Width": 115, 1435 | "Scale9Height": 13, 1436 | "Tag": 48, 1437 | "PrePosition": { 1438 | "X": 0.6118, 1439 | "Y": 0.2819 1440 | }, 1441 | "PreSize": { 1442 | "X": 0.8462, 1443 | "Y": 0.2031 1444 | }, 1445 | "ActionTag": 528025340, 1446 | "Position": { 1447 | "X": 159.059, 1448 | "Y": 18.0421 1449 | }, 1450 | "Scale": { 1451 | "ScaleX": 1.0, 1452 | "ScaleY": 1.0 1453 | }, 1454 | "AnchorPoint": { 1455 | "ScaleX": 0.5, 1456 | "ScaleY": 0.5 1457 | }, 1458 | "CColor": {}, 1459 | "Size": { 1460 | "X": 220.0, 1461 | "Y": 13.0 1462 | }, 1463 | "FrameEvent": "", 1464 | "Name": "pic_barbg", 1465 | "ctype": "ImageViewObjectData" 1466 | }, 1467 | { 1468 | "ProgressInfo": 100, 1469 | "ImageFileData": { 1470 | "Type": "Normal", 1471 | "Path": "MainMenu/MM12.png" 1472 | }, 1473 | "Tag": 49, 1474 | "PrePosition": { 1475 | "X": 0.6118, 1476 | "Y": 0.2856 1477 | }, 1478 | "PreSize": { 1479 | "X": 0.6538, 1480 | "Y": 0.1563 1481 | }, 1482 | "ActionTag": 681473813, 1483 | "Position": { 1484 | "X": 159.059, 1485 | "Y": 18.2815 1486 | }, 1487 | "Scale": { 1488 | "ScaleX": 2.27, 1489 | "ScaleY": 1.0 1490 | }, 1491 | "AnchorPoint": { 1492 | "ScaleX": 0.5, 1493 | "ScaleY": 0.5 1494 | }, 1495 | "CColor": {}, 1496 | "Size": { 1497 | "X": 94.0, 1498 | "Y": 10.0 1499 | }, 1500 | "FrameEvent": "", 1501 | "Name": "bar_energy", 1502 | "ctype": "LoadingBarObjectData" 1503 | } 1504 | ], 1505 | "ActionTag": 1013422394, 1506 | "Position": { 1507 | "X": 330.1477, 1508 | "Y": 3.3427 1509 | }, 1510 | "Scale": { 1511 | "ScaleX": 1.0, 1512 | "ScaleY": 1.0 1513 | }, 1514 | "AnchorPoint": {}, 1515 | "CColor": {}, 1516 | "Size": { 1517 | "X": 260.0, 1518 | "Y": 64.0 1519 | }, 1520 | "FrameEvent": "", 1521 | "Name": "pvpenergyPanel", 1522 | "ctype": "PanelObjectData" 1523 | } 1524 | ], 1525 | "ActionTag": 254923150, 1526 | "Position": { 1527 | "X": 0.0, 1528 | "Y": 960.0 1529 | }, 1530 | "Scale": { 1531 | "ScaleX": 1.0, 1532 | "ScaleY": 1.0 1533 | }, 1534 | "AnchorPoint": { 1535 | "ScaleY": 1.0 1536 | }, 1537 | "CColor": {}, 1538 | "Size": { 1539 | "X": 640.0, 1540 | "Y": 150.0 1541 | }, 1542 | "FrameEvent": "", 1543 | "Name": "TopBar", 1544 | "ctype": "ImageViewObjectData" 1545 | } 1546 | ], 1547 | "Position": { 1548 | "X": 0.0, 1549 | "Y": 0.0 1550 | }, 1551 | "Scale": { 1552 | "ScaleX": 1.0, 1553 | "ScaleY": 1.0 1554 | }, 1555 | "AnchorPoint": {}, 1556 | "CColor": {}, 1557 | "Size": { 1558 | "X": 0.0, 1559 | "Y": 0.0 1560 | }, 1561 | "FrameEvent": "", 1562 | "Name": "Node_0", 1563 | "ctype": "NodeObjectData" 1564 | }, 1565 | "ctype": "GameProjectData" 1566 | } 1567 | }, 1568 | "Type": "Node" 1569 | } -------------------------------------------------------------------------------- /res/finger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShawnZhang2015/Guide/a8cd7fb6f414e04fd00f47fe6b7c8460260a3d64/res/finger.png -------------------------------------------------------------------------------- /src/guideConfig.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by zxh on 15/3/20. 3 | */ 4 | /** 5 | * Created by zxh on 15/3/18. 6 | */ 7 | 8 | var guideConfig = { 9 | tasks: { 10 | 1: [ 11 | { 12 | log: "关闭第一盏灯", 13 | command: sz.GuideCommand.GC_FINGER_HINT, 14 | locator:"_fire1" 15 | }, 16 | 17 | { 18 | log: "关闭第二盏灯", 19 | command: sz.GuideCommand.GC_FINGER_HINT, 20 | locator:"_fire2" 21 | }, 22 | 23 | { 24 | log: "保存进度", 25 | command: sz.GuideCommand.GC_SAVE_PROGRESS 26 | }, 27 | 28 | { 29 | log: "点亮第一盏灯", 30 | command: sz.GuideCommand.GC_FINGER_HINT, 31 | locator:"_fire1", 32 | showMask: true 33 | }, 34 | 35 | { 36 | log: "点亮第二盏灯", 37 | command: sz.GuideCommand.GC_FINGER_HINT, 38 | locator:"_fire2", 39 | showMask: true 40 | }, 41 | ], 42 | 43 | 2: [ 44 | { 45 | log:'点击home', 46 | command: sz.GuideCommand.GC_FINGER_HINT, 47 | locator:"_btnHome", 48 | eventType:0 49 | } 50 | ], 51 | 52 | 3: [ 53 | { 54 | log:'点击task', 55 | command: sz.GuideCommand.GC_FINGER_HINT, 56 | locator:"_btnTask", 57 | showMask: true 58 | } 59 | ] 60 | }, 61 | locateNodeDurationTime: 0.1, 62 | fingerImage: 'res/finger.png', 63 | eventType: 2, 64 | isShowMask: true, //默认为不打开 65 | isAutoGuide: false, //自动引导 66 | isShowTouchPoint:true 67 | }; 68 | -------------------------------------------------------------------------------- /src/lib/Guide.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by zxh on 15/3/17. 3 | */ 4 | var sz = sz || {}; 5 | 6 | 7 | sz.Locator = { 8 | 9 | /** 10 | * 定位解析 11 | * @param locator 12 | * @returns {Array} 13 | */ 14 | parse: function(locator) { 15 | cc.assert(locator, 'locator string is null'); 16 | 17 | //使用正则表达示分隔名字 18 | var names = locator.split(/[.,//,>,#]/g); 19 | var segments = names.map(function(name) { 20 | var index = locator.indexOf(name); 21 | var symbol = locator[index - 1] || '>'; 22 | return {symbol: symbol, name: name.trim()}; 23 | }); 24 | return segments; 25 | }, 26 | 27 | /** 28 | * 通过节点名搜索节点对象 29 | * @param root 30 | * @param name 31 | * @returns {*} 32 | */ 33 | seekNodeByName: function(root, name) { 34 | if (!root) 35 | return null; 36 | if (root.getName() == name) 37 | return root; 38 | var arrayRootChildren = root.getChildren(); 39 | var length = arrayRootChildren.length; 40 | for (var i = 0; i < length; i++) { 41 | var child = arrayRootChildren[i]; 42 | var res = this.seekNodeByName(child, name); 43 | if (res != null) 44 | return res; 45 | } 46 | return null; 47 | }, 48 | 49 | /** 50 | * 通过Tag搜索节点 51 | * @param root 52 | * @param tag 53 | * @returns {*} 54 | */ 55 | seekNodeByTag: function (root, tag) { 56 | if (!root) 57 | return null; 58 | if (root.getTag() == tag) 59 | return root; 60 | var arrayRootChildren = root.getChildren(); 61 | var length = arrayRootChildren.length; 62 | for (var i = 0; i < length; i++) { 63 | var child = arrayRootChildren[i]; 64 | var res = this.seekNodeByTag(child, tag); 65 | if (res != null) 66 | return res; 67 | } 68 | return null; 69 | }, 70 | 71 | /** 72 | * 在root节点中,定位locator 73 | * @param root 74 | * @param locator 75 | * @param cb 76 | */ 77 | locateNode: function(root, locator, cb) { 78 | var segments = this.parse(locator); 79 | cc.assert(segments && segments.length); 80 | cc.log('guide locateNode:' + locator); 81 | var child, node = root; 82 | 83 | for (var i = 0; i < segments.length; i++) { 84 | var item = segments[i]; 85 | switch (item.symbol) { 86 | case '/': child = node.getChildByName(item.name); break; 87 | case '.': child = node[item.name]; break; 88 | case '>': child = this.seekNodeByName(node, item.name); break; 89 | case '#': child = this.seekNodeByTag(node, item.name); break; 90 | } 91 | 92 | if (!child) { 93 | node = null; 94 | break; 95 | } 96 | node = child; 97 | } 98 | 99 | if (node) { 100 | cb(node); 101 | } 102 | return node; 103 | }, 104 | 105 | mouseSimulation: function(x, y) { 106 | var canvas = document.getElementById("gameCanvas"); 107 | var pos = cc.inputManager.getHTMLElementPosition(canvas);//getHTMLElementPosition(canvas); 108 | var pt = cc.p(x + pos.left, pos.top + pos.height - y); 109 | 110 | var mousedown = document.createEvent("MouseEvent"); 111 | mousedown.initMouseEvent("mousedown", true, true, window, 0, 0, 0, pt.x, pt.y, true, false, false, false, 0, null); 112 | canvas.dispatchEvent(mousedown); 113 | setTimeout(function () { 114 | var mouseup = document.createEvent("MouseEvent"); 115 | mouseup.initMouseEvent("mouseup", true, true, window, 0, 0, 0, pt.x, pt.y, true, false, false, false, 0, null); 116 | canvas.dispatchEvent(mouseup); 117 | }, 100); 118 | } 119 | 120 | }; 121 | 122 | //引导指令 123 | sz.GuideCommand = { 124 | GC_NULL: undefined, //空指令 125 | GC_SET_PROPERTY: 1, //设置属性 126 | GC_FINGER_HINT: 2, //手型提示 127 | GC_SAVE_PROGRESS: 3 //保存进度 128 | }; 129 | 130 | 131 | /** 132 | * 文字提示框 133 | */ 134 | sz.TextHintLayer = cc.Layer.extend({ 135 | _textLabel: null, 136 | ctor: function() { 137 | this._super(); 138 | this.ignoreAnchor = false; 139 | this.setAnchorPoint(0, 0); 140 | this.setContentSize(this.width * 0.5, 200); 141 | this._textLabel = new cc.LabelTTF("", "Arail", 26); 142 | this._textLabel.setAnchorPoint(0, 0.5); 143 | this._textLabel.setPosition(10, this.height * 0.5); 144 | this.addChild(this._textLabel); 145 | }, 146 | 147 | setTextHint: function(textHint) { 148 | if (!textHint.text) { 149 | this.setVisible(false); 150 | return; 151 | } 152 | this.setVisible(true); 153 | this._textLabel.string = textHint.text; 154 | if (textHint.pos) { 155 | this.setPosition(textHint.pos); 156 | } 157 | } 158 | }); 159 | 160 | sz.GuideIndexName = 'sz.guideIndexName'; 161 | 162 | sz.GuideTaskHandle = cc.Class.extend({ 163 | _guideLayer: null, 164 | _guideConfig: null, 165 | _curStepConfig: null, 166 | ctor: function(guideLayer, guidConfig) { 167 | this._guideLayer = guideLayer; 168 | this._guideConfig = guidConfig; 169 | this._processTasks(); 170 | }, 171 | 172 | /** 173 | * 初始化任务队列与步骤id, 实际使用时,请重写此函数 174 | * @private 175 | */ 176 | _initTasks: function() { 177 | //分析任务 178 | var tasks = []; 179 | for (var key in this._guideConfig.tasks) { 180 | if (this._guideConfig.tasks.hasOwnProperty(key)) { 181 | tasks.push(this._guideConfig.tasks[key]); 182 | } 183 | } 184 | tasks.splice(0, this._guideLayer._index); 185 | return tasks; 186 | }, 187 | 188 | _processTasks: function() { 189 | var self = this; 190 | //加载进度 191 | this._guideLayer.loadProgress(); 192 | //初始化任务队列 193 | var tasks = this._initTasks(); 194 | 195 | //一个step 196 | var stepHandle = function(step, callback) { 197 | self._curStepConfig = step; 198 | async.series({ 199 | //步骤开始 200 | stepBegin: function(cb) { 201 | self._guideLayer._setLocateNode(null); 202 | if (step.onEnter) { 203 | step.onEnter.call(self._guideLayer, cb); 204 | } else { 205 | cb(); 206 | } 207 | }, 208 | 209 | //步骤处理 210 | stepProcess: function(cb) { 211 | if (step.delayTime) { 212 | self._guideLayer.scheduleOnce(function() { 213 | self._processStep(step, cb); 214 | }, step.delayTime); 215 | } else { 216 | self._processStep(step, cb); 217 | } 218 | }, 219 | 220 | //步骤完毕 221 | stepEnd: function() { 222 | self._guideLayer._isTouchLocked = true; 223 | self._guideLayer.hideMask(); 224 | if (step.onExit) { 225 | step.onExit.call(self._guideLayer, callback); 226 | } else { 227 | callback(); 228 | } 229 | } 230 | }); 231 | }; 232 | 233 | //任务组 234 | async.eachSeries(tasks, function(task, cb) { 235 | async.eachSeries(task, stepHandle, function() { 236 | self._guideLayer.saveProgress(true, cb); 237 | }); 238 | }, function() { 239 | self._exitGuide(); 240 | }); 241 | }, 242 | 243 | getCurStepConfig: function() { 244 | return this._curStepConfig; 245 | }, 246 | 247 | _exitGuide: function() { 248 | this._guideLayer.destory(); 249 | this._guideLayer = null; 250 | }, 251 | 252 | /** 253 | * 254 | */ 255 | _processStep: function(step, cb) { 256 | var self = this; 257 | 258 | if (step.log) { 259 | cc.log("guide: <" + step.log + ", step begin >"); 260 | } 261 | 262 | var finish = function() { 263 | self._guideLayer._closeTextHint(); 264 | self._guideLayer.stopFingerAction(false); 265 | if (step.log) { 266 | cc.log("guide: <" + step.log + ", step finished >"); 267 | } 268 | 269 | if (step.delayTime) { 270 | setTimeout(cb, step.delayTime * 1000); 271 | } else { 272 | cb(); 273 | } 274 | }; 275 | 276 | // if(step.textHint){ 277 | // cc.log(step.textHint.text); 278 | // } 279 | 280 | switch (step.command) { 281 | 282 | //设置属性 283 | case sz.GuideCommand.GC_SET_PROPERTY: 284 | this._guideLayer.locateNode(step.locator, function(node) { 285 | var property = step.args[0]; 286 | var args = step.args.slice(1); 287 | node[property].apply(node, args); 288 | finish(); 289 | }); 290 | break; 291 | //手型提示 292 | case sz.GuideCommand.GC_FINGER_HINT: 293 | this._guideLayer.locateNode(step.locator, function(node) { 294 | self._guideLayer.fingerToNode(node, finish, self._guideConfig.isFingerAnimation); 295 | if (step.showMask) { 296 | self._guideLayer.showMask(true); 297 | } 298 | if (step.onLocateNode) { 299 | step.onLocateNode.call(self._guideLayer, node); 300 | } 301 | //显示文字提示 302 | if (step.textHint) { 303 | self._guideLayer._showTextHint(step.textHint); 304 | } 305 | 306 | }); 307 | break; 308 | //保存进度 309 | case sz.GuideCommand.GC_SAVE_PROGRESS: 310 | this._guideLayer.saveProgress(false, finish); 311 | break; 312 | case sz.GuideCommand.GC_NULL: 313 | finish(); 314 | break; 315 | default: 316 | cc.log("guide command is not define"); 317 | } 318 | } 319 | }); 320 | 321 | /** 322 | * 引导界面类 323 | * @type {void|*} 324 | */ 325 | sz.GuideLayer = cc.Layer.extend({ 326 | _index: null, //引导序号 327 | _target: null, //引导类对依附的主界面 328 | _finger: null, //手型精灵 329 | _guideConfig: null, //引导配置对象 330 | _touchRect: null, //可色触摸矩形区 331 | _locateNode: null, //定位节点 332 | _guideTaskHandle: null, //引导任务处理器 333 | _isTouchLocked: false, 334 | 335 | ctor: function(target, guidConfig) { 336 | cc.assert(target || guidConfig); 337 | this._super(); 338 | this._index = 0; 339 | this._target = target; 340 | this._guideConfig = guidConfig; 341 | this._initFinger(); 342 | }, 343 | 344 | /** 345 | * 创建任务处理器,可以子类重写 346 | * @returns {sz.GuideTaskHandle} 347 | * @private 348 | */ 349 | _createTaskHandle: function() { 350 | return new sz.GuideTaskHandle(this, this._guideConfig); 351 | }, 352 | 353 | onEnter: function() { 354 | this._super(); 355 | if (this._guideTaskHandle) { 356 | return; 357 | } 358 | 359 | this._guideTaskHandle = this._createTaskHandle(); 360 | 361 | //为layer注册触摸事件,默认使用sz.UIloadero 362 | var self = this; 363 | if (sz.uiloader) { 364 | 365 | sz.uiloader.registerTouchEvent(this); 366 | this._widgetEvent = sz.uiloader._onWidgetEvent; 367 | sz.uiloader._onWidgetEvent = function(sender, type) { 368 | if (self._widgetEvent) { 369 | self._widgetEvent.call(sz.uiloader, sender, type); 370 | } 371 | self._onWidgetEvent(sender, type); 372 | }; 373 | } else { 374 | //兼容没有使用sz.UILoader时,注册事件 375 | var touchListener = cc.EventListener.create({ 376 | event: cc.EventListener.TOUCH_ONE_BY_ONE, 377 | swallowTouches: true, 378 | onTouchBegan: function(touch, event) { 379 | var touchNode = event.getCurrentTarget(); 380 | var ret = self._onTouchBegan(touchNode, touch, event); 381 | return ret ? true : false; 382 | } 383 | }); 384 | cc.eventManager.addListener(touchListener, this); 385 | } 386 | }, 387 | 388 | saveProgress: function(isForward, cb) { 389 | var localStorage = localStorage || cc.sys.localStorage; 390 | 391 | localStorage.setItem(sz.GuideIndexName, isForward ? ++this._index : this._index + 1); 392 | 393 | if (cb) { 394 | cb(); 395 | } 396 | }, 397 | 398 | loadProgress: function() { 399 | var localStorage = localStorage || cc.sys.localStorage; 400 | this._index = parseInt(localStorage.getItem(sz.GuideIndexName)) || 0; 401 | }, 402 | 403 | /** 404 | * 初始化手型提示 405 | * @private 406 | */ 407 | _initFinger: function() { 408 | this._finger = new cc.Sprite(this._guideConfig.fingerImage); 409 | this._finger.setPosition(this.width * 0.5, this.height * 0.5); 410 | this._finger.setAnchorPoint(0, 1); 411 | this._finger.setVisible(false); 412 | this.addChild(this._finger); 413 | }, 414 | 415 | /** 416 | * 手型指向定位节点 417 | * @param locateNode 418 | * @param cb 419 | * @private 420 | */ 421 | fingerToNode: function(locateNode, callback, isAnimation) { 422 | this._setLocateNode(null); 423 | 424 | var point = locateNode.getParent().convertToWorldSpace(locateNode.getPosition()); 425 | 426 | //this._fingerToPoint(point, isAnimation); 427 | point.x -= locateNode.width * locateNode.anchorX; 428 | point.y -= locateNode.height * locateNode.anchorY; 429 | this._touchRect = cc.rect(point.x, point.y, locateNode.width, locateNode.height); 430 | if (locateNode instanceof ccui.Widget && locateNode.isTouchEnabled()) { 431 | this._setLocateNode(locateNode); 432 | } 433 | this._fingerToPoint(cc.p(this._touchRect.x + this._touchRect.width * 0.5, this._touchRect.y + this._touchRect.height * 0.5) , isAnimation); 434 | 435 | this.showMask(); 436 | //保存任务完成回调函数 437 | this._setpCallback = callback; 438 | }, 439 | 440 | /** 441 | * 手型动画,指向指定位置 442 | * @param point 443 | * @param isAnimation 444 | */ 445 | _fingerToPoint: function(point, isAnimation) { 446 | this._finger.stopAllActions(); 447 | this._finger.setScale(1); 448 | this._finger.setVisible(true); 449 | var moveTime = 0; 450 | if (point && isAnimation) { 451 | var width = this._finger.x - point.x; 452 | var height = this._finger.y - point.y; 453 | var length = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2)); 454 | moveTime = length / (this.width * 1); 455 | var moveTo = cc.moveTo(moveTime , point); 456 | var action = cc.sequence(moveTo, cc.callFunc(function() { 457 | var scaleBy = cc.scaleBy(0.3, 0.8); 458 | var scaleBy2 = cc.scaleTo(0.3, 1); 459 | var sequence = cc.sequence(scaleBy, scaleBy2); 460 | this._finger.runAction(cc.repeatForever(sequence)); 461 | }, this)); 462 | this._finger.runAction(action); 463 | } else if (point) { 464 | this._finger.setPosition(point); 465 | } 466 | 467 | 468 | //是否自动引导 469 | if (this._guideConfig.isAutoGuide && !cc.sys.isNative) { 470 | var temp = cc.p(point.x, point.y); 471 | this.scheduleOnce(function() { 472 | sz.Locator.mouseSimulation(temp.x, temp.y); 473 | }, moveTime + 0.2); 474 | } 475 | }, 476 | 477 | /** 478 | * 手型精灵依次在多个座标点中移动 479 | * @param pointArray 480 | * @param time 481 | * @param isRepeat 482 | */ 483 | _fingerToPointArray: function(pointArray, time, isRepeat) { 484 | var array = []; 485 | var firstPoint = pointArray.shift(); 486 | this._finger.setPosition(firstPoint); 487 | this._finger.stopAllActions(); 488 | this._finger.setVisible(true); 489 | _.each(pointArray, function(pt, index) { 490 | var moveTo = cc.moveTo(time, pt); 491 | if (index === 0) { 492 | array.push(cc.spawn(moveTo, cc.fadeIn(time))); 493 | } else { 494 | array.push(moveTo); 495 | } 496 | }); 497 | 498 | //延时1秒 499 | array.push(cc.spawn(cc.delayTime(0.5), cc.fadeOut(0.5))); 500 | array.push(cc.callFunc(function() { 501 | this._finger.setPosition(firstPoint); 502 | this._finger.setOpacity(150); 503 | }, this)); 504 | var action = cc.sequence(array); 505 | if (isRepeat) { 506 | action = cc.repeatForever(action); 507 | } 508 | 509 | this._finger.runAction(action); 510 | }, 511 | 512 | /** 513 | * 停止手型提示 514 | * @param visible 515 | */ 516 | stopFingerAction: function(visible) { 517 | this._finger.stopAllActions(); 518 | if (typeof visible === 'boolean') { 519 | this._finger.setVisible(visible); 520 | } 521 | }, 522 | 523 | /** 524 | * 触摸事件,检查定位区 525 | * @param touch 526 | * @returns {boolean} 527 | */ 528 | _onTouchBegan: function(sender, touch) { 529 | //可触摸矩形区不存在退出 530 | if (!this._touchRect) { 531 | cc.log("this._touchRect = null"); 532 | return this._isTouchLocked; 533 | } 534 | 535 | var point = touch.getLocation(); 536 | //设置点击位置显示 537 | if(this._guideConfig.isShowTouchPoint){ 538 | 539 | if(!this._colorLayer){ 540 | this._colorLayer = new cc.LayerColor(cc.color.RED, 10 ,10); 541 | this._colorLayer.setAnchorPoint(0.5,0.5); 542 | this._colorLayer.ignoreAnchor = false; 543 | this.addChild( this._colorLayer,90000); 544 | } 545 | this._colorLayer.setPosition(point); 546 | } 547 | 548 | 549 | var isContains = cc.rectContainsPoint(this._touchRect, point); 550 | if (isContains) { 551 | if (!this._locateNode) { 552 | this._setLocateNode(null); 553 | this._setpCallback(); 554 | } 555 | } 556 | 557 | return !isContains; 558 | }, 559 | 560 | _onTouchEnded: function() { 561 | cc.log("Guide Layer onTouchEnded"); 562 | }, 563 | 564 | /** 565 | * widget控件事件 566 | * @param sender 567 | * @param type 568 | * @private 569 | */ 570 | _onWidgetEvent: function(sender, type) { 571 | //检查是否命中控件 572 | var isHitWidget = this._locateNode && (sender === this._locateNode || sender.getName() === this._locateNode.getName()); 573 | 574 | var stepConfig = this._guideTaskHandle.getCurStepConfig(); 575 | if (isHitWidget && (stepConfig.eventType === type || this._guideConfig.eventType === type || !this._guideConfig.eventType)) { 576 | // cc.log("清空_touchRect"); 577 | // this._touchRect = null; 578 | this._setLocateNode(null); 579 | this._setpCallback(); 580 | } 581 | 582 | }, 583 | 584 | /** 585 | * 设置定位节点 586 | * @param node 587 | * @private 588 | */ 589 | _setLocateNode: function(node) { 590 | if (this._locateNode) { 591 | this._locateNode.release(); 592 | } 593 | 594 | this._locateNode = node; 595 | if (node) { 596 | node.retain(); 597 | } else { 598 | this._touchRect = null; 599 | } 600 | }, 601 | 602 | /** 603 | * 通过定位器字符串,定位节点 604 | * @param locator 605 | * @param cb 606 | */ 607 | locateNode: function(locator, cb) { 608 | var node = sz.Locator.locateNode(this._target, locator, cb); 609 | if (!node) { 610 | this.scheduleOnce(function() { 611 | this.locateNode(locator, cb); 612 | }, this._guideConfig.locateNodeDurationTime || 0.1); 613 | } 614 | }, 615 | 616 | hideMask: function() { 617 | if (this._clipper) { 618 | this._clipper.setVisible(false); 619 | } 620 | }, 621 | 622 | /** 623 | * 显示遮罩层 624 | */ 625 | showMask: function(isForce) { 626 | 627 | if (!isForce && !this._guideConfig.isShowMask) { 628 | if (this._clipper) { 629 | this._clipper.setVisible(false); 630 | } 631 | return; 632 | } 633 | 634 | var stencil; 635 | if (!this._clipper) { 636 | stencil = new cc.LayerColor();//cc.DrawNode(); 637 | var clipper = new cc.ClippingNode(); 638 | clipper.stencil = stencil; 639 | this.addChild(clipper, -1); 640 | clipper.setInverted(true); 641 | var content = new cc.LayerColor(cc.color.RED); 642 | content.setOpacity(150); 643 | clipper.addChild(content); 644 | this._clipper = clipper; 645 | } else { 646 | stencil = this._clipper.stencil; 647 | } 648 | this._clipper.setVisible(true); 649 | stencil.setContentSize(this._touchRect.width, this._touchRect.height); 650 | stencil.setPosition(this._touchRect.x, this._touchRect.y); 651 | }, 652 | 653 | /** 654 | * 显示文字提示 655 | * @param textHint 656 | * @private 657 | */ 658 | _showTextHint: function(textHint) { 659 | if (!textHint.text) { 660 | return; 661 | } 662 | if (!this._textHintLayer) { 663 | this._textHintLayer = this._createTextHintLayer(); 664 | this.addChild(this._textHintLayer); 665 | } 666 | 667 | this._textHintLayer.setTextHint(textHint); 668 | }, 669 | 670 | _closeTextHint: function() { 671 | if (this._textHintLayer) { 672 | this._textHintLayer.setVisible(false); 673 | } 674 | }, 675 | 676 | /** 677 | * 创建文字提示layer 678 | * @private 679 | */ 680 | _createTextHintLayer: function() { 681 | return new sz.TextHintLayer(); 682 | }, 683 | 684 | destory: function() { 685 | if (this._widgetEvent) { 686 | sz.uiloader._onWidgetEvent = this._widgetEvent; 687 | } 688 | this._guideTaskHandle = null; 689 | this.removeFromParent(); 690 | cc.log("----guide over----"); 691 | } 692 | }); 693 | -------------------------------------------------------------------------------- /src/lib/UILoader.js: -------------------------------------------------------------------------------- 1 | var sz = sz || {}; 2 | 3 | sz.UILoader = cc.Class.extend({ 4 | _eventPrefix: null, 5 | _memberPrefix: null, 6 | /** 7 | * 加载UI文件 8 | * @param target将 jsonFile加载出的节点绑定到的目标 9 | * @param jsonFile cocostudio UI编辑器生成的json文件 10 | */ 11 | widgetFromJsonFile: function(target, jsonFile, options) { 12 | cc.assert(target && jsonFile); 13 | if (!options) { 14 | options = {}; 15 | } 16 | 17 | this._eventPrefix = options.eventPrefix || sz.UILoader.DEFAULT_EVENT_PREFIX; 18 | this._memberPrefix = options.memberPrefix || sz.UILoader.DEFAULT_MEMBER_PREFIX; 19 | //绑定自身 20 | this._bindMenbers(target, target); 21 | 22 | //绑定jsonFile 23 | if (!jsonFile) { 24 | return; 25 | } 26 | 27 | var json = cc.loader.getRes(jsonFile); 28 | var version = json.version || json.Version; 29 | var rootNode; 30 | if (version[0] == 1) { 31 | rootNode = ccs.uiReader.widgetFromJsonFile(jsonFile); 32 | } else if (version[0] == 2){ 33 | rootNode = ccs.csLoader.createNode(jsonFile); 34 | } 35 | 36 | if (!rootNode) { 37 | cc.log("Load json file failed"); 38 | } 39 | 40 | if (rootNode.setTouchEnabled) { 41 | rootNode.setTouchEnabled(false); 42 | } 43 | 44 | target.rootNode = rootNode; 45 | target.addChild(rootNode); 46 | this._bindMenbers(rootNode, target); 47 | return rootNode; 48 | }, 49 | 50 | /** 51 | * 递归对rootWidget下的子节点进行成员绑定 52 | * @param rootWidget 53 | * @param target 54 | * @private 55 | */ 56 | _bindMenbers: function(rootWidget, target) { 57 | var widgetName, 58 | children = rootWidget.getChildren(); 59 | 60 | var self = this; 61 | children.forEach(function(widget) { 62 | widgetName = widget.getName(); 63 | 64 | //控件名存在,绑定到target上 65 | var prefix = widgetName.substr(0, self._memberPrefix.length); 66 | if (prefix === self._memberPrefix) { 67 | target[widgetName] = widget; 68 | self._registerWidgetEvent(target, widget); 69 | }else if (widget.setTouchEnabled){ 70 | widget.setTouchEnabled(false); 71 | } 72 | 73 | //绑定子控件,可以实现: a._b._c._d 访问子控件 74 | if (!rootWidget[widgetName]) { 75 | rootWidget[widgetName] = widget; 76 | } 77 | 78 | //如果还有子节点,递归进去 79 | if (widget.getChildrenCount()) { 80 | self._bindMenbers(widget, target); 81 | } 82 | 83 | }); 84 | }, 85 | 86 | /** 87 | * 获取控件事件 88 | * @param widget 89 | * @returns {*} 90 | */ 91 | _getWidgetEvent: function(widget) { 92 | var bindWidgetEvent = null; 93 | var events = sz.UILoader.widgetEvents; 94 | for (var i = 0; i < events.length; i++) { 95 | bindWidgetEvent = events[i]; 96 | if (bindWidgetEvent && widget instanceof bindWidgetEvent.widgetType) { 97 | break; 98 | } 99 | } 100 | return bindWidgetEvent; 101 | }, 102 | 103 | /** 104 | * 注册控件事件 105 | * @param target 106 | * @param widget 107 | * @private 108 | */ 109 | _registerWidgetEvent: function(target, widget) { 110 | 111 | //截取前缀,首字母大定 112 | var eventName = this.getWidgetEventName(widget, "Event"); 113 | var isBindEvent = false; 114 | if (target[eventName]) { 115 | isBindEvent = true; 116 | } else { 117 | //取事控件件名 118 | var widgetEvent = this._getWidgetEvent(widget); 119 | if (!widgetEvent) { 120 | sz.uiloader.registerTouchEvent(widget, target); 121 | return; 122 | } 123 | //检查事件函数,生成事件名数组 124 | var eventNameArray = []; 125 | for (var i = 0; i < widgetEvent.events.length; i++) { 126 | eventName = this.getWidgetEventName(widget, widgetEvent.events[i]);//newName + widgetEvent.events[i]; 127 | eventNameArray.push(eventName); 128 | if (typeof target[eventName] === "function") { 129 | isBindEvent = true; 130 | } 131 | } 132 | } 133 | 134 | //事件响应函数 135 | var self = this; 136 | var eventFunc = function(sender, type) { 137 | var callBack; 138 | var funcName; 139 | if (eventNameArray) { 140 | funcName = eventNameArray[type]; 141 | callBack = target[funcName]; 142 | } else { 143 | callBack = target[eventName]; 144 | } 145 | 146 | 147 | //事件勾子函数 148 | if (callBack && self._onWidgetEvent) { 149 | if(self._onWidgetEvent(sender, type) === false){ 150 | return; 151 | } 152 | } 153 | 154 | //开始 155 | if (type === ccui.Widget.TOUCH_BEGAN) { 156 | var time = sz.UILoader.DEFAULT_TOUCH_LONG_TIME; 157 | if (callBack) { 158 | time = callBack.call(target, sender, type); 159 | } 160 | 161 | //检测长按事件 162 | funcName = sz.uiloader.getWidgetEventName(sender, sz.UILoader.TOUCH_LONG_EVENT); 163 | var touchLong = target[funcName]; 164 | 165 | if (touchLong) { 166 | time = time || sz.UILoader.DEFAULT_TOUCH_LONG_TIME; 167 | if (time > 0 && time < 5) { 168 | target.scheduleOnce(touchLong, time); 169 | } 170 | 171 | } 172 | return; 173 | } 174 | 175 | //长按解除 176 | if (type === ccui.Widget.TOUCH_ENDED) { 177 | funcName = sz.uiloader.getWidgetEventName(sender, sz.UILoader.TOUCH_LONG_EVENT); 178 | var scheduleFunc = target[funcName]; 179 | if (scheduleFunc) { 180 | target.unschedule(scheduleFunc); 181 | } 182 | } 183 | 184 | //事件回调 185 | if (callBack) { 186 | callBack.call(target, sender, type); 187 | } 188 | }; 189 | 190 | //注册事件监听 191 | if (isBindEvent) { 192 | widget.setTouchEnabled(true); 193 | if (widget.addEventListener) { 194 | widget.addEventListener(eventFunc, target); 195 | } else { 196 | widget.addTouchEventListener(eventFunc, target); 197 | } 198 | } 199 | }, 200 | 201 | 202 | /** 203 | * 控件事件捕获, 可以由子类重写此函数 204 | * @param sender 205 | * @param type 206 | * @private 207 | */ 208 | //_onWidgetEvent: function(sender, type) { 209 | // 210 | //} 211 | 212 | //_onNodeEvent: function(sender, type) { 213 | // 214 | //} 215 | 216 | /** 217 | * @param widget 218 | * @param event 219 | * @returns {string} 220 | */ 221 | getWidgetEventName: function(widget, event) { 222 | cc.assert(widget); 223 | var name = widget.getName(); 224 | if (name) { 225 | name = name[this._memberPrefix.length].toUpperCase() + name.slice(this._memberPrefix.length + 1); 226 | } 227 | if (event) { 228 | return this._eventPrefix + name + event; 229 | } else { 230 | return this._eventPrefix + name; 231 | } 232 | } 233 | 234 | }); 235 | 236 | //事件前缀 237 | sz.UILoader.DEFAULT_EVENT_PREFIX = "_on"; 238 | //成员前缀 239 | sz.UILoader.DEFAULT_MEMBER_PREFIX = "_"; 240 | //默认长按触发时间 241 | sz.UILoader.DEFAULT_TOUCH_LONG_TIME = 1; 242 | //长按事件名 243 | sz.UILoader.TOUCH_LONG_EVENT = "TouchLong"; 244 | //触摸事件 245 | sz.UILoader.touchEvents = ["TouchBegan", "TouchMoved", "TouchEnded", sz.UILoader.TOUCH_LONG_EVENT]; 246 | //控件事件列表 247 | sz.UILoader.widgetEvents = [ 248 | //Button 249 | {widgetType: ccui.Button, events: sz.UILoader.touchEvents}, 250 | //ImageView 251 | {widgetType: ccui.ImageView, events: sz.UILoader.touchEvents}, 252 | //TextFiled 253 | {widgetType: ccui.TextField, events: ["AttachWithIME", "DetachWithIME", "InsertText", "DeleteBackward"]}, 254 | //CheckBox 255 | {widgetType: ccui.CheckBox, events: ["Selected", "Unselected"]}, 256 | //ListView 257 | {widgetType: ccui.ListView, events:["SelectedItem"]}, 258 | //Panel 259 | {widgetType: ccui.Layout, events: sz.UILoader.touchEvents}, 260 | //BMFont 261 | {widgetType: ccui.TextBMFont, events: sz.UILoader.touchEvents}, 262 | //Text 263 | {widgetType: ccui.Text, events: sz.UILoader.touchEvents}, 264 | //last must null 265 | null 266 | ]; 267 | 268 | sz.uiloader = new sz.UILoader(); 269 | 270 | /** 271 | * cc.node触摸事件注册函数 272 | * @param node 273 | * @param target 274 | * @param touchEvent 275 | * @param swallowTouches 276 | * @returns {*} 277 | */ 278 | sz.uiloader.registerTouchEvent = function(node, target, touchEvent, swallowTouches) { 279 | 280 | if (!node instanceof cc.Node ) { 281 | cc.log('param "node" is not cc.Node type'); 282 | return null; 283 | } 284 | 285 | if (node instanceof ccui.Widget) { 286 | cc.log('param "node" Can not be ccui.Widget type'); 287 | return null; 288 | } 289 | 290 | target = target || node; 291 | 292 | if (swallowTouches === undefined) { 293 | swallowTouches = true; 294 | } 295 | 296 | var touchListener = cc.EventListener.create({ 297 | event: touchEvent || cc.EventListener.TOUCH_ONE_BY_ONE, 298 | swallowTouches: swallowTouches ? true : false 299 | }); 300 | 301 | var nodeEvents = ['onTouchBegan', 'onTouchMoved', 'onTouchEnded']; 302 | nodeEvents.forEach(function(eventName, index) { 303 | 304 | touchListener[eventName] = function() { 305 | var touchNode = arguments[1].getCurrentTarget(); 306 | var event = sz.uiloader.getWidgetEventName(touchNode, sz.UILoader.touchEvents[index]); 307 | if (!touchNode[event]) { 308 | cc.log('UILoader: ' + event + ' is undefined!'); 309 | return false; 310 | } 311 | 312 | if (index === 0) { 313 | var point = arguments[0].getLocation(); 314 | point = touchNode.convertToNodeSpace(point); 315 | var rect = cc.rect(0,0, touchNode.width, touchNode.height); 316 | if (!cc.rectContainsPoint(rect, point)) { 317 | return false; 318 | } 319 | } 320 | 321 | var args = Array.prototype.slice.call(arguments); 322 | args.unshift(touchNode); 323 | var ret = touchNode[event].apply(touchNode, args); 324 | if (sz.uiloader._onNodeEvent) { 325 | sz.uiloader._onNodeEvent(touchNode, args[1], args[2]); 326 | } 327 | 328 | if (index === 0) { 329 | return ret ? true : false; 330 | } 331 | }; 332 | }); 333 | 334 | cc.eventManager.addListener(touchListener, node); 335 | return touchListener; 336 | }; -------------------------------------------------------------------------------- /src/lib/async.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * async 3 | * https://github.com/caolan/async 4 | * 5 | * Copyright 2010-2014 Caolan McMahon 6 | * Released under the MIT license 7 | */ 8 | /*jshint onevar: false, indent:4 */ 9 | /*global setImmediate: false, setTimeout: false, console: false */ 10 | (function () { 11 | 12 | var async = {}; 13 | 14 | // global on the server, window in the browser 15 | var root, previous_async; 16 | 17 | root = this; 18 | if (root != null) { 19 | previous_async = root.async; 20 | } 21 | 22 | async.noConflict = function () { 23 | root.async = previous_async; 24 | return async; 25 | }; 26 | 27 | function only_once(fn) { 28 | var called = false; 29 | return function() { 30 | if (called) throw new Error("Callback was already called."); 31 | called = true; 32 | fn.apply(root, arguments); 33 | } 34 | } 35 | 36 | //// cross-browser compatiblity functions //// 37 | 38 | var _toString = Object.prototype.toString; 39 | 40 | var _isArray = Array.isArray || function (obj) { 41 | return _toString.call(obj) === '[object Array]'; 42 | }; 43 | 44 | var _each = function (arr, iterator) { 45 | if (arr.forEach) { 46 | return arr.forEach(iterator); 47 | } 48 | for (var i = 0; i < arr.length; i += 1) { 49 | iterator(arr[i], i, arr); 50 | } 51 | }; 52 | 53 | var _map = function (arr, iterator) { 54 | if (arr.map) { 55 | return arr.map(iterator); 56 | } 57 | var results = []; 58 | _each(arr, function (x, i, a) { 59 | results.push(iterator(x, i, a)); 60 | }); 61 | return results; 62 | }; 63 | 64 | var _reduce = function (arr, iterator, memo) { 65 | if (arr.reduce) { 66 | return arr.reduce(iterator, memo); 67 | } 68 | _each(arr, function (x, i, a) { 69 | memo = iterator(memo, x, i, a); 70 | }); 71 | return memo; 72 | }; 73 | 74 | var _keys = function (obj) { 75 | if (Object.keys) { 76 | return Object.keys(obj); 77 | } 78 | var keys = []; 79 | for (var k in obj) { 80 | if (obj.hasOwnProperty(k)) { 81 | keys.push(k); 82 | } 83 | } 84 | return keys; 85 | }; 86 | 87 | //// exported async module functions //// 88 | 89 | //// nextTick implementation with browser-compatible fallback //// 90 | if (typeof process === 'undefined' || !(process.nextTick)) { 91 | if (typeof setImmediate === 'function') { 92 | async.nextTick = function (fn) { 93 | // not a direct alias for IE10 compatibility 94 | setImmediate(fn); 95 | }; 96 | async.setImmediate = async.nextTick; 97 | } 98 | else { 99 | async.nextTick = function (fn) { 100 | setTimeout(fn, 0); 101 | }; 102 | async.setImmediate = async.nextTick; 103 | } 104 | } 105 | else { 106 | async.nextTick = process.nextTick; 107 | if (typeof setImmediate !== 'undefined') { 108 | async.setImmediate = function (fn) { 109 | // not a direct alias for IE10 compatibility 110 | setImmediate(fn); 111 | }; 112 | } 113 | else { 114 | async.setImmediate = async.nextTick; 115 | } 116 | } 117 | 118 | async.each = function (arr, iterator, callback) { 119 | callback = callback || function () {}; 120 | if (!arr.length) { 121 | return callback(); 122 | } 123 | var completed = 0; 124 | _each(arr, function (x) { 125 | iterator(x, only_once(done) ); 126 | }); 127 | function done(err) { 128 | if (err) { 129 | callback(err); 130 | callback = function () {}; 131 | } 132 | else { 133 | completed += 1; 134 | if (completed >= arr.length) { 135 | callback(); 136 | } 137 | } 138 | } 139 | }; 140 | async.forEach = async.each; 141 | 142 | async.eachSeries = function (arr, iterator, callback) { 143 | callback = callback || function () {}; 144 | if (!arr.length) { 145 | return callback(); 146 | } 147 | var completed = 0; 148 | var iterate = function () { 149 | iterator(arr[completed], function (err) { 150 | if (err) { 151 | callback(err); 152 | callback = function () {}; 153 | } 154 | else { 155 | completed += 1; 156 | if (completed >= arr.length) { 157 | callback(); 158 | } 159 | else { 160 | iterate(); 161 | } 162 | } 163 | }); 164 | }; 165 | iterate(); 166 | }; 167 | async.forEachSeries = async.eachSeries; 168 | 169 | async.eachLimit = function (arr, limit, iterator, callback) { 170 | var fn = _eachLimit(limit); 171 | fn.apply(null, [arr, iterator, callback]); 172 | }; 173 | async.forEachLimit = async.eachLimit; 174 | 175 | var _eachLimit = function (limit) { 176 | 177 | return function (arr, iterator, callback) { 178 | callback = callback || function () {}; 179 | if (!arr.length || limit <= 0) { 180 | return callback(); 181 | } 182 | var completed = 0; 183 | var started = 0; 184 | var running = 0; 185 | 186 | (function replenish () { 187 | if (completed >= arr.length) { 188 | return callback(); 189 | } 190 | 191 | while (running < limit && started < arr.length) { 192 | started += 1; 193 | running += 1; 194 | iterator(arr[started - 1], function (err) { 195 | if (err) { 196 | callback(err); 197 | callback = function () {}; 198 | } 199 | else { 200 | completed += 1; 201 | running -= 1; 202 | if (completed >= arr.length) { 203 | callback(); 204 | } 205 | else { 206 | replenish(); 207 | } 208 | } 209 | }); 210 | } 211 | })(); 212 | }; 213 | }; 214 | 215 | 216 | var doParallel = function (fn) { 217 | return function () { 218 | var args = Array.prototype.slice.call(arguments); 219 | return fn.apply(null, [async.each].concat(args)); 220 | }; 221 | }; 222 | var doParallelLimit = function(limit, fn) { 223 | return function () { 224 | var args = Array.prototype.slice.call(arguments); 225 | return fn.apply(null, [_eachLimit(limit)].concat(args)); 226 | }; 227 | }; 228 | var doSeries = function (fn) { 229 | return function () { 230 | var args = Array.prototype.slice.call(arguments); 231 | return fn.apply(null, [async.eachSeries].concat(args)); 232 | }; 233 | }; 234 | 235 | 236 | var _asyncMap = function (eachfn, arr, iterator, callback) { 237 | arr = _map(arr, function (x, i) { 238 | return {index: i, value: x}; 239 | }); 240 | if (!callback) { 241 | eachfn(arr, function (x, callback) { 242 | iterator(x.value, function (err) { 243 | callback(err); 244 | }); 245 | }); 246 | } else { 247 | var results = []; 248 | eachfn(arr, function (x, callback) { 249 | iterator(x.value, function (err, v) { 250 | results[x.index] = v; 251 | callback(err); 252 | }); 253 | }, function (err) { 254 | callback(err, results); 255 | }); 256 | } 257 | }; 258 | async.map = doParallel(_asyncMap); 259 | async.mapSeries = doSeries(_asyncMap); 260 | async.mapLimit = function (arr, limit, iterator, callback) { 261 | return _mapLimit(limit)(arr, iterator, callback); 262 | }; 263 | 264 | var _mapLimit = function(limit) { 265 | return doParallelLimit(limit, _asyncMap); 266 | }; 267 | 268 | // reduce only has a series version, as doing reduce in parallel won't 269 | // work in many situations. 270 | async.reduce = function (arr, memo, iterator, callback) { 271 | async.eachSeries(arr, function (x, callback) { 272 | iterator(memo, x, function (err, v) { 273 | memo = v; 274 | callback(err); 275 | }); 276 | }, function (err) { 277 | callback(err, memo); 278 | }); 279 | }; 280 | // inject alias 281 | async.inject = async.reduce; 282 | // foldl alias 283 | async.foldl = async.reduce; 284 | 285 | async.reduceRight = function (arr, memo, iterator, callback) { 286 | var reversed = _map(arr, function (x) { 287 | return x; 288 | }).reverse(); 289 | async.reduce(reversed, memo, iterator, callback); 290 | }; 291 | // foldr alias 292 | async.foldr = async.reduceRight; 293 | 294 | var _filter = function (eachfn, arr, iterator, callback) { 295 | var results = []; 296 | arr = _map(arr, function (x, i) { 297 | return {index: i, value: x}; 298 | }); 299 | eachfn(arr, function (x, callback) { 300 | iterator(x.value, function (v) { 301 | if (v) { 302 | results.push(x); 303 | } 304 | callback(); 305 | }); 306 | }, function (err) { 307 | callback(_map(results.sort(function (a, b) { 308 | return a.index - b.index; 309 | }), function (x) { 310 | return x.value; 311 | })); 312 | }); 313 | }; 314 | async.filter = doParallel(_filter); 315 | async.filterSeries = doSeries(_filter); 316 | // select alias 317 | async.select = async.filter; 318 | async.selectSeries = async.filterSeries; 319 | 320 | var _reject = function (eachfn, arr, iterator, callback) { 321 | var results = []; 322 | arr = _map(arr, function (x, i) { 323 | return {index: i, value: x}; 324 | }); 325 | eachfn(arr, function (x, callback) { 326 | iterator(x.value, function (v) { 327 | if (!v) { 328 | results.push(x); 329 | } 330 | callback(); 331 | }); 332 | }, function (err) { 333 | callback(_map(results.sort(function (a, b) { 334 | return a.index - b.index; 335 | }), function (x) { 336 | return x.value; 337 | })); 338 | }); 339 | }; 340 | async.reject = doParallel(_reject); 341 | async.rejectSeries = doSeries(_reject); 342 | 343 | var _detect = function (eachfn, arr, iterator, main_callback) { 344 | eachfn(arr, function (x, callback) { 345 | iterator(x, function (result) { 346 | if (result) { 347 | main_callback(x); 348 | main_callback = function () {}; 349 | } 350 | else { 351 | callback(); 352 | } 353 | }); 354 | }, function (err) { 355 | main_callback(); 356 | }); 357 | }; 358 | async.detect = doParallel(_detect); 359 | async.detectSeries = doSeries(_detect); 360 | 361 | async.some = function (arr, iterator, main_callback) { 362 | async.each(arr, function (x, callback) { 363 | iterator(x, function (v) { 364 | if (v) { 365 | main_callback(true); 366 | main_callback = function () {}; 367 | } 368 | callback(); 369 | }); 370 | }, function (err) { 371 | main_callback(false); 372 | }); 373 | }; 374 | // any alias 375 | async.any = async.some; 376 | 377 | async.every = function (arr, iterator, main_callback) { 378 | async.each(arr, function (x, callback) { 379 | iterator(x, function (v) { 380 | if (!v) { 381 | main_callback(false); 382 | main_callback = function () {}; 383 | } 384 | callback(); 385 | }); 386 | }, function (err) { 387 | main_callback(true); 388 | }); 389 | }; 390 | // all alias 391 | async.all = async.every; 392 | 393 | async.sortBy = function (arr, iterator, callback) { 394 | async.map(arr, function (x, callback) { 395 | iterator(x, function (err, criteria) { 396 | if (err) { 397 | callback(err); 398 | } 399 | else { 400 | callback(null, {value: x, criteria: criteria}); 401 | } 402 | }); 403 | }, function (err, results) { 404 | if (err) { 405 | return callback(err); 406 | } 407 | else { 408 | var fn = function (left, right) { 409 | var a = left.criteria, b = right.criteria; 410 | return a < b ? -1 : a > b ? 1 : 0; 411 | }; 412 | callback(null, _map(results.sort(fn), function (x) { 413 | return x.value; 414 | })); 415 | } 416 | }); 417 | }; 418 | 419 | async.auto = function (tasks, callback) { 420 | callback = callback || function () {}; 421 | var keys = _keys(tasks); 422 | var remainingTasks = keys.length 423 | if (!remainingTasks) { 424 | return callback(); 425 | } 426 | 427 | var results = {}; 428 | 429 | var listeners = []; 430 | var addListener = function (fn) { 431 | listeners.unshift(fn); 432 | }; 433 | var removeListener = function (fn) { 434 | for (var i = 0; i < listeners.length; i += 1) { 435 | if (listeners[i] === fn) { 436 | listeners.splice(i, 1); 437 | return; 438 | } 439 | } 440 | }; 441 | var taskComplete = function () { 442 | remainingTasks-- 443 | _each(listeners.slice(0), function (fn) { 444 | fn(); 445 | }); 446 | }; 447 | 448 | addListener(function () { 449 | if (!remainingTasks) { 450 | var theCallback = callback; 451 | // prevent final callback from calling itself if it errors 452 | callback = function () {}; 453 | 454 | theCallback(null, results); 455 | } 456 | }); 457 | 458 | _each(keys, function (k) { 459 | var task = _isArray(tasks[k]) ? tasks[k]: [tasks[k]]; 460 | var taskCallback = function (err) { 461 | var args = Array.prototype.slice.call(arguments, 1); 462 | if (args.length <= 1) { 463 | args = args[0]; 464 | } 465 | if (err) { 466 | var safeResults = {}; 467 | _each(_keys(results), function(rkey) { 468 | safeResults[rkey] = results[rkey]; 469 | }); 470 | safeResults[k] = args; 471 | callback(err, safeResults); 472 | // stop subsequent errors hitting callback multiple times 473 | callback = function () {}; 474 | } 475 | else { 476 | results[k] = args; 477 | async.setImmediate(taskComplete); 478 | } 479 | }; 480 | var requires = task.slice(0, Math.abs(task.length - 1)) || []; 481 | var ready = function () { 482 | return _reduce(requires, function (a, x) { 483 | return (a && results.hasOwnProperty(x)); 484 | }, true) && !results.hasOwnProperty(k); 485 | }; 486 | if (ready()) { 487 | task[task.length - 1](taskCallback, results); 488 | } 489 | else { 490 | var listener = function () { 491 | if (ready()) { 492 | removeListener(listener); 493 | task[task.length - 1](taskCallback, results); 494 | } 495 | }; 496 | addListener(listener); 497 | } 498 | }); 499 | }; 500 | 501 | async.retry = function(times, task, callback) { 502 | var DEFAULT_TIMES = 5; 503 | var attempts = []; 504 | // Use defaults if times not passed 505 | if (typeof times === 'function') { 506 | callback = task; 507 | task = times; 508 | times = DEFAULT_TIMES; 509 | } 510 | // Make sure times is a number 511 | times = parseInt(times, 10) || DEFAULT_TIMES; 512 | var wrappedTask = function(wrappedCallback, wrappedResults) { 513 | var retryAttempt = function(task, finalAttempt) { 514 | return function(seriesCallback) { 515 | task(function(err, result){ 516 | seriesCallback(!err || finalAttempt, {err: err, result: result}); 517 | }, wrappedResults); 518 | }; 519 | }; 520 | while (times) { 521 | attempts.push(retryAttempt(task, !(times-=1))); 522 | } 523 | async.series(attempts, function(done, data){ 524 | data = data[data.length - 1]; 525 | (wrappedCallback || callback)(data.err, data.result); 526 | }); 527 | } 528 | // If a callback is passed, run this as a controll flow 529 | return callback ? wrappedTask() : wrappedTask 530 | }; 531 | 532 | async.waterfall = function (tasks, callback) { 533 | callback = callback || function () {}; 534 | if (!_isArray(tasks)) { 535 | var err = new Error('First argument to waterfall must be an array of functions'); 536 | return callback(err); 537 | } 538 | if (!tasks.length) { 539 | return callback(); 540 | } 541 | var wrapIterator = function (iterator) { 542 | return function (err) { 543 | if (err) { 544 | callback.apply(null, arguments); 545 | callback = function () {}; 546 | } 547 | else { 548 | var args = Array.prototype.slice.call(arguments, 1); 549 | var next = iterator.next(); 550 | if (next) { 551 | args.push(wrapIterator(next)); 552 | } 553 | else { 554 | args.push(callback); 555 | } 556 | async.setImmediate(function () { 557 | iterator.apply(null, args); 558 | }); 559 | } 560 | }; 561 | }; 562 | wrapIterator(async.iterator(tasks))(); 563 | }; 564 | 565 | var _parallel = function(eachfn, tasks, callback) { 566 | callback = callback || function () {}; 567 | if (_isArray(tasks)) { 568 | eachfn.map(tasks, function (fn, callback) { 569 | if (fn) { 570 | fn(function (err) { 571 | var args = Array.prototype.slice.call(arguments, 1); 572 | if (args.length <= 1) { 573 | args = args[0]; 574 | } 575 | callback.call(null, err, args); 576 | }); 577 | } 578 | }, callback); 579 | } 580 | else { 581 | var results = {}; 582 | eachfn.each(_keys(tasks), function (k, callback) { 583 | tasks[k](function (err) { 584 | var args = Array.prototype.slice.call(arguments, 1); 585 | if (args.length <= 1) { 586 | args = args[0]; 587 | } 588 | results[k] = args; 589 | callback(err); 590 | }); 591 | }, function (err) { 592 | callback(err, results); 593 | }); 594 | } 595 | }; 596 | 597 | async.parallel = function (tasks, callback) { 598 | _parallel({ map: async.map, each: async.each }, tasks, callback); 599 | }; 600 | 601 | async.parallelLimit = function(tasks, limit, callback) { 602 | _parallel({ map: _mapLimit(limit), each: _eachLimit(limit) }, tasks, callback); 603 | }; 604 | 605 | async.series = function (tasks, callback) { 606 | callback = callback || function () {}; 607 | if (_isArray(tasks)) { 608 | async.mapSeries(tasks, function (fn, callback) { 609 | if (fn) { 610 | fn(function (err) { 611 | var args = Array.prototype.slice.call(arguments, 1); 612 | if (args.length <= 1) { 613 | args = args[0]; 614 | } 615 | callback.call(null, err, args); 616 | }); 617 | } 618 | }, callback); 619 | } 620 | else { 621 | var results = {}; 622 | async.eachSeries(_keys(tasks), function (k, callback) { 623 | tasks[k](function (err) { 624 | var args = Array.prototype.slice.call(arguments, 1); 625 | if (args.length <= 1) { 626 | args = args[0]; 627 | } 628 | results[k] = args; 629 | callback(err); 630 | }); 631 | }, function (err) { 632 | callback(err, results); 633 | }); 634 | } 635 | }; 636 | 637 | async.iterator = function (tasks) { 638 | var makeCallback = function (index) { 639 | var fn = function () { 640 | if (tasks.length) { 641 | tasks[index].apply(null, arguments); 642 | } 643 | return fn.next(); 644 | }; 645 | fn.next = function () { 646 | return (index < tasks.length - 1) ? makeCallback(index + 1): null; 647 | }; 648 | return fn; 649 | }; 650 | return makeCallback(0); 651 | }; 652 | 653 | async.apply = function (fn) { 654 | var args = Array.prototype.slice.call(arguments, 1); 655 | return function () { 656 | return fn.apply( 657 | null, args.concat(Array.prototype.slice.call(arguments)) 658 | ); 659 | }; 660 | }; 661 | 662 | var _concat = function (eachfn, arr, fn, callback) { 663 | var r = []; 664 | eachfn(arr, function (x, cb) { 665 | fn(x, function (err, y) { 666 | r = r.concat(y || []); 667 | cb(err); 668 | }); 669 | }, function (err) { 670 | callback(err, r); 671 | }); 672 | }; 673 | async.concat = doParallel(_concat); 674 | async.concatSeries = doSeries(_concat); 675 | 676 | async.whilst = function (test, iterator, callback) { 677 | if (test()) { 678 | iterator(function (err) { 679 | if (err) { 680 | return callback(err); 681 | } 682 | async.whilst(test, iterator, callback); 683 | }); 684 | } 685 | else { 686 | callback(); 687 | } 688 | }; 689 | 690 | async.doWhilst = function (iterator, test, callback) { 691 | iterator(function (err) { 692 | if (err) { 693 | return callback(err); 694 | } 695 | var args = Array.prototype.slice.call(arguments, 1); 696 | if (test.apply(null, args)) { 697 | async.doWhilst(iterator, test, callback); 698 | } 699 | else { 700 | callback(); 701 | } 702 | }); 703 | }; 704 | 705 | async.until = function (test, iterator, callback) { 706 | if (!test()) { 707 | iterator(function (err) { 708 | if (err) { 709 | return callback(err); 710 | } 711 | async.until(test, iterator, callback); 712 | }); 713 | } 714 | else { 715 | callback(); 716 | } 717 | }; 718 | 719 | async.doUntil = function (iterator, test, callback) { 720 | iterator(function (err) { 721 | if (err) { 722 | return callback(err); 723 | } 724 | var args = Array.prototype.slice.call(arguments, 1); 725 | if (!test.apply(null, args)) { 726 | async.doUntil(iterator, test, callback); 727 | } 728 | else { 729 | callback(); 730 | } 731 | }); 732 | }; 733 | 734 | async.queue = function (worker, concurrency) { 735 | if (concurrency === undefined) { 736 | concurrency = 1; 737 | } 738 | function _insert(q, data, pos, callback) { 739 | if (!q.started){ 740 | q.started = true; 741 | } 742 | if (!_isArray(data)) { 743 | data = [data]; 744 | } 745 | if(data.length == 0) { 746 | // call drain immediately if there are no tasks 747 | return async.setImmediate(function() { 748 | if (q.drain) { 749 | q.drain(); 750 | } 751 | }); 752 | } 753 | _each(data, function(task) { 754 | var item = { 755 | data: task, 756 | callback: typeof callback === 'function' ? callback : null 757 | }; 758 | 759 | if (pos) { 760 | q.tasks.unshift(item); 761 | } else { 762 | q.tasks.push(item); 763 | } 764 | 765 | if (q.saturated && q.tasks.length === q.concurrency) { 766 | q.saturated(); 767 | } 768 | async.setImmediate(q.process); 769 | }); 770 | } 771 | 772 | var workers = 0; 773 | var q = { 774 | tasks: [], 775 | concurrency: concurrency, 776 | saturated: null, 777 | empty: null, 778 | drain: null, 779 | started: false, 780 | paused: false, 781 | push: function (data, callback) { 782 | _insert(q, data, false, callback); 783 | }, 784 | kill: function () { 785 | q.drain = null; 786 | q.tasks = []; 787 | }, 788 | unshift: function (data, callback) { 789 | _insert(q, data, true, callback); 790 | }, 791 | process: function () { 792 | if (!q.paused && workers < q.concurrency && q.tasks.length) { 793 | var task = q.tasks.shift(); 794 | if (q.empty && q.tasks.length === 0) { 795 | q.empty(); 796 | } 797 | workers += 1; 798 | var next = function () { 799 | workers -= 1; 800 | if (task.callback) { 801 | task.callback.apply(task, arguments); 802 | } 803 | if (q.drain && q.tasks.length + workers === 0) { 804 | q.drain(); 805 | } 806 | q.process(); 807 | }; 808 | var cb = only_once(next); 809 | worker(task.data, cb); 810 | } 811 | }, 812 | length: function () { 813 | return q.tasks.length; 814 | }, 815 | running: function () { 816 | return workers; 817 | }, 818 | idle: function() { 819 | return q.tasks.length + workers === 0; 820 | }, 821 | pause: function () { 822 | if (q.paused === true) { return; } 823 | q.paused = true; 824 | q.process(); 825 | }, 826 | resume: function () { 827 | if (q.paused === false) { return; } 828 | q.paused = false; 829 | q.process(); 830 | } 831 | }; 832 | return q; 833 | }; 834 | 835 | async.cargo = function (worker, payload) { 836 | var working = false, 837 | tasks = []; 838 | 839 | var cargo = { 840 | tasks: tasks, 841 | payload: payload, 842 | saturated: null, 843 | empty: null, 844 | drain: null, 845 | drained: true, 846 | push: function (data, callback) { 847 | if (!_isArray(data)) { 848 | data = [data]; 849 | } 850 | _each(data, function(task) { 851 | tasks.push({ 852 | data: task, 853 | callback: typeof callback === 'function' ? callback : null 854 | }); 855 | cargo.drained = false; 856 | if (cargo.saturated && tasks.length === payload) { 857 | cargo.saturated(); 858 | } 859 | }); 860 | async.setImmediate(cargo.process); 861 | }, 862 | process: function process() { 863 | if (working) return; 864 | if (tasks.length === 0) { 865 | if(cargo.drain && !cargo.drained) cargo.drain(); 866 | cargo.drained = true; 867 | return; 868 | } 869 | 870 | var ts = typeof payload === 'number' 871 | ? tasks.splice(0, payload) 872 | : tasks.splice(0, tasks.length); 873 | 874 | var ds = _map(ts, function (task) { 875 | return task.data; 876 | }); 877 | 878 | if(cargo.empty) cargo.empty(); 879 | working = true; 880 | worker(ds, function () { 881 | working = false; 882 | 883 | var args = arguments; 884 | _each(ts, function (data) { 885 | if (data.callback) { 886 | data.callback.apply(null, args); 887 | } 888 | }); 889 | 890 | process(); 891 | }); 892 | }, 893 | length: function () { 894 | return tasks.length; 895 | }, 896 | running: function () { 897 | return working; 898 | } 899 | }; 900 | return cargo; 901 | }; 902 | 903 | var _console_fn = function (name) { 904 | return function (fn) { 905 | var args = Array.prototype.slice.call(arguments, 1); 906 | fn.apply(null, args.concat([function (err) { 907 | var args = Array.prototype.slice.call(arguments, 1); 908 | if (typeof console !== 'undefined') { 909 | if (err) { 910 | if (console.error) { 911 | console.error(err); 912 | } 913 | } 914 | else if (console[name]) { 915 | _each(args, function (x) { 916 | console[name](x); 917 | }); 918 | } 919 | } 920 | }])); 921 | }; 922 | }; 923 | async.log = _console_fn('log'); 924 | async.dir = _console_fn('dir'); 925 | /*async.info = _console_fn('info'); 926 | async.warn = _console_fn('warn'); 927 | async.error = _console_fn('error');*/ 928 | 929 | async.memoize = function (fn, hasher) { 930 | var memo = {}; 931 | var queues = {}; 932 | hasher = hasher || function (x) { 933 | return x; 934 | }; 935 | var memoized = function () { 936 | var args = Array.prototype.slice.call(arguments); 937 | var callback = args.pop(); 938 | var key = hasher.apply(null, args); 939 | if (key in memo) { 940 | async.nextTick(function () { 941 | callback.apply(null, memo[key]); 942 | }); 943 | } 944 | else if (key in queues) { 945 | queues[key].push(callback); 946 | } 947 | else { 948 | queues[key] = [callback]; 949 | fn.apply(null, args.concat([function () { 950 | memo[key] = arguments; 951 | var q = queues[key]; 952 | delete queues[key]; 953 | for (var i = 0, l = q.length; i < l; i++) { 954 | q[i].apply(null, arguments); 955 | } 956 | }])); 957 | } 958 | }; 959 | memoized.memo = memo; 960 | memoized.unmemoized = fn; 961 | return memoized; 962 | }; 963 | 964 | async.unmemoize = function (fn) { 965 | return function () { 966 | return (fn.unmemoized || fn).apply(null, arguments); 967 | }; 968 | }; 969 | 970 | async.times = function (count, iterator, callback) { 971 | var counter = []; 972 | for (var i = 0; i < count; i++) { 973 | counter.push(i); 974 | } 975 | return async.map(counter, iterator, callback); 976 | }; 977 | 978 | async.timesSeries = function (count, iterator, callback) { 979 | var counter = []; 980 | for (var i = 0; i < count; i++) { 981 | counter.push(i); 982 | } 983 | return async.mapSeries(counter, iterator, callback); 984 | }; 985 | 986 | async.seq = function (/* functions... */) { 987 | var fns = arguments; 988 | return function () { 989 | var that = this; 990 | var args = Array.prototype.slice.call(arguments); 991 | var callback = args.pop(); 992 | async.reduce(fns, args, function (newargs, fn, cb) { 993 | fn.apply(that, newargs.concat([function () { 994 | var err = arguments[0]; 995 | var nextargs = Array.prototype.slice.call(arguments, 1); 996 | cb(err, nextargs); 997 | }])) 998 | }, 999 | function (err, results) { 1000 | callback.apply(that, [err].concat(results)); 1001 | }); 1002 | }; 1003 | }; 1004 | 1005 | async.compose = function (/* functions... */) { 1006 | return async.seq.apply(null, Array.prototype.reverse.call(arguments)); 1007 | }; 1008 | 1009 | var _applyEach = function (eachfn, fns /*args...*/) { 1010 | var go = function () { 1011 | var that = this; 1012 | var args = Array.prototype.slice.call(arguments); 1013 | var callback = args.pop(); 1014 | return eachfn(fns, function (fn, cb) { 1015 | fn.apply(that, args.concat([cb])); 1016 | }, 1017 | callback); 1018 | }; 1019 | if (arguments.length > 2) { 1020 | var args = Array.prototype.slice.call(arguments, 2); 1021 | return go.apply(this, args); 1022 | } 1023 | else { 1024 | return go; 1025 | } 1026 | }; 1027 | async.applyEach = doParallel(_applyEach); 1028 | async.applyEachSeries = doSeries(_applyEach); 1029 | 1030 | async.forever = function (fn, callback) { 1031 | function next(err) { 1032 | if (err) { 1033 | if (callback) { 1034 | return callback(err); 1035 | } 1036 | throw err; 1037 | } 1038 | fn(next); 1039 | } 1040 | next(); 1041 | }; 1042 | 1043 | // Node.js 1044 | if (typeof module !== 'undefined' && module.exports) { 1045 | module.exports = async; 1046 | } 1047 | // AMD / RequireJS 1048 | else if (typeof define !== 'undefined' && define.amd) { 1049 | define([], function () { 1050 | return async; 1051 | }); 1052 | } 1053 | // included directly via