diff --git a/codes/games/client/Edit/Settings.ini b/codes/games/client/Edit/Settings.ini index 078f3de..bc93c87 100644 --- a/codes/games/client/Edit/Settings.ini +++ b/codes/games/client/Edit/Settings.ini @@ -123,16 +123,16 @@ DocumentTypeKeyWordsFile1= DocumentTypeFunctionRegExp1= [MRUFiles] -MRUItem1=G:\Works\YouleGames\games\games\Projects\clinet\gamehall\js\gamemain.js -MRUItem2=G:\Works\YouleGames\games\games\Projects\clinet\zpy\js\gamemain.js -MRUItem3=G:\Works\YouleGames\games\games\Projects\Project1\js\gamemain.js -MRUItem4=G:\Works\YouleGames\games\games\Projects\clinet\sangelaok\js\gamemain.js -MRUItem5=G:\Works\YouleGames\games\games\Projects\clinet\niuniu\js\gamemain.js -MRUItem6=G:\Works\YouleGames\games\games\Projects\clinet\guanpai-jx\js\gamemain.js -MRUItem7=G:\Works\YouleGames\games\games\Projects\clinet\doudizhu\js\gamemain.js -MRUItem8=G:\Works\JinXianProjects\JinXianMahjong\Projects\client\js\gamemain.js -MRUItem9=G:\Works\JinXianProjects\JinXianMahjong\Projects\Project1\js\gamemain.js -MRUItem10=G:\Works\JinXianProjects\JinXianMahjong\Projects\client\js\client_Event.js +MRUItem1=G:\Works\YouleGames\codes\games\client\Projects\Project1\js\gamemain.js +MRUItem2=G:\Works\YouleGames\codes\games\client\Projects\Spine\js\gamemain.js +MRUItem3=G:\Works\YouleGames\codes\games\client\Projects\Spine\index.html +MRUItem4=G:\Works\YouleGames\games\games\Projects\clinet\gamehall\js\gamemain.js +MRUItem5=G:\Works\YouleGames\games\games\Projects\clinet\zpy\js\gamemain.js +MRUItem6=G:\Works\YouleGames\games\games\Projects\Project1\js\gamemain.js +MRUItem7=G:\Works\YouleGames\games\games\Projects\clinet\sangelaok\js\gamemain.js +MRUItem8=G:\Works\YouleGames\games\games\Projects\clinet\niuniu\js\gamemain.js +MRUItem9=G:\Works\YouleGames\games\games\Projects\clinet\guanpai-jx\js\gamemain.js +MRUItem10=G:\Works\YouleGames\games\games\Projects\clinet\doudizhu\js\gamemain.js [MRUFindText] MRUItem1=ÅäÖà diff --git a/codes/games/client/History.txt b/codes/games/client/History.txt index 7a17c9a..af6822f 100644 --- a/codes/games/client/History.txt +++ b/codes/games/client/History.txt @@ -1,3 +1,5 @@ +G:\Works\YouleGames\codes\games\client\Projects\Spine\ +G:\Works\YouleGames\codes\games\client\Projects\Project1\ G:\Works\YouleGames\games\games\Projects\clinet\gamehall\ G:\Works\YouleGames\games\games\Projects\clinet\zpy\ G:\Works\YouleGames\games\games\Projects\clinet\sangelaok\ diff --git a/codes/games/client/Projects/Game_Surface_3/docs/SpineåŠ¨ç”»é›†æˆæ‰‹å†Œ.md b/codes/games/client/Projects/Game_Surface_3/docs/SpineåŠ¨ç”»é›†æˆæ‰‹å†Œ.md new file mode 100644 index 0000000..e7398eb --- /dev/null +++ b/codes/games/client/Projects/Game_Surface_3/docs/SpineåŠ¨ç”»é›†æˆæ‰‹å†Œ.md @@ -0,0 +1,806 @@ +# Spine åŠ¨ç”»é›†æˆæ‰‹å†Œ + +> 本手册针对 **gameabc 引擎** çš„ Spine 项目,说明如何在 Canvas 2D 游æˆä¸åŠ è½½ã€ +> æŽ§åˆ¶å’Œç®¡ç† Spine 骨骼动画。 +> è¿è¡Œæ—¶ç‰ˆæœ¬ï¼š**spine-canvas 4.2** | 引擎:**gameabc** + +--- + +## 目录 + +1. [项目结构总览](#1-项目结构总览) +2. [快速开始:5 分钟跑通](#2-快速开始5-分钟跑通) +3. [从 Spine 编辑器导出资æº](#3-从-spine-编辑器导出资æº) +4. [SpineMgr 完整 API å‚考](#4-spinemgr-完整-api-å‚考) +5. [事件系统](#5-事件系统) +6. [常è§ç”¨æ³•示例](#6-常è§ç”¨æ³•示例) +7. [与 gameabc ç²¾çµç³»ç»Ÿé…åˆ](#7-与-gameabc-ç²¾çµç³»ç»Ÿé…åˆ) +8. [性能优化建议](#8-性能优化建议) +9. [常è§é—®é¢˜æŽ’查](#9-常è§é—®é¢˜æŽ’查) +10. [é™„å½•ï¼šæ–‡ä»¶åŠ è½½é¡ºåº](#10-é™„å½•æ–‡ä»¶åŠ è½½é¡ºåº) + +--- + +## 1. 项目结构总览 + +``` +Projects/Spine/ +├── index.html â† å…¥å£ HTML +├── js/ +│ ├── spine-canvas.js ↠Spine Canvas 2D è¿è¡Œæ—¶ (第三方库) +│ ├── gameabc.min.js ↠gameabc 游æˆå¼•擎 +│ ├── SpineMgr.js ↠★ Spine 动画管ç†å™¨ï¼ˆç‹¬ç«‹æ–‡ä»¶ï¼Œè‡ªåŠ¨æŒ‚é’©æ¸²æŸ“ï¼‰ +│ ├── gamemain.js ↠游æˆä¸»é€»è¾‘ï¼ˆæ— éœ€ä¿®æ”¹ï¼‰ +│ ├── Spine_Event.js ↠Spine 事件回调 (complete / event) +│ └── Project1_Event.js ↠精çµäº‹ä»¶å•å…ƒ +├── assets/ +│ ├── bmp/ ↠gameabc å›¾ç‰‡èµ„æº +│ └── spine/ ↠★ Spine 资æºç›®å½• +│ ├── xxx.json â† éª¨éª¼æ•°æ® (Spine 编辑器导出) +│ ├── xxx.atlas ↠图集æè¿°æ–‡ä»¶ +│ └── xxx.png ↠图集纹ç†å›¾ç‰‡ +├── output/ ↠gameabc 编译输出的é…ç½®æ•°æ® +├── save/ ↠gameabc 编辑器ä¿å˜çš„ XML +└── docs/ ↠本文档所在目录 +``` + +### 关键文件说明 + +| 文件 | 作用 | 需è¦ä¿®æ”¹ | +|------|------|----------| +| `js/spine-canvas.js` | Spine 4.2 Canvas 渲染è¿è¡Œæ—¶ | ✗ ä¸è¦ä¿®æ”¹ | +| `js/SpineMgr.js` | Spine 动画管ç†å™¨ï¼Œè‡ªåЍåˆå§‹åŒ–+自动渲染 | ✗ ä¸éœ€è¦ä¿®æ”¹ | +| `js/gamemain.js` | 游æˆä¸»é€»è¾‘ï¼ˆä¿æŒåŽŸæ ·ï¼‰ | ✗ ä¸éœ€è¦ä¿®æ”¹ | +| `js/Spine_Event.js` | Spine 动画完æˆ/自定义事件回调 | ✓ 处ç†åŠ¨ç”»äº‹ä»¶ | +| `assets/spine/*` | Spine å¯¼å‡ºçš„èµ„æºæ–‡ä»¶ | ✓ æ”¾å…¥ä½ çš„èµ„æº | + +--- + +## 2. 快速开始:5 分钟跑通 + +### 第一æ¥ï¼šå‡†å¤‡ Spine èµ„æº + +å°† Spine 编辑器导出的 3 个文件å¤åˆ¶åˆ° `assets/spine/` 目录: + +``` +assets/spine/ +├── hero.json ↠骨骼 JSON +├── hero.atlas ↠图集æè¿° +└── hero.png â† å›¾é›†çº¹ç† +``` + +### 第二æ¥ï¼šåœ¨ä»»æ„ä½ç½®è°ƒç”¨ API æ’æ”¾åŠ¨ç”» + +**æ— éœ€æ‰‹åŠ¨ `load`**,直接调用 `setAnimation` å³å¯ã€‚如果该 Spine å®žä¾‹å°šæœªåŠ è½½ï¼Œä¼šè‡ªåŠ¨æ ¹æ® id 查找资æºï¼ˆçº¦å®šæ–‡ä»¶å id.json / id.atlas)并创建实例。 +渲染也已自动挂钩到 `gameenddraw`,开å‘è€…æ— éœ€ç¼–å†™ä»»ä½•æ¸²æŸ“ä»£ç 。 + +在任何 gameabc 事件回调ä¸ç›´æŽ¥è°ƒç”¨å³å¯ï¼š + +```javascript +// 设置ä½ç½® + æ’æ”¾åŠ¨ç”»ï¼Œæ— éœ€å…ˆ load +gameabc_face.spineMgr.setPosition("hero", 640, 500); +gameabc_face.spineMgr.setAnimation("hero", "idle", true); + +// 之åŽåˆ‡æ¢åŠ¨ç”» +gameabc_face.spineMgr.setAnimation("hero", "attack", false); +``` + +> **约定**:id å¿…é¡»ä¸Žèµ„æºæ–‡ä»¶å一致(ä¸å«æ‰©å±•å)。例如 id 为 `"hero"`, +> åˆ™éœ€è¦ `assets/spine/hero.json`ã€`hero.atlas`ã€`hero.png`。 +> +> **å¯é€‰**:如果资æºä¸åœ¨é»˜è®¤è·¯å¾„ `assets/spine/`ï¼Œå¯æ‰‹åŠ¨è°ƒç”¨ä¸€æ¬¡ `init()`: +> ```javascript +> gameabc_face.spineMgr.init("other/path/"); +> ``` + +### 第三æ¥ï¼šæ‰“å¼€ index.html å³å¯è¿è¡Œ + +用æµè§ˆå™¨æ‰“å¼€ `index.html`ï¼ˆéœ€è¦ HTTP æœåŠ¡å™¨çŽ¯å¢ƒï¼Œä¸èƒ½ç›´æŽ¥ `file://`): + +```bash +# 简易方法:在项目目录下å¯åЍ HTTP æœåŠ¡ +cd codes/games/client/Projects/Spine +npx http-server -p 8080 +# æµè§ˆå™¨è®¿é—® http://localhost:8080 +``` + +或者使用 gameabc 自带的预览环境。 + +--- + +## 3. 从 Spine ç¼–è¾‘å™¨å¯¼å‡ºèµ„æº + +### 导出设置(Spine 编辑器 → Export) + +1. 打开 Spine ç¼–è¾‘å™¨ï¼ŒåŠ è½½ä½ çš„ `.spine` 项目 +2. 点击èœå• **Spine → Export...** +3. 左侧选择 **JSON** æ ¼å¼ +4. é…置项: + +| 设置项 | 推è值 | 说明 | +|--------|--------|------| +| Output folder | `assets/spine/` | 直接导出到项目目录 | +| Extension | `.json` | éª¨éª¼æ•°æ®æ ¼å¼ | +| Create atlas | ✓ 勾选 | åŒæ—¶ç”Ÿæˆå›¾é›† | +| Atlas extension | `.atlas` | 图集æè¿°æ ¼å¼ | +| Images folder | (默认) | çº¹ç†æ¥æº | +| Max width/height | 2048 / 2048 | å›¾é›†çº¹ç†æœ€å¤§å°ºå¯¸ | +| Pack settings → Power of two | ✓ 勾选 | 纹ç†å°ºå¯¸ä¸º 2 的幂 | +| Pack settings → Premultiply alpha | ✗ ä¸å‹¾é€‰ | Canvas 2D ä¸éœ€è¦é¢„乘 | + +5. 点击 **Export** 按钮 + +### 导出åŽå¾—到的文件 + +``` +hero.json ↠骨骼数æ®ï¼ŒåŒ…å«éª¨éª¼ã€æ’æ§½ã€åŠ¨ç”»ç‰ +hero.atlas ↠图集æè¿°ï¼Œè®°å½•æ¯ä¸ªåŒºåŸŸåœ¨çº¹ç†ä¸çš„ä½ç½® +hero.png ↠图集纹ç†å›¾ç‰‡ +``` + +> **注æ„**:如果图集很大被拆分æˆå¤šå¼ (`hero.png`ã€`hero2.png`),所有 `.png` +> éƒ½éœ€è¦æ”¾åˆ° `assets/spine/` 目录ä¸ã€‚`.atlas` 文件会自动引用它们。 + +--- + +## 4. SpineMgr 完整 API å‚考 + +`SpineMgr` 挂载在 `gameabc_face.spineMgr` 上,所有调用形如: + +```javascript +gameabc_face.spineMgr.方法å(傿•°); +``` + +--- + +### 4.1 init(basePath) *(å¯é€‰)* + +**æ‰‹åŠ¨è®¾ç½®èµ„æºæ ¹è·¯å¾„ã€‚é€šå¸¸æ— éœ€è°ƒç”¨â€”â€”`load()` 会自动以默认路径 `"assets/spine/"` åˆå§‹åŒ–。** +ä»…åœ¨èµ„æºæ”¾åœ¨å…¶ä»–目录时æ‰éœ€è¦è°ƒç”¨ï¼š + +```javascript +gameabc_face.spineMgr.init("other/spine/path/"); +``` + +| 傿•° | 类型 | 说明 | +|------|------|------| +| `basePath` | string | Spine èµ„æºæ–‡ä»¶çš„æ ¹ç›®å½•路径,需è¦ä»¥ `/` 结尾。çœç•¥åˆ™ä½¿ç”¨é»˜è®¤å€¼ `"assets/spine/"` | + +--- + +### 4.2 load(id, jsonFile, atlasFile, option) *(å¯é€‰)* + +**æ‰‹åŠ¨åŠ è½½ä¸€ç»„ Spine 资æºå¹¶æ³¨å†Œä¸ºä¸€ä¸ªå®žä¾‹ã€‚é€šå¸¸æ— éœ€è°ƒç”¨â€”â€”æ‰€æœ‰ API 在实例ä¸å˜åœ¨æ—¶ä¼šè‡ªåŠ¨åŠ è½½ã€‚** + +ä»…åœ¨ä»¥ä¸‹æƒ…å†µéœ€è¦æ‰‹åŠ¨è°ƒç”¨ `load()`: +- id 与文件åä¸ä¸€è‡´ï¼ˆå¦‚ id 为 `"mj"` 但文件为 `mj_gangshangkaihua.json`) +- 需è¦åœ¨åŠ è½½æ—¶æŒ‡å®š skinã€scale ç‰åˆå§‹å‚æ•° + +```javascript +gameabc_face.spineMgr.load("hero", "hero.json", "hero.atlas", { + x: 640, + y: 500, + scale: 0.5, + skin: "default", + animation: "idle", + loop: true, + mixDuration: 0.2 +}); +``` + +| 傿•° | 类型 | 说明 | +|------|------|------| +| `id` | string | å”¯ä¸€æ ‡è¯†ï¼ŒåŽç»æ‰€æœ‰æ“ä½œé€šè¿‡æ¤ id 引用 | +| `jsonFile` | string | 骨骼 JSON 文件å(相对于 basePath) | +| `atlasFile` | string | 图集 atlas 文件å(相对于 basePath) | +| `option` | object | å¯é€‰é…置对象 | + +**option å—æ®µï¼š** + +| å—æ®µ | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| `x` | number | 0 | Canvas X åæ ‡ | +| `y` | number | 0 | Canvas Y åæ ‡ | +| `scale` | number | 1 | åˆå§‹ç¼©æ”¾æ¯”例 | +| `skin` | string | `"default"` | åˆå§‹çš®è‚¤åç§° | +| `animation` | string | null | åŠ è½½å®ŒæˆåŽè‡ªåŠ¨æ’æ”¾çš„动画å | +| `loop` | boolean | true | 默认动画是å¦å¾ªçޝ | +| `mixDuration` | number | 0.2 | åŠ¨ç”»åˆ‡æ¢æ—¶çš„è¿‡æ¸¡æ··åˆæ—¶é•¿ï¼ˆç§’) | + +--- + +### 4.3 setAnimation(id, animName, loop, track) + +**切æ¢åŠ¨ç”»ã€‚ç«‹å³æ›¿æ¢æŒ‡å®šè½¨é“上的当å‰åŠ¨ç”»ã€‚å¦‚æžœå®žä¾‹å°šæœªåŠ è½½ï¼Œä¼šè‡ªåŠ¨æ ¹æ® id åŠ è½½èµ„æºå¹¶åœ¨å°±ç»ªåŽæ’放。** + +```javascript +// æ— éœ€å…ˆ load,直接调用å³å¯ +gameabc_face.spineMgr.setAnimation("hero", "attack", false); +gameabc_face.spineMgr.setAnimation("hero", "run", true, 0); +``` + +| 傿•° | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| `id` | string | - | å®žä¾‹æ ‡è¯† | +| `animName` | string | - | 动画å称(必须在 Spine ä¸å˜åœ¨ï¼‰ | +| `loop` | boolean | true | 是å¦å¾ªçŽ¯æ’æ”¾ | +| `track` | number | 0 | 轨é“å·ï¼ˆå¤šè½¨é“å¯å åŠ åŠ¨ç”»ï¼‰ | + +**返回值:** `TrackEntry` 对象,å¯ç”¨äºŽè¿›ä¸€æ¥æŽ§åˆ¶ï¼›åŠ è½½æœªå®Œæˆæ—¶è¿”回 `null`。 + +--- + +### 4.4 addAnimation(id, animName, loop, delay, track) + +**å°†åŠ¨ç”»æ·»åŠ åˆ°æ’æ”¾é˜Ÿåˆ—,在当å‰åŠ¨ç”»ç»“æŸåŽè‡ªåŠ¨æ’æ”¾ã€‚** + +```javascript +// å…ˆæ’æ”¾ attack,attack 完æˆåŽè‡ªåŠ¨åˆ‡æ¢åˆ° idle +gameabc_face.spineMgr.setAnimation("hero", "attack", false); +gameabc_face.spineMgr.addAnimation("hero", "idle", true, 0); +``` + +| 傿•° | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| `id` | string | - | å®žä¾‹æ ‡è¯† | +| `animName` | string | - | 队列ä¸çš„下一个动画 | +| `loop` | boolean | true | 是å¦å¾ªçޝ | +| `delay` | number | 0 | 延迟秒数(0 = ä¸Šä¸€åŠ¨ç”»ç»“æŸæ—¶ç«‹å³å¼€å§‹ï¼‰ | +| `track` | number | 0 | 轨é“å· | + +--- + +### 4.5 setPosition(id, x, y) + +**设置 Spine 实例在 Canvas 上的ä½ç½®ã€‚** + +```javascript +gameabc_face.spineMgr.setPosition("hero", 640, 500); +``` + +> Spine çš„åæ ‡åŽŸç‚¹åœ¨éª¨éª¼çš„æ ¹éª¨éª¼å¤„ã€‚Y è½´å‘上为æ£ï¼ˆä¸Ž Canvas çš„ Y è½´æ–¹å‘相å), +> spine-canvas è¿è¡Œæ—¶å·²åšäº†å†…部转æ¢ã€‚ + +--- + +### 4.6 setScale(id, sx, sy) + +**设置缩放。** + +```javascript +gameabc_face.spineMgr.setScale("hero", 0.5); // ç‰æ¯”缩放 +gameabc_face.spineMgr.setScale("hero", 0.5, 0.8); // 分别设置 X/Y +``` + +| 傿•° | 类型 | 说明 | +|------|------|------| +| `sx` | number | X æ–¹å‘缩放 | +| `sy` | number | Y æ–¹å‘缩放(çœç•¥åˆ™ç‰äºŽ sx) | + +--- + +### 4.7 setFlip(id, flipX, flipY) + +**æ°´å¹³/垂直翻转。** + +```javascript +gameabc_face.spineMgr.setFlip("hero", true, false); // 水平翻转 +``` + +--- + +### 4.8 setVisible(id, visible) + +**显示或éšè— Spine 实例。** + +```javascript +gameabc_face.spineMgr.setVisible("hero", false); // éšè— +gameabc_face.spineMgr.setVisible("hero", true); // 显示 +``` + +--- + +### 4.9 setSkin(id, skinName) + +**切æ¢çš®è‚¤ã€‚** + +```javascript +gameabc_face.spineMgr.setSkin("hero", "warrior"); +``` + +> 切æ¢çš®è‚¤åŽä¼šè‡ªåЍé‡ç½®æ’槽到 Setup Pose。皮肤å必须在 Spine 编辑器ä¸é¢„定义。 + +--- + +### 4.10 getAnimations(id) + +**获å–该实例所有å¯ç”¨åŠ¨ç”»å称列表。** + +```javascript +var anims = gameabc_face.spineMgr.getAnimations("hero"); +// 返回: ["idle", "walk", "run", "attack", "die"] +logmessage("动画列表: " + anims.join(", ")); +``` + +--- + +### 4.11 getSkins(id) + +**获å–该实例所有å¯ç”¨çš®è‚¤å称列表。** + +```javascript +var skins = gameabc_face.spineMgr.getSkins("hero"); +// 返回: ["default", "warrior", "mage"] +``` + +--- + +### 4.12 playOnce(id, animName, track) + +**æ’æ”¾ä¸€æ¬¡åŠ¨ç”»åŽè‡ªåЍéšè—。** è‡ªåŠ¨æ˜¾ç¤ºå®žä¾‹ã€æ’放指定动画(ä¸å¾ªçŽ¯ï¼‰ï¼ŒåŠ¨ç”»å®ŒæˆåŽè‡ªåŠ¨è®¾ç½® `visible = false`。 + +```javascript +// æ’æ”¾ä¸€æ¬¡æ”»å‡»åŠ¨ç”»ï¼Œæ’完自动éšè— +gameabc_face.spineMgr.playOnce("hero", "attack"); + +// æŒ‡å®šè½¨é“ +gameabc_face.spineMgr.playOnce("hero", "attack", 0); +``` + +| 傿•° | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| `id` | string | - | å®žä¾‹æ ‡è¯† | +| `animName` | string | - | 动画åç§° | +| `track` | number | 0 | 轨é“å· | + +--- + +### 4.13 playQueue(id, animList, hideOnComplete) + +**æŒ‰é¡ºåºæ’放一组动画(队列),全部æ’完åŽå¯é€‰æ‹©éšè—æˆ–ä¿æŒæ˜¾ç¤ºã€‚** è‡ªåŠ¨æ˜¾ç¤ºå®žä¾‹ï¼Œé˜Ÿåˆ—ä¸æ¯ä¸ªåŠ¨ç”»å‡æ’放一次(ä¸å¾ªçŽ¯ï¼‰ï¼Œä¾æ¬¡æ’放。 + +```javascript +// æ’æ”¾ attack → die,全部æ’完åŽè‡ªåЍéšè—(默认) +gameabc_face.spineMgr.playQueue("hero", ["attack", "die"]); + +// æ’æ”¾ intro → idle,全部æ’完åŽä¿æŒæ˜¾ç¤º +gameabc_face.spineMgr.playQueue("hero", ["intro", "idle"], false); +``` + +| 傿•° | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| `id` | string | - | å®žä¾‹æ ‡è¯† | +| `animList` | string[] | - | 动画å称数组,按顺åºä¾æ¬¡æ’放 | +| `hideOnComplete` | boolean | true | `true` = 队列全部æ’完åŽè‡ªåЍéšè—ï¼›`false` = ä¿æŒæ˜¾ç¤º | + +--- + +### 4.14 remove(id) + +**é”€æ¯æŒ‡å®š Spine 实例,释放内å˜ã€‚** + +```javascript +gameabc_face.spineMgr.remove("hero"); +``` + +--- + +### 4.15 removeAll() + +**é”€æ¯æ‰€æœ‰ Spine 实例。** + +```javascript +gameabc_face.spineMgr.removeAll(); +``` + +### 4.16 spine_onComplete(spineId, animName, trackIndex) *(事件回调)* + +**动画完æˆå›žè°ƒã€‚æ¯æ¬¡åŠ¨ç”»æ’æ”¾ä¸€è½®ç»“æŸæ—¶è§¦å‘。** 在 `js/Spine_Event.js` ä¸å®šä¹‰ã€‚ + +```javascript +// 在 Spine_Event.js ä¸å®šä¹‰ +gameabc_face.spine_onComplete = function(spineId, animName, trackIndex) { + // 示例:攻击æ’å®ŒåŽæ¢å¤ idle + if (animName === "attack") { + gameabc_face.spineMgr.setAnimation(spineId, "idle", true); + } +}; +``` + +| 傿•° | 类型 | 说明 | +|------|------|------| +| `spineId` | string | å®žä¾‹æ ‡è¯†ï¼ˆå³ load / autoLoad æ—¶çš„ id) | +| `animName` | string | 刚完æˆçš„动画åç§° | +| `trackIndex` | number | 轨é“å·ï¼ˆé€šå¸¸ä¸º 0) | + +> **注æ„**ï¼šå¾ªçŽ¯åŠ¨ç”»æ¯æ’完一轮也会触å‘。`playOnce` / `playQueue` 的自动éšè—在æ¤å›žè°ƒ**之å‰**执行, +> å› æ¤å›žè°ƒä¸å¯ä»¥æ£€æŸ¥ `visible` çŠ¶æ€æˆ–釿–°æ˜¾ç¤ºå®žä¾‹ã€‚ + +--- + +### 4.17 spine_onEvent(spineId, eventName, intValue, floatValue, stringValue) *(事件回调)* + +**è‡ªå®šä¹‰äº‹ä»¶å›žè°ƒã€‚å½“åŠ¨ç”»æ’æ”¾åˆ° Spine 编辑器ä¸å®šä¹‰çš„ Event 关键帧时触å‘。** 在 `js/Spine_Event.js` ä¸å®šä¹‰ã€‚ + +```javascript +// 在 Spine_Event.js ä¸å®šä¹‰ +gameabc_face.spine_onEvent = function(spineId, eventName, intValue, floatValue, stringValue) { + if (eventName === "footstep") { + // æ’æ”¾è„šæ¥å£° + } + if (eventName === "hit") { + // 产生伤害判定 + } +}; +``` + +| 傿•° | 类型 | 说明 | +|------|------|------| +| `spineId` | string | å®žä¾‹æ ‡è¯† | +| `eventName` | string | Spine 编辑器ä¸å®šä¹‰çš„事件å | +| `intValue` | number | äº‹ä»¶çš„æ•´æ•°å‚æ•° | +| `floatValue` | number | äº‹ä»¶çš„æµ®ç‚¹å‚æ•° | +| `stringValue` | string | 事件的å—ç¬¦ä¸²å‚æ•° | + +> 事件需è¦åœ¨ Spine 编辑器的时间线ä¸é¢„å…ˆæ·»åŠ Event Key,导出 JSON åŽè¿è¡Œæ—¶è‡ªåŠ¨è§£æžã€‚ + +--- + +## 5. 事件系统(详细说明) + +Spine 动画在è¿è¡Œæ—¶ä¼šè§¦å‘两类事件,回调定义在 `js/Spine_Event.js` ä¸ã€‚ +API ç¾åè§ [4.16](#416-spine_oncompletespineid-animname-trackindex--事件回调) å’Œ [4.17](#417-spine_oneventspineid-eventname-intvalue-floatvalue-stringvalue--事件回调)。 + +### 5.1 动画完æˆäº‹ä»¶ spine_onComplete + +**æ¯æ¬¡åŠ¨ç”»å¾ªçŽ¯æ’æ”¾ä¸€è½®ç»“æŸæ—¶è§¦å‘。** + +```javascript +// 在 Spine_Event.js ä¸ +gameabc_face.spine_onComplete = function(spineId, animName, trackIndex) { + // spineId : load æ—¶çš„å”¯ä¸€æ ‡è¯†, 如 "hero" + // animName : 完æˆçš„动画å, 如 "attack" + // trackIndex : 轨é“å· (通常为 0) + + // 示例:éžå¾ªçŽ¯æ”»å‡»åŠ¨ç”»æ’å®ŒåŽæ¢å¤ idle + if (animName === "attack") { + gameabc_face.spineMgr.setAnimation(spineId, "idle", true); + } +}; +``` + +### 5.2 自定义事件 spine_onEvent + +**å½“åŠ¨ç”»æ’æ”¾åˆ° Spine 编辑器ä¸å®šä¹‰çš„ Event 关键帧时触å‘。** + +```javascript +// 在 Spine_Event.js ä¸ +gameabc_face.spine_onEvent = function(spineId, eventName, intValue, floatValue, stringValue) { + // spineId : å”¯ä¸€æ ‡è¯† + // eventName : Spine 编辑器ä¸å®šä¹‰çš„事件å + // intValue : æ•´æ•°å‚æ•° + // floatValue : æµ®ç‚¹å‚æ•° + // stringValue : å—ç¬¦ä¸²å‚æ•° + + if (eventName === "footstep") { + // æ’æ”¾è„šæ¥å£° + } + if (eventName === "hit") { + // 产生伤害判定 + } +}; +``` + +### 如何在 Spine ç¼–è¾‘å™¨ä¸æ·»åŠ äº‹ä»¶ + +1. 打开 Spine 编辑器,选ä¸åŠ¨ç”» +2. 在时间线底部点击å³é”® → **Add Event Key** +3. 在 **Tree** 颿¿ä¸åˆ›å»ºå¹¶å‘½å事件(如 `hit`ã€`footstep`) +4. å¯ä¸ºäº‹ä»¶è®¾ç½® int / float / string 傿•° +5. 导出 JSON åŽï¼Œè¿è¡Œæ—¶ä¼šè‡ªåŠ¨è§£æžå¹¶è§¦å‘回调 + +--- + +## 6. 常è§ç”¨æ³•示例 + +### 6.1 åŠ è½½å¤šä¸ªè§’è‰² + +```javascript +// 在 gamestart æˆ–ä»»æ„æ—¶æœºï¼Œç›´æŽ¥è®¾ç½®ä½ç½®å¹¶æ’æ”¾ï¼ˆè‡ªåŠ¨åŠ è½½ï¼‰ +gameabc_face.spineMgr.setPosition("hero", 640, 500); +gameabc_face.spineMgr.setAnimation("hero", "idle", true); + +gameabc_face.spineMgr.setPosition("npc", 300, 500); +gameabc_face.spineMgr.setAnimation("npc", "idle", true); + +gameabc_face.spineMgr.setPosition("monster", 900, 500); +gameabc_face.spineMgr.setAnimation("monster", "walk", true); +``` + +### 6.2 æ’æ”¾ä¸€æ¬¡åŽéšè— / é˜Ÿåˆ—æ’æ”¾ + +```javascript +// æ’æ”¾ä¸€æ¬¡æ”»å‡»åŠ¨ç”»ï¼Œå®ŒæˆåŽè‡ªåЍéšè— +gameabc_face.spineMgr.setPosition("effect", 640, 400); +gameabc_face.spineMgr.playOnce("effect", "explode"); + +// é˜Ÿåˆ—æ’æ”¾ï¼šæ”»å‡» → æ»äº¡ï¼Œå…¨éƒ¨æ’完åŽè‡ªåЍéšè— +gameabc_face.spineMgr.playQueue("monster", ["hit", "die"]); + +// é˜Ÿåˆ—æ’æ”¾ï¼šå…¥åœº → 待机,全部æ’完åŽä¿æŒæ˜¾ç¤º +gameabc_face.spineMgr.playQueue("hero", ["intro", "idle"], false); +``` + +### 6.3 点击切æ¢åŠ¨ç”»ï¼ˆæ”»å‡»â†’æ¢å¤ï¼‰ + +```javascript +gameabc_face.mousedown = function(gameid, spid, downx, downy) { + // ç‚¹å‡»æ’æ”¾æ”»å‡»ï¼ˆéžå¾ªçŽ¯ï¼‰ + gameabc_face.spineMgr.setAnimation("hero", "attack", false); + // 攻击完自动切回 idle + gameabc_face.spineMgr.addAnimation("hero", "idle", true, 0); +}; +``` + +### 6.4 角色移动 + 动画è”动 + +```javascript +var heroState = "idle"; + +gameabc_face.mousedown = function(gameid, spid, downx, downy) { + heroState = "run"; + gameabc_face.spineMgr.setAnimation("hero", "run", true); +}; + +gameabc_face.mouseup = function(gameid, spid_down, downx, downy, spid_up, upx, upy) { + heroState = "idle"; + gameabc_face.spineMgr.setAnimation("hero", "idle", true); +}; + +gameabc_face.mousemove = function(gameid, spid, downx, downy, movex, movey, timelong, offmovex, offmovey) { + // 通过拖拽移动角色 + var mgr = gameabc_face.spineMgr; + var entry = mgr._entries["hero"]; + if (entry) { + mgr.setPosition("hero", entry.x + offmovex, entry.y + offmovey); + // æ ¹æ®ç§»åŠ¨æ–¹å‘翻转 + mgr.setFlip("hero", offmovex < 0, false); + } +}; +``` + +### 6.5 多轨é“å åŠ ï¼ˆèµ°è·¯ + 射击) + +Spine 支æŒå¤šè½¨é“åŒæ—¶æ’放动画。低轨é“(track 0)为基础动画,高轨é“覆盖部分骨骼: + +```javascript +// track 0: 下åŠèº«èµ°è·¯ +gameabc_face.spineMgr.setAnimation("hero", "walk", true, 0); + +// track 1: 上åŠèº«å°„击(在 Spine 编辑器ä¸åªè®¾ç½®ä¸ŠåŠèº«éª¨éª¼çš„关键帧) +gameabc_face.spineMgr.setAnimation("hero", "shoot", false, 1); +``` + +### 6.6 动æ€åˆ‡æ¢çš®è‚¤ï¼ˆæ¢è£…系统) + +```javascript +// 查看有哪些皮肤 +var skins = gameabc_face.spineMgr.getSkins("hero"); +logmessage("å¯ç”¨çš®è‚¤: " + skins.join(", ")); + +// 切æ¢åˆ°æˆ˜å£«çš®è‚¤ +gameabc_face.spineMgr.setSkin("hero", "warrior"); + +// 切æ¢åˆ°æ³•师皮肤 +gameabc_face.spineMgr.setSkin("hero", "mage"); +``` + +### 6.7 è¿è¡Œæ—¶æŸ¥è¯¢åŠ¨ç”»åˆ—è¡¨ + +```javascript +gameabc_face.spine_onComplete = function(spineId, animName, trackIndex) { + var anims = gameabc_face.spineMgr.getAnimations(spineId); + logmessage(spineId + " 拥有的动画: " + anims.join(", ")); +}; +``` + +--- + +## 7. 与 gameabc ç²¾çµç³»ç»Ÿé…åˆ + +### æ¸²æŸ“æ—¶åº + +``` +gameabc 引擎循环 (æ¯å¸§) + │ + ├── gamebegindraw() ↠帧开始 + ├── é历 Layer → æ¯ä¸ªç²¾çµ: + │ ├── gamemydrawbegin() + │ ├── ç²¾çµè‡ªç»˜ (图片/æ–‡å—) + │ └── gamemydraw() + ├── gameenddraw() ↠用户自定义逻辑 + │ └── (自动) spineMgr.updateAndDraw(ctx) ↠★ 通过 defineProperty è‡ªåŠ¨è¿½åŠ + └── å¸§ç»“æŸ +``` + +Spine 动画在 `gameenddraw` 末尾**自动渲染**(通过 `Object.defineProperty` 拦截实现, +æ— è®ºå¼€å‘è€…å¦‚ä½•é‡æ–°å®šä¹‰ `gameenddraw`,Spine 渲染都ä¸ä¼šä¸¢å¤±ï¼‰ï¼Œ +å› æ¤ä¼š**覆盖在所有 gameabc ç²¾çµä¹‹ä¸Š**。 +å¼€å‘者在 `gameenddraw` ä¸ç¼–写的自定义逻辑会先执行,Spine 渲染在其åŽè‡ªåŠ¨æ‰§è¡Œã€‚ + +### å¦‚æžœéœ€è¦ Spine 在精çµä¹‹ä¸‹æ¸²æŸ“ + +å¯ä»¥é€šè¿‡æ‰‹åŠ¨æŽ§åˆ¶æ¸²æŸ“æ—¶æœºæ¥å®žçŽ°ã€‚åœ¨ `gamebegindraw` 䏿‰‹åŠ¨è°ƒç”¨æ¸²æŸ“ï¼Œå¹¶ç¦ç”¨è‡ªåŠ¨æ¸²æŸ“ï¼š + +```javascript +// æ–¹å¼ï¼šåœ¨ gamebegindraw 䏿‰‹åŠ¨æ¸²æŸ“ +gameabc_face.gamebegindraw = function(gameid, spid, times, timelong) { + var ctx = gameabc_face.dc; + if (ctx) { + gameabc_face.spineMgr.updateAndDraw(ctx); + } + // æ ‡è®°è‡ªåŠ¨æ¸²æŸ“è·³è¿‡ï¼ˆå› ä¸ºå·²åœ¨æ¤æ‰‹åŠ¨æ¸²æŸ“ï¼‰ + gameabc_face.spineMgr._rendered = true; +}; +``` + +> 注æ„:当å‰è‡ªåŠ¨æŒ‚é’©åœ¨ gameenddraw 末尾,如需精细控制层级, +> å¯å°† SpineMgr._inited 临时置 false 跳过自动渲染,手动选择渲染时机。 + +### 让 Spine è·ŸéšæŸä¸ªç²¾çµç§»åЍ + +```javascript +gameabc_face.gamemydraw = function(gameid, spid, times, timelong) { + // 让 Spine 角色跟éšç²¾çµ 1 çš„ä½ç½® + if (spid === 1) { + var sx = get_self(1, 18, 0, 0, 0); // 获å–ç²¾çµ 1 çš„ X + var sy = get_self(1, 19, 0, 0, 0); // 获å–ç²¾çµ 1 çš„ Y + gameabc_face.spineMgr.setPosition("hero", sx, sy); + } +}; +``` + +--- + +## 8. 性能优化建议 + +### 8.1 å›¾é›†çº¹ç† + +- 纹ç†å°ºå¯¸å»ºè®®ä¸è¶…过 **2048×2048** +- 导出时勾选 **Power of two** ç¡®ä¿å°ºå¯¸ä¸º 2 的幂 +- ä¸è¦å‹¾é€‰ **Premultiply alpha**(Canvas 2D ä¸éœ€è¦é¢„乘 Alpha) + +### 8.2 æŽ§åˆ¶å®žä¾‹æ•°é‡ + +- Canvas 2D 渲染性能有é™ï¼Œå»ºè®®åŒå± Spine 实例ä¸è¶…过 **5-8 个** +- ä¸å¯è§çš„实例调用 `setVisible(id, false)`,跳过渲染和更新 +- ä¸å†éœ€è¦çš„实例调用 `remove(id)` é‡Šæ”¾å†…å˜ + +### 8.3 å‡å°‘éª¨éª¼å¤æ‚度 + +- 骨骼数é‡å»ºè®®æŽ§åˆ¶åœ¨ **50 个**以内 +- å‡å°‘ç½‘æ ¼å˜å½¢ï¼ˆMesh Deform),对 Canvas 2D å½±å“较大 +- 使用è£å‰ªï¼ˆClipping)时性能开销大,谨慎使用 + +### 8.4 åŠ¨ç”»æ··åˆæ—¶é•¿ + +`mixDuration` 越长,过渡越平滑,但在切æ¢çž¬é—´éœ€è¦åŒæ—¶è®¡ç®—两个动画。 +建议设为 **0.1 ~ 0.3 ç§’**。 + +--- + +## 9. 常è§é—®é¢˜æŽ’查 + +### Q1: ç”»é¢ä¸Šçœ‹ä¸åˆ° Spine 动画 + +**检查清å•:** + +1. **æ–‡ä»¶è·¯å¾„æ˜¯å¦æ£ç¡®ï¼Ÿ** + - 确认 `assets/spine/` 目录下有 `.json`ã€`.atlas`ã€`.png` + - 文件å大å°å†™å¿…须一致(Linux/Mac æœåŠ¡å™¨åŒºåˆ†å¤§å°å†™ï¼‰ + +2. **是å¦é€šè¿‡ HTTP 访问?** + - `file://` åè®®æ— æ³•åŠ è½½è·¨åŸŸèµ„æºï¼Œå¿…须使用 HTTP æœåС噍 + +3. **打开æµè§ˆå™¨æŽ§åˆ¶å°ï¼ˆF12)看报错** + - 404 错误:文件路径有误 + - JSON è§£æžé”™è¯¯ï¼š`.json` æ–‡ä»¶æ ¼å¼å¼‚常 + - `spine is not defined`:`spine-canvas.js` 未æ£ç¡®åŠ è½½ + +4. **åæ ‡æ˜¯å¦åœ¨å¯è§èŒƒå›´å†…?** + - 项目设计尺寸为 1280×720,检查 `x` å’Œ `y` 是å¦åœ¨æ¤èŒƒå›´ + +5. **logmessage è¾“å‡ºæ˜¯å¦æœ‰ "[SpineMgr] xxx 构建完æˆ"?** + - 有 → åŠ è½½æˆåŠŸï¼Œæ£€æŸ¥åæ ‡å’Œç¼©æ”¾ + - 有 "构建失败" → æŸ¥çœ‹å…·ä½“é”™è¯¯ä¿¡æ¯ + - 没有 → 资æºè¿˜åœ¨åŠ è½½ä¸æˆ–路径错误 + +### Q2: 动画显示ä½ç½®ä¸å¯¹ + +- Spine 编辑器ä¸è®¾ç½®éª¨éª¼åŽŸç‚¹çš„ä½ç½®ä¼šå½±å“è¿è¡Œæ—¶çš„锚点 +- 调整 `setPosition` çš„åæ ‡ï¼Œæˆ–在 Spine 编辑器ä¸ä¿®æ”¹æ ¹éª¨éª¼ä½ç½® +- æ³¨æ„ Spine çš„ Y 轴与 Canvas Y è½´æ–¹å‘å¯èƒ½ä¸åŒ + +### Q3: 动画速度太快或太慢 + +- 检查 `gameabc_Project` ä¸çš„ `fps` 设置(默认 30) +- SpineMgr 内部是用 `Date.now()` 计算真实时间差的,ä¸ä¾èµ–帧率 +- 如果需è¦å€é€Ÿæ’放,修改 `state.timeScale`: + ```javascript + var entry = gameabc_face.spineMgr._entries["hero"]; + entry.state.timeScale = 2.0; // 2 å€é€Ÿ + ``` + +### Q4: 切æ¢åŠ¨ç”»æ—¶æœ‰è·³å¸§ + +- 增大 `mixDuration`ï¼ˆåŠ è½½æ—¶çš„ option 或修改 `stateData.defaultMix`) +- 使用 `addAnimation` æŽ’é˜Ÿè€Œä¸æ˜¯ç›´æŽ¥ `setAnimation` æ‰“æ– + +### Q5: 多个 Spine 实例é‡å æ—¶é—ªçƒ + +- 确认没有åŒä¸€ä¸ª id åŠ è½½ä¸¤æ¬¡ +- 检查 `ctx.save()` / `ctx.restore()` 是å¦é…对(SpineMgr 内部已处ç†ï¼‰ + +### Q6: spine-canvas.js 版本与 Spine 编辑器版本ä¸åŒ¹é… + +- **spine-canvas.js 4.2** 需æé… **Spine 编辑器 4.2.x** å¯¼å‡ºçš„æ•°æ® +- 如果使用 Spine 4.1 编辑器,请下载对应版本的è¿è¡Œæ—¶ï¼š + ``` + https://unpkg.com/@esotericsoftware/spine-canvas@4.1/dist/iife/spine-canvas.js + ``` + +--- + +## 10. é™„å½•ï¼šæ–‡ä»¶åŠ è½½é¡ºåº + +`index.html` ä¸çš„ script æ ‡ç¾åŠ è½½é¡ºåºè‡³å…³é‡è¦ï¼š + +``` +1. spine-canvas.js â† å…ˆåŠ è½½ Spine è¿è¡Œæ—¶ (定义 window.spine) +2. gameabc.min.js ↠å†åŠ è½½æ¸¸æˆå¼•擎 +3. SpineMgr.js ↠Spine 管ç†å™¨ + defineProperty 自动挂钩渲染 +4. gamemain.js ↠游æˆä¸»é€»è¾‘(ä¸éœ€ä¿®æ”¹ï¼Œç›´æŽ¥è°ƒç”¨ API å³å¯ï¼‰ +5. Spine_Event.js ↠Spine 事件回调 (ä¾èµ– gameabc_face) +6. Project1_Event.js ↠精çµäº‹ä»¶ +7. gameabc_data.min.js ↠项目é…ç½®æ•°æ® (引擎åˆå§‹åŒ–) +``` + +> **ä¸èƒ½è°ƒæ¢é¡ºåº**,`SpineMgr.js` 必须在 `gamemain.js` 之å‰åŠ è½½ï¼Œ +> å¦åˆ™ä¼šå‡ºçް `spine is not defined` 或 `gameabc_face.spineMgr is undefined` 的错误。 + +--- + +## 附录:完整最å°ç¤ºä¾‹ gamemain.js + +`gamemain.js` **ä¸éœ€è¦ä»»ä½•修改**ï¼Œä¿æŒåŽŸæ ·å³å¯ã€‚在任æ„事件回调ä¸ç›´æŽ¥è°ƒç”¨ `gameabc_face.spineMgr` çš„ API: + +```javascript +// gamemain.js —— æ— éœ€ä¿®æ”¹æ¡†æž¶ï¼Œåªéœ€åœ¨å›žè°ƒä¸è°ƒç”¨ API + +gameabc_face.gamestart = function(gameid) { + // 直接设置ä½ç½®å¹¶æ’æ”¾åŠ¨ç”»ï¼ˆè‡ªåŠ¨åŠ è½½ï¼Œæ— éœ€ load) + gameabc_face.spineMgr.setPosition("mj_gangshangkaihua", 640, 500); + gameabc_face.spineMgr.setAnimation("mj_gangshangkaihua", "animation", true); +}; + +// gameenddraw ä¿æŒåŽŸæ ·ï¼ŒSpine 渲染由 SpineMgr.js è‡ªåŠ¨å¤„ç† +gameabc_face.gameenddraw = function(gameid, spid, times, timelong) { + // 这里写其他自定义绘制逻辑,或留空 +}; + +gameabc_face.mousedown = function(gameid, spid, downx, downy) { + // ç‚¹å‡»æ’æ”¾åŠ¨ç”» + gameabc_face.spineMgr.setAnimation("mj_gangshangkaihua", "animation", false); +}; +``` + +> **é‡è¦**:`SpineMgr.js` 是独立文件,通过 `Object.defineProperty` 自动拦截 `gameenddraw`, +> æ— è®º `gamemain.js` 如何定义 `gameenddraw`,Spine æ¸²æŸ“éƒ½ä¼šè‡ªåŠ¨è¿½åŠ åœ¨å…¶åŽæ‰§è¡Œã€‚ +> `gamemain.js` 完全ä¸éœ€è¦ä¿®æ”¹ã€‚ + +--- + +> **å‚考链接** +> - Spine 官方è¿è¡Œæ—¶æ–‡æ¡£: https://zh.esotericsoftware.com/spine-api-reference +> - Spine Player 在线演示: https://jp.esotericsoftware.com/spine-player +> - spine-canvas npm 包: https://www.npmjs.com/package/@esotericsoftware/spine-canvas diff --git a/codes/games/client/Projects/Game_Surface_3/generated/spine_assets.js b/codes/games/client/Projects/Game_Surface_3/generated/spine_assets.js new file mode 100644 index 0000000..6866ab1 --- /dev/null +++ b/codes/games/client/Projects/Game_Surface_3/generated/spine_assets.js @@ -0,0 +1,4 @@ +// Spine resource list (auto-generated, do not edit manually) +gameabc_face.spineAssets = [ + "gamestart" +]; diff --git a/codes/games/client/Projects/Game_Surface_3/generated/spine_data.js b/codes/games/client/Projects/Game_Surface_3/generated/spine_data.js new file mode 100644 index 0000000..26135da --- /dev/null +++ b/codes/games/client/Projects/Game_Surface_3/generated/spine_data.js @@ -0,0 +1,5 @@ +// Spine text data (auto-generated, do not edit manually) +// Embeds .json/.atlas content into JS to bypass file:// XHR CORS +gameabc_face.spineTextData = {}; +gameabc_face.spineTextData['gamestart.json'] = '{"skeleton":{"hash":"Cs22lzcwV3A","spine":"4.2.43","x":-862.3,"y":-188.35,"width":1724.6,"height":375.11,"images":"./0/","audio":"I:\\\\游æˆç´ ææ”¶é›†\\\\棋牌\\\\é—²æ¥æ–—地主\\\\spine\\\\UI\\\\pipei_fx"},"bones":[{"name":"root"},{"name":"loading","parent":"root"},{"name":"pipeizhong","parent":"root"},{"name":"zhong","parent":"pipeizhong","length":35.15,"rotation":88.12,"x":97.58,"y":5.54},{"name":"pi","parent":"pipeizhong","x":-86.85,"y":2.78},{"name":"pei","parent":"pipeizhong","x":0.58,"y":-3.86},{"name":"lizi","parent":"root","length":9.44,"rotation":5.19,"x":187.44,"y":25.51},{"name":"lizi2","parent":"root","length":9.44,"rotation":5.19,"x":-235.41,"y":-103.34,"scaleX":0.9,"scaleY":0.9},{"name":"lizi3","parent":"root","length":9.44,"rotation":5.19,"x":91.71,"y":-113.98,"scaleX":0.8,"scaleY":0.8},{"name":"lizi4","parent":"root","length":9.44,"rotation":5.19,"x":-202.78,"y":94.66},{"name":"lizi5","parent":"root","length":9.44,"rotation":5.19,"x":167.97,"y":36.8,"scaleX":0.5,"scaleY":0.5},{"name":"lizi6","parent":"root","length":9.44,"rotation":5.19,"x":-162.19,"y":6.78,"scaleX":0.5,"scaleY":0.5},{"name":"taoxin_zong","parent":"root"},{"name":"glow_y","parent":"root"},{"name":"fangkuai","parent":"root","length":28.56,"x":343.36,"y":-3.03,"scaleX":0.8,"scaleY":0.8},{"name":"tiao_new","parent":"root"},{"name":"heitao","parent":"tiao_new"},{"name":"heitao2","parent":"tiao_new"},{"name":"lizi7","parent":"root","length":9.44,"rotation":5.19,"x":60.86,"y":77.88},{"name":"lizi8","parent":"root","length":9.44,"rotation":5.19,"x":-73.19,"y":-90.44,"scaleX":1.5,"scaleY":1.5},{"name":"glow_y2","parent":"root"},{"name":"star","parent":"root","length":17.48,"x":14.55,"y":40.7},{"name":"fangkuai2","parent":"root","length":28.56,"x":343.36,"y":-3.03,"scaleX":0.4,"scaleY":0.4},{"name":"fangkuai3","parent":"root","length":28.56,"x":343.36,"y":-3.03,"scaleX":0.6,"scaleY":0.6},{"name":"fangkuai4","parent":"root","length":28.56,"x":343.36,"y":-3.03,"scaleX":0.7,"scaleY":0.7},{"name":"lizi9","parent":"root","length":9.44,"rotation":5.19,"x":-92.32,"y":75.72,"scaleX":1.2,"scaleY":1.2},{"name":"fangkuai5","parent":"root","length":28.56,"x":343.36,"y":-3.03,"scaleX":0.6,"scaleY":0.6},{"name":"fangkuai6","parent":"root","length":28.56,"x":343.36,"y":-3.03,"scaleX":0.4,"scaleY":0.4},{"name":"fangkuai7","parent":"root","length":28.56,"x":343.36,"y":-3.03,"scaleX":0.5,"scaleY":0.5},{"name":"fangkuai8","parent":"root","length":28.56,"x":343.36,"y":-3.03},{"name":"fangkuai9","parent":"root","length":28.56,"x":343.36,"y":-3.03,"scaleX":0.8,"scaleY":0.8},{"name":"star4","parent":"root","length":17.48,"x":202.79,"y":-34.6},{"name":"lizi10","parent":"root","length":9.44,"rotation":5.19,"x":-179.89,"y":22.58,"scaleX":0.5,"scaleY":0.5},{"name":"glow_bian","parent":"tiao_new"},{"name":"glow_bian2","parent":"tiao_new"},{"name":"success2","parent":"root"},{"name":"dian","parent":"pipeizhong","x":203.82,"y":-32.74},{"name":"dian2","parent":"pipeizhong","x":203.82,"y":-32.74},{"name":"dian3","parent":"pipeizhong","x":203.82,"y":-32.74},{"name":"tiao","parent":"tiao_new","scaleX":1.2928}],"slots":[{"name":"BG","bone":"root"},{"name":"ck_new","bone":"root"},{"name":"new_tiao_orange","bone":"tiao","attachment":"new_tiao_orange"},{"name":"heitao_01","bone":"heitao","attachment":"heitao_01"},{"name":"heitao_2","bone":"heitao2","attachment":"heitao_02"},{"name":"glow_bian","bone":"glow_bian","blend":"additive"},{"name":"glow_bian2","bone":"glow_bian2","blend":"additive"},{"name":"loading_aixin","bone":"loading"},{"name":"pi","bone":"pi","attachment":"pi"},{"name":"pei","bone":"pei","attachment":"pei"},{"name":"zhong","bone":"zhong","attachment":"zhong"},{"name":"lizi_1","bone":"lizi","attachment":"lizi_1","blend":"additive"},{"name":"lizi_7","bone":"lizi7","attachment":"lizi_1","blend":"additive"},{"name":"lizi_9","bone":"lizi9","attachment":"lizi_1","blend":"additive"},{"name":"lizi_5","bone":"lizi5","attachment":"lizi_1","blend":"additive"},{"name":"lizi_10","bone":"lizi10","attachment":"lizi_1","blend":"additive"},{"name":"lizi_6","bone":"lizi6","attachment":"lizi_1","blend":"additive"},{"name":"lizi_3","bone":"lizi3","attachment":"lizi_1","blend":"additive"},{"name":"lizi_4","bone":"lizi4","attachment":"lizi_1","blend":"additive"},{"name":"lizi_8","bone":"lizi8","attachment":"lizi_1","blend":"additive"},{"name":"lizi_2","bone":"lizi2","attachment":"lizi_1","blend":"additive"},{"name":"lamp_glow3","bone":"glow_y","attachment":"lamp_glow","blend":"additive"},{"name":"fangkuai6","bone":"fangkuai","attachment":"fangkuai","blend":"additive"},{"name":"fangkuai5","bone":"fangkuai5","attachment":"fangkuai","blend":"additive"},{"name":"fangkuai4","bone":"fangkuai4","attachment":"fangkuai","blend":"additive"},{"name":"fangkuai11","bone":"fangkuai8","attachment":"fangkuai","blend":"additive"},{"name":"fangkuai12","bone":"fangkuai9","attachment":"fangkuai","blend":"additive"},{"name":"fangkuai2","bone":"fangkuai2","blend":"additive"},{"name":"fangkuai7","bone":"fangkuai6","attachment":"fangkuai","blend":"additive"},{"name":"fangkuai3","bone":"fangkuai3","blend":"additive"},{"name":"fangkuai9","bone":"fangkuai7","attachment":"fangkuai","blend":"additive"},{"name":"fangkuai_kuang6","bone":"fangkuai","attachment":"fangkuai_kuang","blend":"screen"},{"name":"fangkuai_kuang5","bone":"fangkuai5","attachment":"fangkuai_kuang","blend":"screen"},{"name":"fangkuai_kuang4","bone":"fangkuai4","attachment":"fangkuai_kuang","blend":"screen"},{"name":"fangkuai_kuang11","bone":"fangkuai8","attachment":"fangkuai_kuang","blend":"screen"},{"name":"fangkuai_kuang12","bone":"fangkuai9","attachment":"fangkuai_kuang","blend":"screen"},{"name":"fangkuai_kuang2","bone":"fangkuai2","attachment":"fangkuai_kuang","blend":"screen"},{"name":"fangkuai_kuang7","bone":"fangkuai6","attachment":"fangkuai_kuang","blend":"screen"},{"name":"fangkuai_kuang3","bone":"fangkuai3","attachment":"fangkuai_kuang","blend":"screen"},{"name":"fangkuai_kuang9","bone":"fangkuai7","attachment":"fangkuai_kuang","blend":"screen"},{"name":"duijukaishi","bone":"success2","attachment":"duijukaishi"},{"name":"duijukaishi2","bone":"success2","attachment":"duijukaishi","blend":"additive"},{"name":"lamp_glow4","bone":"glow_y2","attachment":"lamp_glow","blend":"additive"},{"name":"lamp_glow5","bone":"glow_y2","attachment":"lamp_glow","blend":"additive"},{"name":"star2","bone":"star","attachment":"xingguang","blend":"additive"},{"name":"star8","bone":"star4","attachment":"xingguang","blend":"additive"},{"name":"dian","bone":"dian","attachment":"dian"},{"name":"dian2","bone":"dian2","attachment":"dian"},{"name":"dian3","bone":"dian3","attachment":"dian"},{"name":"ck_waiting","bone":"root","color":"ffffff86"}],"skins":[{"name":"default","attachments":{"dian":{"dian":{"x":0.27,"y":1.25,"width":24,"height":22}},"dian2":{"dian":{"x":0.27,"y":1.25,"width":24,"height":22}},"dian3":{"dian":{"x":0.27,"y":1.25,"width":24,"height":22}},"duijukaishi":{"duijukaishi":{"width":380,"height":92}},"duijukaishi2":{"duijukaishi":{"width":380,"height":92}},"fangkuai2":{"fangkuai":{"width":32,"height":32}},"fangkuai3":{"fangkuai":{"width":32,"height":32}},"fangkuai4":{"fangkuai":{"width":32,"height":32}},"fangkuai5":{"fangkuai":{"width":32,"height":32}},"fangkuai6":{"fangkuai":{"width":32,"height":32}},"fangkuai7":{"fangkuai":{"width":32,"height":32}},"fangkuai9":{"fangkuai":{"width":32,"height":32}},"fangkuai11":{"fangkuai":{"width":32,"height":32}},"fangkuai12":{"fangkuai":{"width":32,"height":32}},"fangkuai_kuang2":{"fangkuai_kuang":{"width":32,"height":32}},"fangkuai_kuang3":{"fangkuai_kuang":{"width":32,"height":32}},"fangkuai_kuang4":{"fangkuai_kuang":{"width":32,"height":32}},"fangkuai_kuang5":{"fangkuai_kuang":{"width":32,"height":32}},"fangkuai_kuang6":{"fangkuai_kuang":{"width":32,"height":32}},"fangkuai_kuang7":{"fangkuai_kuang":{"width":32,"height":32}},"fangkuai_kuang9":{"fangkuai_kuang":{"width":32,"height":32}},"fangkuai_kuang11":{"fangkuai_kuang":{"width":32,"height":32}},"fangkuai_kuang12":{"fangkuai_kuang":{"width":32,"height":32}},"glow_bian":{"glow_bian":{"x":422.12,"y":-69.57,"scaleX":1.2,"scaleY":0.6,"width":330,"height":9}},"glow_bian2":{"glow_bian":{"x":422.12,"y":64.41,"scaleX":1.2,"scaleY":0.6,"width":330,"height":9}},"heitao_01":{"heitao_01":{"y":-1.9,"width":236,"height":218}},"heitao_2":{"heitao_02":{"y":-2.2,"width":442,"height":219}},"lamp_glow3":{"lamp_glow":{"x":-1.8,"y":-0.8,"scaleX":2.0276,"scaleY":2.0276,"width":198,"height":185}},"lamp_glow4":{"lamp_glow":{"x":-1.8,"y":-0.8,"scaleX":2.0276,"scaleY":2.0276,"width":198,"height":185}},"lamp_glow5":{"lamp_glow":{"x":-1.8,"y":-0.8,"scaleX":2.0276,"width":198,"height":185}},"lizi_1":{"lizi_1":{"x":0.05,"y":0.07,"rotation":-5.19,"width":19,"height":19}},"lizi_2":{"lizi_1":{"x":0.05,"y":0.07,"rotation":-5.19,"width":19,"height":19}},"lizi_3":{"lizi_1":{"x":0.05,"y":0.07,"rotation":-5.19,"width":19,"height":19}},"lizi_4":{"lizi_1":{"x":0.05,"y":0.07,"rotation":-5.19,"width":19,"height":19}},"lizi_5":{"lizi_1":{"x":0.05,"y":0.07,"rotation":-5.19,"width":19,"height":19}},"lizi_6":{"lizi_1":{"x":0.05,"y":0.07,"rotation":-5.19,"width":19,"height":19}},"lizi_7":{"lizi_1":{"x":0.05,"y":0.07,"rotation":-5.19,"width":19,"height":19}},"lizi_8":{"lizi_1":{"x":0.05,"y":0.07,"rotation":-5.19,"width":19,"height":19}},"lizi_9":{"lizi_1":{"x":0.05,"y":0.07,"rotation":-5.19,"width":19,"height":19}},"lizi_10":{"lizi_1":{"x":0.05,"y":0.07,"rotation":-5.19,"width":19,"height":19}},"loading_aixin":{"loading_aixin":{"x":103.12,"y":81.11,"width":28,"height":28}},"new_tiao_orange":{"new_tiao_orange":{"y":-2.26,"scaleX":2,"width":667,"height":217}},"pei":{"dai":{"x":5.24,"y":2.96,"width":96,"height":90},"pei":{"x":3.04,"y":2.96,"width":105,"height":92}},"pi":{"deng":{"x":-1.03,"y":-4.17,"width":101,"height":90},"pi":{"x":-1.03,"y":-4.17,"width":104,"height":89}},"star2":{"xingguang":{"x":0.34,"scaleX":0.3,"scaleY":0.3,"width":256,"height":256}},"star8":{"xingguang":{"scaleX":0.2,"scaleY":0.2,"width":256,"height":256}},"zhong":{"zhong":{"x":-6.91,"y":-0.76,"rotation":-88.12,"width":98,"height":93}}}}],"animations":{"start":{"slots":{"duijukaishi":{"rgba":[{"color":"ffffff00","curve":"stepped"},{"time":0.1667,"color":"ffffff00"},{"time":0.3,"color":"ffffffff"}]},"duijukaishi2":{"rgba":[{"color":"ffffff00","curve":"stepped"},{"time":0.3,"color":"ffffff00"},{"time":0.3333,"color":"ffffffff","curve":"stepped"},{"time":0.4,"color":"ffffffff"},{"time":0.6667,"color":"ffffff00"}]},"fangkuai2":{"rgba":[{"time":0.7,"color":"ffffffff"},{"time":0.8333,"color":"ffffff00"}],"attachment":[{"time":0.4667,"name":"fangkuai"},{"time":0.6}]},"fangkuai3":{"rgba":[{"time":0.6333,"color":"ffffffff"},{"time":0.8667,"color":"ffffff00"}],"attachment":[{"time":0.6333,"name":"fangkuai"},{"time":0.7667}]},"fangkuai4":{"rgba":[{"time":0.4333,"color":"ffffffff"},{"time":0.6667,"color":"ffffff00"}],"attachment":[{"time":0.3},{"time":0.4333,"name":"fangkuai"}]},"fangkuai5":{"rgba":[{"time":0.5333,"color":"ffffffff"},{"time":0.7667,"color":"ffffff00"}],"attachment":[{"time":0.4},{"time":0.5333,"name":"fangkuai"}]},"fangkuai6":{"rgba":[{"time":0.5333,"color":"ffffffff"},{"time":0.7667,"color":"ffffff00"}],"attachment":[{"time":0.5333},{"time":0.7,"name":"fangkuai"}]},"fangkuai7":{"rgba":[{"time":0.7,"color":"ffffffff"},{"time":0.8333,"color":"ffffff00"}],"attachment":[{"time":0.6}]},"fangkuai9":{"rgba":[{"time":0.6333,"color":"ffffffff"},{"time":0.8667,"color":"ffffff00"}],"attachment":[{"time":0.5},{"time":0.6333,"name":"fangkuai"}]},"fangkuai11":{"rgba":[{"time":0.4333,"color":"ffffffff"},{"time":0.6667,"color":"ffffff00"}],"attachment":[{"time":0.2667},{"time":0.4,"name":"fangkuai"},{"time":0.5333}]},"fangkuai12":{"rgba":[{"time":0.7333,"color":"ffffffff"},{"time":0.9667,"color":"ffffff00"}],"attachment":[{"time":0.5667},{"time":0.7,"name":"fangkuai"},{"time":0.8333}]},"fangkuai_kuang2":{"rgba":[{"time":0.7,"color":"ffffffff"},{"time":0.8333,"color":"ffffff00"}]},"fangkuai_kuang3":{"rgba":[{"time":0.6333,"color":"ffffffff"},{"time":0.8667,"color":"ffffff00"}]},"fangkuai_kuang4":{"rgba":[{"time":0.4333,"color":"ffffffff"},{"time":0.6667,"color":"ffffff00"}]},"fangkuai_kuang5":{"rgba":[{"time":0.5333,"color":"ffffffff"},{"time":0.7667,"color":"ffffff00"}]},"fangkuai_kuang6":{"rgba":[{"time":0.5333,"color":"ffffffff"},{"time":0.7667,"color":"ffffff00"}]},"fangkuai_kuang7":{"rgba":[{"time":0.7,"color":"ffffffff"},{"time":0.8333,"color":"ffffff00"}]},"fangkuai_kuang9":{"rgba":[{"time":0.6333,"color":"ffffffff"},{"time":0.8667,"color":"ffffff00"}]},"fangkuai_kuang11":{"rgba":[{"time":0.4333,"color":"ffffffff"},{"time":0.6667,"color":"ffffff00"}]},"fangkuai_kuang12":{"rgba":[{"time":0.7333,"color":"ffffffff"},{"time":0.9667,"color":"ffffff00"}]},"glow_bian":{"rgba":[{"time":0.7667,"color":"ffffffff"},{"time":0.9,"color":"ffffff00"}],"attachment":[{"time":0.3667,"name":"glow_bian"}]},"glow_bian2":{"rgba":[{"time":0.7667,"color":"ffffffff"},{"time":0.9,"color":"ffffff00"}],"attachment":[{"time":0.3667,"name":"glow_bian"}]},"heitao_01":{"rgba":[{"color":"ffffff00","curve":"stepped"},{"time":0.2,"color":"ffffff00","curve":[0.242,1,0.325,1,0.242,1,0.325,1,0.242,1,0.325,1,0.242,0,0.325,1]},{"time":0.3667,"color":"ffffffff"}]},"heitao_2":{"rgba":[{"color":"ffffff00","curve":"stepped"},{"time":0.3,"color":"ffffff00","curve":[0.342,1,0.425,1,0.342,1,0.425,1,0.342,1,0.425,1,0.342,0,0.425,1]},{"time":0.4667,"color":"ffffffff"}]},"lamp_glow3":{"rgba":[{"color":"ffffffb4","curve":"stepped"},{"time":0.0667,"color":"ffffffb4"},{"time":0.2,"color":"ffffff00"}],"attachment":[{}]},"lamp_glow4":{"rgba":[{"color":"ffffffb4","curve":"stepped"},{"time":0.4,"color":"ffffffb4"},{"time":0.5,"color":"ffffff00"}]},"lamp_glow5":{"rgba":[{"color":"ffffffb4","curve":"stepped"},{"time":0.4,"color":"ffffffb4"},{"time":0.5,"color":"ffffff00"}]},"lizi_7":{"rgba":[{"color":"ffdf63ff"}]},"lizi_8":{"rgba":[{"color":"ffdf63ff"}]},"lizi_9":{"rgba":[{"color":"ffdf64ff"}]},"lizi_10":{"attachment":[{}]},"new_tiao_orange":{"rgba":[{"color":"ffffff00","curve":"stepped"},{"time":0.0667,"color":"ffffff00"},{"time":0.1333,"color":"ffffffff"}]},"pei":{"attachment":[{"name":"dai"}]},"pi":{"attachment":[{"name":"deng"}]},"star2":{"attachment":[{},{"time":0.4333,"name":"xingguang"},{"time":0.7667}]},"star8":{"attachment":[{},{"time":0.6,"name":"xingguang"}]}},"bones":{"fangkuai5":{"rotate":[{"time":0.3},{"time":0.7667,"value":-44.88}],"translate":[{"x":-504.35,"y":11.18,"curve":"stepped"},{"time":0.3,"x":-504.35,"y":11.18},{"time":0.7667,"x":-599.14,"y":28.32}],"scale":[{"x":0,"y":0,"curve":"stepped"},{"time":0.3,"x":0,"y":0},{"time":0.4},{"time":0.5333,"x":0.5,"y":0.5},{"time":0.6333},{"time":0.7667,"x":0.5,"y":0.5}]},"fangkuai6":{"rotate":[{"value":-44.88,"curve":"stepped"},{"time":0.3667,"value":-44.88},{"time":0.8333}],"translate":[{"x":-517.09,"y":-15.18,"curve":"stepped"},{"time":0.3667,"x":-517.09,"y":-15.18},{"time":0.8333,"x":-624.16,"y":-31.78}],"scale":[{"x":0,"y":0,"curve":"stepped"},{"time":0.3667,"x":0,"y":0},{"time":0.4667},{"time":0.6,"x":0.5,"y":0.5},{"time":0.7},{"time":0.8333,"x":0.5,"y":0.5}]},"fangkuai7":{"rotate":[{"value":30,"curve":"stepped"},{"time":0.4,"value":30},{"time":0.8667,"value":-90}],"translate":[{"x":-498.9,"y":4.26,"curve":"stepped"},{"time":0.4,"x":-498.9,"y":4.26},{"time":0.8667,"x":-570.14,"y":-1.69}],"scale":[{"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0},{"time":0.5},{"time":0.6333,"x":0.5,"y":0.5},{"time":0.7333},{"time":0.8667,"x":0.5,"y":0.5}]},"success2":{"scale":[{"x":2.7,"y":2.2,"curve":"stepped"},{"time":0.1667,"x":2.7,"y":2.2},{"time":0.2,"x":2.51,"y":1.363},{"time":0.2333,"x":2.32,"y":1.92},{"time":0.3333,"x":0.8,"y":0.8},{"time":0.5,"x":1.06,"y":1.06},{"time":0.6667}]},"glow_y2":{"scale":[{"x":0,"y":0,"curve":"stepped"},{"time":0.2667,"x":0,"y":0},{"time":0.3333,"x":1.5,"y":1.2},{"time":0.5,"x":2,"y":0}]},"pei":{"translate":[{"x":-40.85}]},"star":{"rotate":[{"time":0.4333},{"time":0.7667,"value":-60}],"translate":[{"x":1.77,"y":0.73}],"scale":[{"time":0.4333},{"time":0.7667,"x":0,"y":0}]},"fangkuai3":{"rotate":[{"value":30,"curve":"stepped"},{"time":0.4,"value":30},{"time":0.8667,"value":-90}],"translate":[{"x":-148.5,"y":26.53,"curve":"stepped"},{"time":0.4,"x":-148.5,"y":26.53},{"time":0.8667,"x":-28.24,"y":27.97}],"scale":[{"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0},{"time":0.5},{"time":0.6333,"x":0.5,"y":0.5},{"time":0.7333},{"time":0.8667,"x":0.5,"y":0.5}]},"fangkuai2":{"rotate":[{"value":-44.88,"curve":"stepped"},{"time":0.3667,"value":-44.88},{"time":0.8333}],"translate":[{"x":-169.32,"y":-17.49,"curve":"stepped"},{"time":0.3667,"x":-169.32,"y":-17.49},{"time":0.8333,"x":-73.95,"y":-28.46}],"scale":[{"x":0,"y":0,"curve":"stepped"},{"time":0.3667,"x":0,"y":0},{"time":0.4667},{"time":0.6,"x":0.5,"y":0.5},{"time":0.7},{"time":0.8333,"x":0.5,"y":0.5}]},"fangkuai4":{"rotate":[{"time":0.2},{"time":0.6667,"value":-44.88}],"translate":[{"x":-135.94,"y":12.14,"curve":"stepped"},{"time":0.2,"x":-135.94,"y":12.14},{"time":0.6667,"x":0.5,"y":13.65}],"scale":[{"x":0,"y":0,"curve":"stepped"},{"time":0.2,"x":0,"y":0},{"time":0.3},{"time":0.4333,"x":0.5,"y":0.5},{"time":0.5333},{"time":0.6667,"x":0.5,"y":0.5}]},"star4":{"rotate":[{"value":-60,"curve":"stepped"},{"time":0.6,"value":-60},{"time":0.9333}],"translate":[{"x":-23.34,"y":-3.43}],"scale":[{"time":0.6},{"time":0.9333,"x":0,"y":0}]},"glow_y":{"scale":[{"x":0,"y":0},{"time":0.0667,"y":1.3},{"time":0.2,"x":2,"y":0}]},"fangkuai9":{"rotate":[{"time":0.5},{"time":0.9667,"value":-44.88}],"translate":[{"x":-510.8,"y":-9.98,"curve":"stepped"},{"time":0.5,"x":-510.8,"y":-9.98},{"time":0.9667,"x":-682.69,"y":-0.2}],"scale":[{"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0},{"time":0.6},{"time":0.7333,"x":0.5,"y":0.5},{"time":0.8333},{"time":0.9667,"x":0.5,"y":0.5}]},"lizi9":{"translate":[{"x":23.12,"y":-46.87,"curve":"stepped"},{"time":0.1333,"x":23.12,"y":-46.87},{"time":0.8,"x":-32.53,"y":36.07}],"scale":[{"x":0,"y":0,"curve":"stepped"},{"time":0.1333,"x":0,"y":0},{"time":0.3},{"time":0.4667,"x":0,"y":0},{"time":0.6333},{"time":0.8,"x":0,"y":0}]},"lizi7":{"translate":[{"x":27.53,"y":-8.06},{"time":0.9667,"x":78.87,"y":21.58}],"scale":[{"x":0,"y":0},{"time":0.1333},{"time":0.3,"x":0,"y":0},{"time":0.4667},{"time":0.6333,"x":0,"y":0},{"time":0.8},{"time":0.9667,"x":0,"y":0}]},"lizi8":{"translate":[{"x":40.95,"y":12.56},{"time":0.6333,"x":4.64,"y":-14.33}],"scale":[{"x":0,"y":0},{"time":0.1333},{"time":0.3,"x":0,"y":0},{"time":0.4667},{"time":0.6333,"x":0,"y":0}]},"glow_bian":{"translate":[{"x":-72.21,"curve":"stepped"},{"time":0.3667,"x":-72.21,"curve":[0.5,-72.21,0.767,-804.76,0.5,0,0.767,0]},{"time":0.9,"x":-804.76}]},"heitao":{"scale":[{"x":3,"curve":"stepped"},{"time":0.2,"x":3,"curve":[0.242,3,0.325,0.8,0.242,1,0.325,1]},{"time":0.3667,"x":0.8,"curve":[0.408,0.8,0.492,1.4,0.408,1,0.492,1]},{"time":0.5333,"x":1.4,"curve":[0.583,1.4,0.683,1,0.583,1,0.683,1]},{"time":0.7333}]},"glow_bian2":{"translate":[{"x":-656,"curve":"stepped"},{"time":0.3667,"x":-656,"curve":[0.5,-656,0.767,97.85,0.5,0,0.767,0]},{"time":0.9,"x":97.85}]},"pi":{"translate":[{"x":-41.74}]},"fangkuai8":{"rotate":[{"time":0.2},{"time":0.6667,"value":-44.88}],"translate":[{"x":-535.78,"y":-2.96,"curve":"stepped"},{"time":0.2,"x":-535.78,"y":-2.96},{"time":0.6667,"x":-641.17,"y":-6.75}],"scale":[{"x":0,"y":0,"curve":"stepped"},{"time":0.2,"x":0,"y":0},{"time":0.3},{"time":0.4333,"x":0.5,"y":0.5},{"time":0.5333},{"time":0.6667,"x":0.5,"y":0.5}]},"fangkuai":{"rotate":[{"time":0.3},{"time":0.7667,"value":-44.88}],"translate":[{"x":-153,"curve":"stepped"},{"time":0.3,"x":-153},{"time":0.7667,"x":-13.01}],"scale":[{"x":0,"y":0,"curve":"stepped"},{"time":0.3,"x":0,"y":0},{"time":0.4},{"time":0.5333,"x":0.5,"y":0.5},{"time":0.6333},{"time":0.7667,"x":0.5,"y":0.5}]},"heitao2":{"scale":[{"x":3,"curve":"stepped"},{"time":0.3,"x":3,"curve":[0.342,3,0.425,0.8,0.342,1,0.425,1]},{"time":0.4667,"x":0.8,"curve":[0.508,0.8,0.592,1.4,0.508,1,0.592,1]},{"time":0.6333,"x":1.4,"curve":[0.683,1.4,0.783,1,0.683,1,0.783,1]},{"time":0.8333}]},"lizi":{"scale":[{"x":0,"y":0}]},"lizi2":{"translate":[{"x":-3.71,"y":-20.79}],"scale":[{"x":0,"y":0}]},"lizi3":{"translate":[{"x":39.37,"y":-38.75}],"scale":[{"x":0,"y":0}]},"lizi4":{"scale":[{"x":0,"y":0}]},"lizi5":{"translate":[{"x":27.61,"y":27.45}],"scale":[{"x":0,"y":0}]},"lizi6":{"translate":[{"x":-51.66,"y":-60.09}],"scale":[{"x":0,"y":0}]},"pipeizhong":{"scale":[{},{"time":0.1,"x":0,"y":0}]},"tiao_new":{"scale":[{"x":0,"y":0,"curve":"stepped"},{"time":0.0667,"x":0,"y":0},{"time":0.1333,"y":0.1},{"time":0.2333,"y":1.3},{"time":0.3667,"y":0.9},{"time":0.5}]},"zhong":{"translate":[{"x":-41.29}]},"dian":{"translate":[{"x":-83.49,"y":2.22}]},"dian2":{"translate":[{"x":-57.12,"y":2.22}]},"dian3":{"translate":[{"x":-31.53,"y":2.22}]}}}}}'; +gameabc_face.spineTextData['gamestart.atlas'] = 'gamestart.png\nsize:2048,512\nfilter:Linear,Linear\ndai\nbounds:1521,395,96,90\ndeng\nbounds:1418,395,101,90\ndian\nbounds:1167,183,24,22\nduijukaishi\nbounds:929,393,380,92\nfangkuai\nbounds:446,47,32,32\nfangkuai_kuang\nbounds:2,2,32,32\nglow_bian\nbounds:2,36,330,9\nheitao_01\nbounds:929,173,236,218\nheitao_02\nbounds:2,47,442,219\nlamp_glow\nbounds:446,81,198,185\nlizi_1\nbounds:646,247,19,19\nloading_aixin\nbounds:1273,363,28,28\nnew_tiao_orange\nbounds:2,268,667,217\npei\nbounds:1311,393,105,92\npi\nbounds:1167,302,104,89\nxingguang\nbounds:671,229,256,256\nzhong\nbounds:1167,207,98,93\n'; diff --git a/codes/games/client/Projects/Game_Surface_3/index.html b/codes/games/client/Projects/Game_Surface_3/index.html index 848c1c2..9b80c86 100644 --- a/codes/games/client/Projects/Game_Surface_3/index.html +++ b/codes/games/client/Projects/Game_Surface_3/index.html @@ -1,144 +1,125 @@ +
- - - - - -