删除hook,框架改动
This commit is contained in:
@@ -2,7 +2,10 @@
|
||||
|
||||
> 本手册针对 **gameabc 引擎** 的 Spine 项目,说明如何在 Canvas 2D 游戏中加载、
|
||||
> 控制和管理 Spine 骨骼动画。
|
||||
> 运行时版本:**spine-canvas 4.2** | 引擎:**gameabc**
|
||||
> 运行时版本:**Spine 4.2**,`spine-webgl` 与 `spine-canvas` 二选一 —— `index.html`
|
||||
> 会先探测 WebGL 能力,只加载其中一套(两者暴露同一个全局名 `spine`,同时加载会互相覆盖);
|
||||
> WebGL 可用时走叠加层渲染,否则回落 Canvas 2D。上层调用方式两者完全一致。
|
||||
> 引擎:**gameabc**
|
||||
|
||||
---
|
||||
|
||||
@@ -27,7 +30,8 @@
|
||||
Projects/Spine/
|
||||
├── index.html ← 入口 HTML
|
||||
├── js/
|
||||
│ ├── spine-canvas.js ← Spine Canvas 2D 运行时 (第三方库)
|
||||
│ ├── spine-webgl.js ← Spine WebGL 运行时 (第三方库,探测后二选一)
|
||||
│ ├── spine-canvas.js ← Spine Canvas 2D 运行时 (第三方库,探测后二选一)
|
||||
│ ├── gameabc.min.js ← gameabc 游戏引擎
|
||||
│ ├── SpineMgr.js ← ★ Spine 动画管理器(独立文件,自动挂钩渲染)
|
||||
│ ├── gamemain.js ← 游戏主逻辑(无需修改)
|
||||
@@ -48,7 +52,7 @@ Projects/Spine/
|
||||
|
||||
| 文件 | 作用 | 需要修改 |
|
||||
|------|------|----------|
|
||||
| `js/spine-canvas.js` | Spine 4.2 Canvas 渲染运行时 | ✗ 不要修改 |
|
||||
| `js/spine-webgl.js` / `js/spine-canvas.js` | Spine 4.2 运行时,`index.html` 探测后**只加载一套** | ✗ 不要修改 |
|
||||
| `js/SpineMgr.js` | Spine 动画管理器,自动初始化+自动渲染 | ✗ 不需要修改 |
|
||||
| `js/gamemain.js` | 游戏主逻辑(保持原样) | ✗ 不需要修改 |
|
||||
| `js/Spine_Event.js` | Spine 动画完成/自定义事件回调 | ✓ 处理动画事件 |
|
||||
@@ -593,15 +597,19 @@ gameabc_face.mouseup = function(gameid, spid_down, downx, downy, spid_up, upx, u
|
||||
gameabc_face.spineMgr.setAnimation("hero", "idle", true);
|
||||
};
|
||||
|
||||
// ⚠️ 不要直读 spineMgr._entries[...]:entry 表是 SpineMgr 的内部状态,
|
||||
// 调用方自己维护业务坐标,并用 ensureEntry 保证 entry 存在即可。
|
||||
var heroX = 640, heroY = 360;
|
||||
|
||||
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);
|
||||
}
|
||||
mgr.ensureEntry("hero", "hero.json", "hero.atlas", { scale: 1 });
|
||||
heroX += offmovex;
|
||||
heroY += offmovey;
|
||||
mgr.setPosition("hero", heroX, heroY);
|
||||
// 根据移动方向翻转
|
||||
mgr.setFlip("hero", offmovex < 0, false);
|
||||
};
|
||||
```
|
||||
|
||||
@@ -742,7 +750,7 @@ gameabc_face.gamemydraw = function(gameid, spid, times, timelong) {
|
||||
3. **打开浏览器控制台(F12)看报错**
|
||||
- 404 错误:文件路径有误
|
||||
- JSON 解析错误:`.json` 文件格式异常
|
||||
- `spine is not defined`:`spine-canvas.js` 未正确加载
|
||||
- `spine is not defined`:`spine-webgl.js` / `spine-canvas.js` 均未加载(探测脚本未执行或路径错)
|
||||
|
||||
4. **坐标是否在可见范围内?**
|
||||
- 项目设计尺寸为 1280×720,检查 `x` 和 `y` 是否在此范围
|
||||
@@ -762,11 +770,17 @@ gameabc_face.gamemydraw = function(gameid, spid, times, timelong) {
|
||||
|
||||
- 检查 `gameabc_Project` 中的 `fps` 设置(默认 30)
|
||||
- SpineMgr 内部是用 `Date.now()` 计算真实时间差的,不依赖帧率
|
||||
- 如果需要倍速播放,修改 `state.timeScale`:
|
||||
- 如果需要倍速播放,用 `setAnimation` 的返回值(Spine 的 TrackEntry)改 `timeScale`:
|
||||
```javascript
|
||||
var entry = gameabc_face.spineMgr._entries["hero"];
|
||||
entry.state.timeScale = 2.0; // 2 倍速
|
||||
var mgr = gameabc_face.spineMgr;
|
||||
mgr.ensureEntry("hero", "hero.json", "hero.atlas", { scale: 1 });
|
||||
var track = mgr.setAnimation("hero", "run", true);
|
||||
if (track) { track.timeScale = 2.0; } // 2 倍速
|
||||
// 资源尚未就绪时 setAnimation 会把命令排队并返回 null,下一帧就绪后自动执行
|
||||
```
|
||||
⚠️ 不要直读 `spineMgr._entries[...]` 拿 `state` —— entry 表是 SpineMgr 的内部状态,
|
||||
其生命周期(何时 load / 何时因 scale 变化重建)由 SpineMgr 独占管理,
|
||||
外部持有的引用随时可能失效(如 WebGL context 恢复后整表重建)。
|
||||
|
||||
### Q4: 切换动画时有跳帧
|
||||
|
||||
@@ -778,9 +792,9 @@ gameabc_face.gamemydraw = function(gameid, spid, times, timelong) {
|
||||
- 确认没有同一个 id 加载两次
|
||||
- 检查 `ctx.save()` / `ctx.restore()` 是否配对(SpineMgr 内部已处理)
|
||||
|
||||
### Q6: spine-canvas.js 版本与 Spine 编辑器版本不匹配
|
||||
### Q6: Spine 运行时版本与 Spine 编辑器版本不匹配
|
||||
|
||||
- **spine-canvas.js 4.2** 需搭配 **Spine 编辑器 4.2.x** 导出的数据
|
||||
- **spine-webgl / spine-canvas 4.2** 需搭配 **Spine 编辑器 4.2.x** 导出的数据
|
||||
- 如果使用 Spine 4.1 编辑器,请下载对应版本的运行时:
|
||||
```
|
||||
https://unpkg.com/@esotericsoftware/spine-canvas@4.1/dist/iife/spine-canvas.js
|
||||
@@ -793,13 +807,16 @@ gameabc_face.gamemydraw = function(gameid, spid, times, timelong) {
|
||||
`index.html` 中的 script 标签加载顺序至关重要:
|
||||
|
||||
```
|
||||
1. spine-canvas.js ← 先加载 Spine 运行时 (定义 window.spine)
|
||||
1. spine-webgl.js 或 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 ← 项目配置数据 (引擎初始化)
|
||||
3. SpineOverlayTransform.js / SpineBackendCanvas.js / SpineBackendWebGL.js
|
||||
← 渲染后端,必须在 SpineMgr.js 之前(SpineMgr 末尾会立即执行预加载块)
|
||||
4. SpineMgr.js ← Spine 管理器 + defineProperty 自动挂钩渲染
|
||||
5. gamemain.js ← 游戏主逻辑(不需修改,直接调用 API 即可)
|
||||
6. Spine_Event.js ← Spine 事件回调 (依赖 gameabc_face)
|
||||
7. Project1_Event.js ← 精灵事件
|
||||
8. gameabc_data.min.js ← 项目配置数据 (引擎初始化)
|
||||
```
|
||||
|
||||
> **不能调换顺序**,`SpineMgr.js` 必须在 `gamemain.js` 之前加载,
|
||||
|
||||
Reference in New Issue
Block a user