3.5 KiB
3.5 KiB
runtime — 元景 W-10 运行时执行引擎
用途
W-10 运行时执行引擎 v1:前端 JS 运行时引擎(事件循环 + 实体状态 + 脚本执行)+ 可选服务端辅助。 能力覆盖 W-10a~W-10i:
- W-10a 世界运行时初始化:构建运行态实体树(父子树 + 扁平索引)
- W-10b 实体运行时状态管理(state 机 + 位置/速度)
- W-10c 脚本运行时执行调度(对接 script_engine 编译产物 actions 数组)
- W-10d 事件分发:事件队列 → 路由到对应实体绑定的脚本
- W-10e 定时器管理(tick 驱动,非 setInterval)
- W-10f 碰撞检测(AABB 两两检测 → onCollide)
- W-10g 运行时暂停/恢复/停止
- W-10h 错误处理与降级(捕获不整页崩溃)
- W-10i 独立世界本地引擎(independent 模式,后端不可用仍运行)
数据表
本模块为交互层模块,无自有数据表。服务端辅助只读复用 world 模块数据
(world 表 + 尽力而为的 world_entity/scene 表),库名经 get_module_dbname('world') 获取。
文件结构
runtime/
├── runtime/ Python 包(服务端辅助)
│ ├── __init__.py 导出(三处同步注册之②)
│ ├── init.py load_runtime(env) 注册(三处同步注册之③)
│ └── runtime_service.py 实现(三处同步注册之①)
├── wwwroot/
│ ├── runtime.js 前端核心引擎
│ ├── play.html 游戏运行页(验收入口)
│ ├── index.ui 模块入口页
│ └── api/ load_world / runtime_status / runtime_event / runtime_control .dspy
├── scripts/load_path.py RBAC 路径注册
├── skill/SKILL.md 模块技能文档
├── pyproject.toml 打包配置
└── README.md
安装与集成(宿主 scense 应用)
- 模块包安装:
pip install .(依赖 sqlor、bricks_for_python) - 宿主
app/scense.py:from runtime.init import load_runtime+ init() 内await load_runtime(env) build.sh链接 wwwroot:ln -sf <runtime>/wwwroot/runtime.js scense_app/wwwroot/runtime/- RBAC:执行
scripts/load_path.py(any/logined 分层,无通配符) - 菜单:
index.ui卡片「开始玩」→{{entire_url('/runtime/play.html')}}
验收(9 项)
| # | 验收项 | 操作 | 期望 |
|---|---|---|---|
| 1 | 开始玩初始化实体树 | 打开 play.html 自动启动 | 日志出现「世界初始化完成/降级独立模式」+ 5 个实体绘制 |
| 2 | 点击触发事件执行脚本 | 点击任意实体 | 事件路由日志 + 实体 state 变化 |
| 3 | 定时器按间隔触发 | 等待 3s | box1 每 3s 下移 10px |
| 4 | 脚本抛错降级不崩溃 | 点击「箱子B」 | 错误日志 + 引擎继续运行(错误计数递增) |
| 5 | 碰撞检测 | 点 hero 两次移动撞 box1 | 碰撞日志 |
| 6 | 暂停/恢复 | 点暂停→点恢复 | 暂停后画面停止,恢复继续 |
| 7 | 服务端模式 | 后端就绪时 | 模式=server,实体来自世界库 |
| 8 | 独立模式 | 后端不可用 | 模式=independent,本地构建运行 |
| 9 | 状态查询 | 调 runtime_status.dspy | 返回引擎状态 JSON |
服务端辅助 API
GET /runtime/api/load_world.dspy?world_id=xxxGET /runtime/api/runtime_status.dspy?runtime_id=xxxPOST /runtime/api/runtime_event.dspy(event_type/entity_id/payload)POST /runtime/api/runtime_control.dspy(action=start/pause/resume)
详见 skill/SKILL.md。