├── .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