@leejungkiin/awkit 1.5.4 → 1.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/awk.js +188 -8
- package/core/GEMINI.md +22 -14
- package/core/work-modes.json +45 -0
- package/package.json +1 -1
- package/skill-packs/cocos2d/pack.json +8 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/LICENSE.txt +8 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/SKILL.md +168 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/action.md +278 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/animation.md +220 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/event.md +133 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/input.md +291 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/label.md +184 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/node-scene.md +212 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/scene.md +228 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/sprite.md +206 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/texture.md +186 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/getting-started/about-engine.md +53 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/getting-started/installation.md +203 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/getting-started/quick-start.md +134 -0
- package/skill-packs/electron/pack.json +9 -0
- package/skill-packs/electron/skills/electron/LICENSE.txt +202 -0
- package/skill-packs/electron/skills/electron/SKILL.md +160 -0
- package/skill-packs/electron/skills/electron/api/app.md +83 -0
- package/skill-packs/electron/skills/electron/api/browser-window.md +84 -0
- package/skill-packs/electron/skills/electron/examples/advanced/packaging.md +140 -0
- package/skill-packs/electron/skills/electron/examples/api/browser-window.md +182 -0
- package/skill-packs/electron/skills/electron/examples/api/menu.md +187 -0
- package/skill-packs/electron/skills/electron/examples/getting-started/installation.md +88 -0
- package/skill-packs/electron/skills/electron/examples/getting-started/quick-start.md +104 -0
- package/skill-packs/electron/skills/electron/examples/processes/ipc-communication.md +140 -0
- package/skill-packs/electron/skills/electron/examples/processes/main-process.md +121 -0
- package/skill-packs/electron/skills/electron/templates/main-process.md +105 -0
- package/skill-packs/electron/skills/electron/templates/preload-script.md +84 -0
- package/skill-packs/electron/skills/electron-egg/LICENSE.txt +202 -0
- package/skill-packs/electron/skills/electron-egg/SKILL.md +154 -0
- package/skill-packs/electron/skills/electron-egg/api/config-api.md +62 -0
- package/skill-packs/electron/skills/electron-egg/api/ipc-api.md +55 -0
- package/skill-packs/electron/skills/electron-egg/api/main-api.md +54 -0
- package/skill-packs/electron/skills/electron-egg/api/renderer-api.md +62 -0
- package/skill-packs/electron/skills/electron-egg/api/window-api.md +64 -0
- package/skill-packs/electron/skills/electron-egg/examples/features/ipc-communication.md +84 -0
- package/skill-packs/electron/skills/electron-egg/examples/features/main-process.md +89 -0
- package/skill-packs/electron/skills/electron-egg/examples/features/renderer-process.md +74 -0
- package/skill-packs/electron/skills/electron-egg/examples/guide/build.md +77 -0
- package/skill-packs/electron/skills/electron-egg/examples/guide/configuration.md +88 -0
- package/skill-packs/electron/skills/electron-egg/examples/guide/installation.md +66 -0
- package/skill-packs/electron/skills/electron-egg/examples/guide/intro.md +47 -0
- package/skill-packs/electron/skills/electron-egg/examples/guide/project-structure.md +73 -0
- package/skill-packs/electron/skills/electron-egg/examples/guide/quick-start.md +78 -0
- package/skill-packs/electron/skills/electron-egg/templates/configuration.md +63 -0
- package/skill-packs/electron/skills/electron-egg/templates/installation.md +42 -0
- package/skill-packs/electron/skills/electron-egg/templates/project-setup.md +75 -0
- package/skill-packs/flutter/pack.json +9 -0
- package/skill-packs/flutter/skills/flutter/LICENSE.txt +202 -0
- package/skill-packs/flutter/skills/flutter/SKILL.md +127 -0
- package/skill-packs/flutter/skills/flutter-project-creater/LICENSE.txt +202 -0
- package/skill-packs/flutter/skills/flutter-project-creater/SKILL.md +106 -0
- package/skill-packs/threejs/pack.json +25 -0
- package/skill-packs/threejs/skills/README.md +95 -0
- package/skill-packs/threejs/skills/threejs-animation/SKILL.md +86 -0
- package/skill-packs/threejs/skills/threejs-animation/examples/workflow-mixer-action.md +20 -0
- package/skill-packs/threejs/skills/threejs-animation/references/official-sections.md +19 -0
- package/skill-packs/threejs/skills/threejs-audio/SKILL.md +112 -0
- package/skill-packs/threejs/skills/threejs-audio/examples/workflow-positional-audio.md +15 -0
- package/skill-packs/threejs/skills/threejs-audio/references/official-sections.md +16 -0
- package/skill-packs/threejs/skills/threejs-camera/SKILL.md +96 -0
- package/skill-packs/threejs/skills/threejs-camera/examples/workflow-perspective-resize.md +13 -0
- package/skill-packs/threejs/skills/threejs-controls/SKILL.md +101 -0
- package/skill-packs/threejs/skills/threejs-controls/examples/workflow-orbit-damping.md +15 -0
- package/skill-packs/threejs/skills/threejs-dev-setup/SKILL.md +102 -0
- package/skill-packs/threejs/skills/threejs-dev-setup/examples/workflow-scaffold.md +24 -0
- package/skill-packs/threejs/skills/threejs-geometries/SKILL.md +108 -0
- package/skill-packs/threejs/skills/threejs-geometries/examples/workflow-extrude-shape.md +13 -0
- package/skill-packs/threejs/skills/threejs-helpers/SKILL.md +103 -0
- package/skill-packs/threejs/skills/threejs-helpers/examples/workflow-light-camera-helpers.md +13 -0
- package/skill-packs/threejs/skills/threejs-lights/SKILL.md +103 -0
- package/skill-packs/threejs/skills/threejs-lights/examples/workflow-directional-shadow.md +17 -0
- package/skill-packs/threejs/skills/threejs-loaders/SKILL.md +89 -0
- package/skill-packs/threejs/skills/threejs-loaders/examples/workflow-gltf-draco.md +22 -0
- package/skill-packs/threejs/skills/threejs-loaders/references/official-sections.md +27 -0
- package/skill-packs/threejs/skills/threejs-materials/SKILL.md +102 -0
- package/skill-packs/threejs/skills/threejs-materials/examples/workflow-pbr-transparent.md +15 -0
- package/skill-packs/threejs/skills/threejs-math/SKILL.md +102 -0
- package/skill-packs/threejs/skills/threejs-math/examples/workflow-ray-aabb.md +11 -0
- package/skill-packs/threejs/skills/threejs-node-tsl/SKILL.md +83 -0
- package/skill-packs/threejs/skills/threejs-node-tsl/examples/workflow-tsl-entry.md +13 -0
- package/skill-packs/threejs/skills/threejs-node-tsl/references/official-links.md +8 -0
- package/skill-packs/threejs/skills/threejs-node-tsl/references/tsl-vs-classic.md +23 -0
- package/skill-packs/threejs/skills/threejs-objects/SKILL.md +111 -0
- package/skill-packs/threejs/skills/threejs-objects/examples/workflow-raycaster-pick.md +17 -0
- package/skill-packs/threejs/skills/threejs-postprocessing/SKILL.md +116 -0
- package/skill-packs/threejs/skills/threejs-postprocessing/examples/workflow-composer-bloom.md +15 -0
- package/skill-packs/threejs/skills/threejs-renderers/SKILL.md +91 -0
- package/skill-packs/threejs/skills/threejs-renderers/examples/workflow-renderer-resize.md +21 -0
- package/skill-packs/threejs/skills/threejs-renderers/references/official-sections.md +14 -0
- package/skill-packs/threejs/skills/threejs-scenes/SKILL.md +90 -0
- package/skill-packs/threejs/skills/threejs-scenes/examples/workflow-fog-background.md +13 -0
- package/skill-packs/threejs/skills/threejs-textures/SKILL.md +83 -0
- package/skill-packs/threejs/skills/threejs-textures/examples/workflow-pmrem-env.md +19 -0
- package/skill-packs/threejs/skills/threejs-webxr/SKILL.md +104 -0
- package/skill-packs/threejs/skills/threejs-webxr/examples/workflow-xr-button.md +15 -0
- package/skills/codex-conductor/SKILL.md +4 -4
- package/skills/gemini-conductor/SKILL.md +3 -2
- package/skills/telegram-notify/SKILL.md +1 -0
- package/skills/trello-sync/SKILL.md +7 -0
- package/templates/project-identity/android.json +26 -1
- package/templates/project-identity/backend-nestjs.json +26 -1
- package/templates/project-identity/expo.json +26 -1
- package/templates/project-identity/ios.json +26 -1
- package/templates/project-identity/web-nextjs.json +26 -1
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
# Action(动作)系统使用指南
|
|
2
|
+
|
|
3
|
+
## 官方文档
|
|
4
|
+
|
|
5
|
+
参考官方文档:https://docs.cocos.com/cocos2d-x/v4/manual/zh/
|
|
6
|
+
|
|
7
|
+
## 概述
|
|
8
|
+
|
|
9
|
+
Action 系统用于对节点执行各种变换操作,如移动、旋转、缩放等。
|
|
10
|
+
|
|
11
|
+
## 基本动作
|
|
12
|
+
|
|
13
|
+
### 移动动作
|
|
14
|
+
|
|
15
|
+
```cpp
|
|
16
|
+
auto sprite = Sprite::create("player.png");
|
|
17
|
+
this->addChild(sprite);
|
|
18
|
+
|
|
19
|
+
// 移动到指定位置
|
|
20
|
+
auto moveTo = MoveTo::create(2.0f, Vec2(400, 300));
|
|
21
|
+
sprite->runAction(moveTo);
|
|
22
|
+
|
|
23
|
+
// 相对移动
|
|
24
|
+
auto moveBy = MoveBy::create(1.0f, Vec2(100, 50));
|
|
25
|
+
sprite->runAction(moveBy);
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### 旋转动作
|
|
29
|
+
|
|
30
|
+
```cpp
|
|
31
|
+
// 旋转到指定角度
|
|
32
|
+
auto rotateTo = RotateTo::create(2.0f, 90.0f);
|
|
33
|
+
sprite->runAction(rotateTo);
|
|
34
|
+
|
|
35
|
+
// 相对旋转
|
|
36
|
+
auto rotateBy = RotateBy::create(1.0f, 180.0f);
|
|
37
|
+
sprite->runAction(rotateBy);
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 缩放动作
|
|
41
|
+
|
|
42
|
+
```cpp
|
|
43
|
+
// 缩放到指定大小
|
|
44
|
+
auto scaleTo = ScaleTo::create(1.0f, 2.0f);
|
|
45
|
+
sprite->runAction(scaleTo);
|
|
46
|
+
|
|
47
|
+
// 相对缩放
|
|
48
|
+
auto scaleBy = ScaleBy::create(1.0f, 1.5f);
|
|
49
|
+
sprite->runAction(scaleBy);
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 淡入淡出
|
|
53
|
+
|
|
54
|
+
```cpp
|
|
55
|
+
// 淡入
|
|
56
|
+
auto fadeIn = FadeIn::create(1.0f);
|
|
57
|
+
sprite->runAction(fadeIn);
|
|
58
|
+
|
|
59
|
+
// 淡出
|
|
60
|
+
auto fadeOut = FadeOut::create(1.0f);
|
|
61
|
+
sprite->runAction(fadeOut);
|
|
62
|
+
|
|
63
|
+
// 淡入到指定透明度
|
|
64
|
+
auto fadeTo = FadeTo::create(1.0f, 128);
|
|
65
|
+
sprite->runAction(fadeTo);
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 跳跃动作
|
|
69
|
+
|
|
70
|
+
```cpp
|
|
71
|
+
// 跳跃到指定位置
|
|
72
|
+
auto jumpTo = JumpTo::create(2.0f, Vec2(400, 300), 100, 3);
|
|
73
|
+
sprite->runAction(jumpTo);
|
|
74
|
+
|
|
75
|
+
// 相对跳跃
|
|
76
|
+
auto jumpBy = JumpBy::create(1.0f, Vec2(100, 0), 50, 2);
|
|
77
|
+
sprite->runAction(jumpBy);
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## 组合动作
|
|
81
|
+
|
|
82
|
+
### 序列动作(Sequence)
|
|
83
|
+
|
|
84
|
+
```cpp
|
|
85
|
+
// 按顺序执行多个动作
|
|
86
|
+
auto move1 = MoveBy::create(1.0f, Vec2(100, 0));
|
|
87
|
+
auto move2 = MoveBy::create(1.0f, Vec2(0, 100));
|
|
88
|
+
auto move3 = MoveBy::create(1.0f, Vec2(-100, 0));
|
|
89
|
+
|
|
90
|
+
auto sequence = Sequence::create(move1, move2, move3, nullptr);
|
|
91
|
+
sprite->runAction(sequence);
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### 同时执行(Spawn)
|
|
95
|
+
|
|
96
|
+
```cpp
|
|
97
|
+
// 同时执行多个动作
|
|
98
|
+
auto move = MoveBy::create(2.0f, Vec2(200, 0));
|
|
99
|
+
auto rotate = RotateBy::create(2.0f, 360.0f);
|
|
100
|
+
auto scale = ScaleBy::create(2.0f, 1.5f);
|
|
101
|
+
|
|
102
|
+
auto spawn = Spawn::create(move, rotate, scale, nullptr);
|
|
103
|
+
sprite->runAction(spawn);
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 重复动作
|
|
107
|
+
|
|
108
|
+
```cpp
|
|
109
|
+
// 重复指定次数
|
|
110
|
+
auto move = MoveBy::create(1.0f, Vec2(100, 0));
|
|
111
|
+
auto repeat = Repeat::create(move, 3);
|
|
112
|
+
sprite->runAction(repeat);
|
|
113
|
+
|
|
114
|
+
// 无限重复
|
|
115
|
+
auto repeatForever = RepeatForever::create(move);
|
|
116
|
+
sprite->runAction(repeatForever);
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### 延迟动作
|
|
120
|
+
|
|
121
|
+
```cpp
|
|
122
|
+
// 延迟执行
|
|
123
|
+
auto delay = DelayTime::create(2.0f);
|
|
124
|
+
auto move = MoveBy::create(1.0f, Vec2(100, 0));
|
|
125
|
+
auto sequence = Sequence::create(delay, move, nullptr);
|
|
126
|
+
sprite->runAction(sequence);
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## 缓动函数
|
|
130
|
+
|
|
131
|
+
### 使用 Ease
|
|
132
|
+
|
|
133
|
+
```cpp
|
|
134
|
+
auto move = MoveBy::create(2.0f, Vec2(400, 0));
|
|
135
|
+
|
|
136
|
+
// 缓入
|
|
137
|
+
auto easeIn = EaseIn::create(move, 2.0f);
|
|
138
|
+
sprite->runAction(easeIn);
|
|
139
|
+
|
|
140
|
+
// 缓出
|
|
141
|
+
auto easeOut = EaseOut::create(move, 2.0f);
|
|
142
|
+
sprite->runAction(easeOut);
|
|
143
|
+
|
|
144
|
+
// 缓入缓出
|
|
145
|
+
auto easeInOut = EaseInOut::create(move, 2.0f);
|
|
146
|
+
sprite->runAction(easeInOut);
|
|
147
|
+
|
|
148
|
+
// 弹性效果
|
|
149
|
+
auto elastic = EaseElasticInOut::create(move, 0.5f);
|
|
150
|
+
sprite->runAction(elastic);
|
|
151
|
+
|
|
152
|
+
// 弹跳效果
|
|
153
|
+
auto bounce = EaseBounceInOut::create(move);
|
|
154
|
+
sprite->runAction(bounce);
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## 回调动作
|
|
158
|
+
|
|
159
|
+
```cpp
|
|
160
|
+
// 动作完成后执行回调
|
|
161
|
+
auto move = MoveBy::create(2.0f, Vec2(400, 0));
|
|
162
|
+
auto callback = CallFunc::create([sprite](){
|
|
163
|
+
log("Action completed!");
|
|
164
|
+
sprite->setColor(Color3B::RED);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
auto sequence = Sequence::create(move, callback, nullptr);
|
|
168
|
+
sprite->runAction(sequence);
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## 完整示例
|
|
172
|
+
|
|
173
|
+
```cpp
|
|
174
|
+
class ActionDemo : public Scene
|
|
175
|
+
{
|
|
176
|
+
public:
|
|
177
|
+
static Scene* createScene();
|
|
178
|
+
virtual bool init();
|
|
179
|
+
CREATE_FUNC(ActionDemo);
|
|
180
|
+
|
|
181
|
+
private:
|
|
182
|
+
void createMovingSprite();
|
|
183
|
+
void createRotatingSprite();
|
|
184
|
+
void createScalingSprite();
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
bool ActionDemo::init()
|
|
188
|
+
{
|
|
189
|
+
if (!Scene::init())
|
|
190
|
+
{
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
createMovingSprite();
|
|
195
|
+
createRotatingSprite();
|
|
196
|
+
createScalingSprite();
|
|
197
|
+
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
void ActionDemo::createMovingSprite()
|
|
202
|
+
{
|
|
203
|
+
auto sprite = Sprite::create("player.png");
|
|
204
|
+
sprite->setPosition(Vec2(100, 200));
|
|
205
|
+
this->addChild(sprite);
|
|
206
|
+
|
|
207
|
+
// 创建来回移动的动画
|
|
208
|
+
auto moveRight = MoveBy::create(2.0f, Vec2(400, 0));
|
|
209
|
+
auto moveLeft = MoveBy::create(2.0f, Vec2(-400, 0));
|
|
210
|
+
auto sequence = Sequence::create(moveRight, moveLeft, nullptr);
|
|
211
|
+
auto repeat = RepeatForever::create(sequence);
|
|
212
|
+
|
|
213
|
+
sprite->runAction(repeat);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
void ActionDemo::createRotatingSprite()
|
|
217
|
+
{
|
|
218
|
+
auto sprite = Sprite::create("player.png");
|
|
219
|
+
sprite->setPosition(Vec2(400, 300));
|
|
220
|
+
this->addChild(sprite);
|
|
221
|
+
|
|
222
|
+
// 持续旋转
|
|
223
|
+
auto rotate = RotateBy::create(2.0f, 360.0f);
|
|
224
|
+
auto repeat = RepeatForever::create(rotate);
|
|
225
|
+
sprite->runAction(repeat);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
void ActionDemo::createScalingSprite()
|
|
229
|
+
{
|
|
230
|
+
auto sprite = Sprite::create("player.png");
|
|
231
|
+
sprite->setPosition(Vec2(700, 200));
|
|
232
|
+
this->addChild(sprite);
|
|
233
|
+
|
|
234
|
+
// 缩放动画
|
|
235
|
+
auto scaleUp = ScaleTo::create(1.0f, 1.5f);
|
|
236
|
+
auto scaleDown = ScaleTo::create(1.0f, 1.0f);
|
|
237
|
+
auto sequence = Sequence::create(scaleUp, scaleDown, nullptr);
|
|
238
|
+
auto repeat = RepeatForever::create(sequence);
|
|
239
|
+
|
|
240
|
+
sprite->runAction(repeat);
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## 动作管理
|
|
245
|
+
|
|
246
|
+
### 停止动作
|
|
247
|
+
|
|
248
|
+
```cpp
|
|
249
|
+
// 停止所有动作
|
|
250
|
+
sprite->stopAllActions();
|
|
251
|
+
|
|
252
|
+
// 停止指定动作
|
|
253
|
+
auto action = sprite->getActionByTag(100);
|
|
254
|
+
if (action)
|
|
255
|
+
{
|
|
256
|
+
sprite->stopAction(action);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// 停止指定标签的动作
|
|
260
|
+
sprite->stopActionByTag(100);
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### 动作标签
|
|
264
|
+
|
|
265
|
+
```cpp
|
|
266
|
+
auto move = MoveBy::create(2.0f, Vec2(400, 0));
|
|
267
|
+
move->setTag(100);
|
|
268
|
+
sprite->runAction(move);
|
|
269
|
+
|
|
270
|
+
// 稍后可以通过标签获取
|
|
271
|
+
auto action = sprite->getActionByTag(100);
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## 参考资源
|
|
275
|
+
|
|
276
|
+
- **官方文档**: https://docs.cocos.com/cocos2d-x/v4/manual/zh/
|
|
277
|
+
- **Sprite 指南**: `examples/core/sprite.md`
|
|
278
|
+
- **Scene 指南**: `examples/core/scene.md`
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
# Animation(动画)系统使用指南
|
|
2
|
+
|
|
3
|
+
## 官方文档
|
|
4
|
+
|
|
5
|
+
参考官方文档:https://docs.cocos.com/cocos2d-x/v4/manual/zh/
|
|
6
|
+
|
|
7
|
+
## Instructions
|
|
8
|
+
|
|
9
|
+
Animation 系统用于创建帧动画。通过 SpriteFrame 序列创建 Animation,然后使用 Animate 动作播放。
|
|
10
|
+
|
|
11
|
+
### Syntax
|
|
12
|
+
|
|
13
|
+
#### 动画创建流程
|
|
14
|
+
|
|
15
|
+
1. 加载 SpriteFrame 到缓存
|
|
16
|
+
2. 创建 SpriteFrame 序列
|
|
17
|
+
3. 使用序列创建 Animation
|
|
18
|
+
4. 使用 Animate 创建动作
|
|
19
|
+
5. 在 Sprite 上运行动作
|
|
20
|
+
|
|
21
|
+
#### 关键类
|
|
22
|
+
|
|
23
|
+
- `SpriteFrameCache` - 精灵帧缓存
|
|
24
|
+
- `SpriteFrame` - 单个精灵帧
|
|
25
|
+
- `Animation` - 动画对象
|
|
26
|
+
- `Animate` - 动画动作
|
|
27
|
+
|
|
28
|
+
### Example (基本帧动画)
|
|
29
|
+
|
|
30
|
+
```cpp
|
|
31
|
+
// 加载精灵帧到缓存
|
|
32
|
+
auto cache = SpriteFrameCache::getInstance();
|
|
33
|
+
cache->addSpriteFramesWithFile("player.plist", "player.png");
|
|
34
|
+
|
|
35
|
+
// 创建精灵帧序列
|
|
36
|
+
Vector<SpriteFrame*> frames;
|
|
37
|
+
for (int i = 1; i <= 4; i++)
|
|
38
|
+
{
|
|
39
|
+
std::string frameName = StringUtils::format("player_walk_%02d.png", i);
|
|
40
|
+
auto frame = cache->getSpriteFrameByName(frameName);
|
|
41
|
+
if (frame)
|
|
42
|
+
{
|
|
43
|
+
frames.pushBack(frame);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// 创建动画(每帧 0.1 秒)
|
|
48
|
+
auto animation = Animation::createWithSpriteFrames(frames, 0.1f);
|
|
49
|
+
|
|
50
|
+
// 创建动画动作
|
|
51
|
+
auto animate = Animate::create(animation);
|
|
52
|
+
|
|
53
|
+
// 无限循环播放
|
|
54
|
+
auto repeat = RepeatForever::create(animate);
|
|
55
|
+
|
|
56
|
+
// 在精灵上运行动作
|
|
57
|
+
auto sprite = Sprite::createWithSpriteFrameName("player_walk_01.png");
|
|
58
|
+
sprite->runAction(repeat);
|
|
59
|
+
this->addChild(sprite);
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Example (动画控制)
|
|
63
|
+
|
|
64
|
+
```cpp
|
|
65
|
+
// 创建动画
|
|
66
|
+
auto animation = Animation::createWithSpriteFrames(frames, 0.1f);
|
|
67
|
+
auto animate = Animate::create(animation);
|
|
68
|
+
|
|
69
|
+
// 播放一次
|
|
70
|
+
sprite->runAction(animate);
|
|
71
|
+
|
|
72
|
+
// 播放指定次数
|
|
73
|
+
auto repeat = Repeat::create(animate, 3);
|
|
74
|
+
sprite->runAction(repeat);
|
|
75
|
+
|
|
76
|
+
// 无限循环
|
|
77
|
+
auto repeatForever = RepeatForever::create(animate);
|
|
78
|
+
sprite->runAction(repeatForever);
|
|
79
|
+
|
|
80
|
+
// 停止动画
|
|
81
|
+
sprite->stopAllActions();
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Example (多个动画)
|
|
85
|
+
|
|
86
|
+
```cpp
|
|
87
|
+
class Player : public Sprite
|
|
88
|
+
{
|
|
89
|
+
public:
|
|
90
|
+
CREATE_FUNC(Player);
|
|
91
|
+
virtual bool init() override;
|
|
92
|
+
|
|
93
|
+
void playIdleAnimation();
|
|
94
|
+
void playWalkAnimation();
|
|
95
|
+
void playJumpAnimation();
|
|
96
|
+
|
|
97
|
+
private:
|
|
98
|
+
Animation* _idleAnimation;
|
|
99
|
+
Animation* _walkAnimation;
|
|
100
|
+
Animation* _jumpAnimation;
|
|
101
|
+
Animate* _currentAnimate;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
bool Player::init()
|
|
105
|
+
{
|
|
106
|
+
if (!Sprite::init())
|
|
107
|
+
{
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
auto cache = SpriteFrameCache::getInstance();
|
|
112
|
+
cache->addSpriteFramesWithFile("player.plist", "player.png");
|
|
113
|
+
|
|
114
|
+
// 创建待机动画
|
|
115
|
+
Vector<SpriteFrame*> idleFrames;
|
|
116
|
+
for (int i = 1; i <= 2; i++)
|
|
117
|
+
{
|
|
118
|
+
auto frame = cache->getSpriteFrameByName(
|
|
119
|
+
StringUtils::format("player_idle_%02d.png", i));
|
|
120
|
+
idleFrames.pushBack(frame);
|
|
121
|
+
}
|
|
122
|
+
_idleAnimation = Animation::createWithSpriteFrames(idleFrames, 0.2f);
|
|
123
|
+
_idleAnimation->setRestoreOriginalFrame(true);
|
|
124
|
+
|
|
125
|
+
// 创建行走动画
|
|
126
|
+
Vector<SpriteFrame*> walkFrames;
|
|
127
|
+
for (int i = 1; i <= 4; i++)
|
|
128
|
+
{
|
|
129
|
+
auto frame = cache->getSpriteFrameByName(
|
|
130
|
+
StringUtils::format("player_walk_%02d.png", i));
|
|
131
|
+
walkFrames.pushBack(frame);
|
|
132
|
+
}
|
|
133
|
+
_walkAnimation = Animation::createWithSpriteFrames(walkFrames, 0.1f);
|
|
134
|
+
|
|
135
|
+
// 创建跳跃动画
|
|
136
|
+
Vector<SpriteFrame*> jumpFrames;
|
|
137
|
+
for (int i = 1; i <= 3; i++)
|
|
138
|
+
{
|
|
139
|
+
auto frame = cache->getSpriteFrameByName(
|
|
140
|
+
StringUtils::format("player_jump_%02d.png", i));
|
|
141
|
+
jumpFrames.pushBack(frame);
|
|
142
|
+
}
|
|
143
|
+
_jumpAnimation = Animation::createWithSpriteFrames(jumpFrames, 0.15f);
|
|
144
|
+
_jumpAnimation->setRestoreOriginalFrame(true);
|
|
145
|
+
|
|
146
|
+
// 默认播放待机动画
|
|
147
|
+
playIdleAnimation();
|
|
148
|
+
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
void Player::playIdleAnimation()
|
|
153
|
+
{
|
|
154
|
+
this->stopAllActions();
|
|
155
|
+
_currentAnimate = Animate::create(_idleAnimation);
|
|
156
|
+
auto repeat = RepeatForever::create(_currentAnimate);
|
|
157
|
+
this->runAction(repeat);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
void Player::playWalkAnimation()
|
|
161
|
+
{
|
|
162
|
+
this->stopAllActions();
|
|
163
|
+
_currentAnimate = Animate::create(_walkAnimation);
|
|
164
|
+
auto repeat = RepeatForever::create(_currentAnimate);
|
|
165
|
+
this->runAction(repeat);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
void Player::playJumpAnimation()
|
|
169
|
+
{
|
|
170
|
+
this->stopAllActions();
|
|
171
|
+
_currentAnimate = Animate::create(_jumpAnimation);
|
|
172
|
+
this->runAction(_currentAnimate);
|
|
173
|
+
|
|
174
|
+
// 跳跃动画结束后恢复待机
|
|
175
|
+
auto callback = CallFunc::create([this]() {
|
|
176
|
+
this->playIdleAnimation();
|
|
177
|
+
});
|
|
178
|
+
auto sequence = Sequence::create(_currentAnimate, callback, nullptr);
|
|
179
|
+
this->runAction(sequence);
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Example (动画回调)
|
|
184
|
+
|
|
185
|
+
```cpp
|
|
186
|
+
// 创建动画
|
|
187
|
+
auto animation = Animation::createWithSpriteFrames(frames, 0.1f);
|
|
188
|
+
auto animate = Animate::create(animation);
|
|
189
|
+
|
|
190
|
+
// 动画完成回调
|
|
191
|
+
auto callback = CallFunc::create([sprite]() {
|
|
192
|
+
log("Animation finished");
|
|
193
|
+
sprite->setColor(Color3B::RED);
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
auto sequence = Sequence::create(animate, callback, nullptr);
|
|
197
|
+
sprite->runAction(sequence);
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Example (动画延迟)
|
|
201
|
+
|
|
202
|
+
```cpp
|
|
203
|
+
// 创建动画
|
|
204
|
+
auto animation = Animation::createWithSpriteFrames(frames, 0.1f);
|
|
205
|
+
|
|
206
|
+
// 设置动画延迟(每帧之间的延迟)
|
|
207
|
+
animation->setDelayPerUnit(0.1f);
|
|
208
|
+
|
|
209
|
+
// 设置总延迟
|
|
210
|
+
animation->setDelayUnits(0.5f);
|
|
211
|
+
|
|
212
|
+
auto animate = Animate::create(animation);
|
|
213
|
+
sprite->runAction(animate);
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## Reference
|
|
217
|
+
|
|
218
|
+
- **官方文档**: https://docs.cocos.com/cocos2d-x/v4/manual/zh/
|
|
219
|
+
- **Sprite 指南**: `examples/core/sprite.md`
|
|
220
|
+
- **Action 指南**: `examples/core/action.md`
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Event(事件)系统使用指南
|
|
2
|
+
|
|
3
|
+
## 官方文档
|
|
4
|
+
|
|
5
|
+
参考官方文档:https://docs.cocos.com/cocos2d-x/v4/manual/zh/
|
|
6
|
+
|
|
7
|
+
## Instructions
|
|
8
|
+
|
|
9
|
+
Cocos2d-x 使用事件分发器(EventDispatcher)来处理各种事件。事件系统支持触摸、鼠标、键盘、自定义事件等。
|
|
10
|
+
|
|
11
|
+
### Syntax
|
|
12
|
+
|
|
13
|
+
#### 事件监听器类型
|
|
14
|
+
|
|
15
|
+
- `EventListenerTouchOneByOne` - 单点触摸事件
|
|
16
|
+
- `EventListenerTouchAllAtOnce` - 多点触摸事件
|
|
17
|
+
- `EventListenerMouse` - 鼠标事件
|
|
18
|
+
- `EventListenerKeyboard` - 键盘事件
|
|
19
|
+
- `EventListenerCustom` - 自定义事件
|
|
20
|
+
|
|
21
|
+
#### 事件注册
|
|
22
|
+
|
|
23
|
+
- `_eventDispatcher->addEventListenerWithSceneGraphPriority()` - 使用场景图优先级
|
|
24
|
+
- `_eventDispatcher->addEventListenerWithFixedPriority()` - 使用固定优先级
|
|
25
|
+
- `_eventDispatcher->removeEventListener()` - 移除事件监听器
|
|
26
|
+
|
|
27
|
+
### Example (自定义事件)
|
|
28
|
+
|
|
29
|
+
```cpp
|
|
30
|
+
// 定义自定义事件名称
|
|
31
|
+
const std::string EVENT_PLAYER_DIED = "player_died";
|
|
32
|
+
const std::string EVENT_SCORE_UPDATED = "score_updated";
|
|
33
|
+
|
|
34
|
+
// 创建自定义事件监听器
|
|
35
|
+
auto listener = EventListenerCustom::create(EVENT_PLAYER_DIED, [](EventCustom* event) {
|
|
36
|
+
log("Player died event received");
|
|
37
|
+
// 处理玩家死亡事件
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// 注册监听器
|
|
41
|
+
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
|
|
42
|
+
|
|
43
|
+
// 发送自定义事件
|
|
44
|
+
EventCustom event(EVENT_PLAYER_DIED);
|
|
45
|
+
_eventDispatcher->dispatchEvent(&event);
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Example (事件优先级)
|
|
49
|
+
|
|
50
|
+
```cpp
|
|
51
|
+
// 场景图优先级(推荐)
|
|
52
|
+
auto listener1 = EventListenerTouchOneByOne::create();
|
|
53
|
+
listener1->onTouchBegan = [](Touch* touch, Event* event) { return true; };
|
|
54
|
+
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, node1);
|
|
55
|
+
|
|
56
|
+
// 固定优先级
|
|
57
|
+
auto listener2 = EventListenerTouchOneByOne::create();
|
|
58
|
+
listener2->onTouchBegan = [](Touch* touch, Event* event) { return true; };
|
|
59
|
+
_eventDispatcher->addEventListenerWithFixedPriority(listener2, 100);
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Example (事件冒泡)
|
|
63
|
+
|
|
64
|
+
```cpp
|
|
65
|
+
// 设置事件是否冒泡
|
|
66
|
+
auto listener = EventListenerTouchOneByOne::create();
|
|
67
|
+
listener->setSwallowTouches(true); // 阻止事件继续传播
|
|
68
|
+
listener->onTouchBegan = [](Touch* touch, Event* event) {
|
|
69
|
+
return true; // 返回 true 表示处理此事件
|
|
70
|
+
};
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Example (完整事件处理示例)
|
|
74
|
+
|
|
75
|
+
```cpp
|
|
76
|
+
class GameLayer : public Layer
|
|
77
|
+
{
|
|
78
|
+
public:
|
|
79
|
+
CREATE_FUNC(GameLayer);
|
|
80
|
+
virtual bool init() override;
|
|
81
|
+
|
|
82
|
+
private:
|
|
83
|
+
void setupEventListeners();
|
|
84
|
+
void onPlayerDied(EventCustom* event);
|
|
85
|
+
void onScoreUpdated(EventCustom* event);
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
bool GameLayer::init()
|
|
89
|
+
{
|
|
90
|
+
if (!Layer::init())
|
|
91
|
+
{
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
setupEventListeners();
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
void GameLayer::setupEventListeners()
|
|
100
|
+
{
|
|
101
|
+
// 玩家死亡事件
|
|
102
|
+
auto playerDiedListener = EventListenerCustom::create(
|
|
103
|
+
"player_died",
|
|
104
|
+
CC_CALLBACK_1(GameLayer::onPlayerDied, this)
|
|
105
|
+
);
|
|
106
|
+
_eventDispatcher->addEventListenerWithSceneGraphPriority(playerDiedListener, this);
|
|
107
|
+
|
|
108
|
+
// 分数更新事件
|
|
109
|
+
auto scoreListener = EventListenerCustom::create(
|
|
110
|
+
"score_updated",
|
|
111
|
+
CC_CALLBACK_1(GameLayer::onScoreUpdated, this)
|
|
112
|
+
);
|
|
113
|
+
_eventDispatcher->addEventListenerWithSceneGraphPriority(scoreListener, this);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
void GameLayer::onPlayerDied(EventCustom* event)
|
|
117
|
+
{
|
|
118
|
+
log("Player died!");
|
|
119
|
+
// 处理玩家死亡逻辑
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
void GameLayer::onScoreUpdated(EventCustom* event)
|
|
123
|
+
{
|
|
124
|
+
int* score = static_cast<int*>(event->getUserData());
|
|
125
|
+
log("Score updated: %d", *score);
|
|
126
|
+
// 更新 UI
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Reference
|
|
131
|
+
|
|
132
|
+
- **官方文档**: https://docs.cocos.com/cocos2d-x/v4/manual/zh/
|
|
133
|
+
- **Input 指南**: `examples/core/input.md`
|