beyond-simulator-web 0.3.5 → 0.4.0

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/README.md CHANGED
@@ -62,6 +62,10 @@ Web/MCP 0.3.0、共享宿主所在 DSH 2.0.3:修复空工作区启动后跳过
62
62
 
63
63
  试玩使用固定 30 FPS Worker、增量场景和 Pixi/WebGL;刷新试玩页会接回已有 Worker,保留暂停和当前玩家。截图仍由 Host 根据统一场景输出 PNG。
64
64
 
65
+ 白名单静态图片按需从素材源加载,通过同源 `/qxqy-assets/` 路由显示,浏览器复用 HTTP 缓存,Host 与 MCP 共用磁盘缓存。可用 `QXQY_IMAGE_CACHE_DIR` 指定目录;图片属性面板提供「重新下载此素材」。详见 [素材缓存与预览边界](../studio/docs/image-assets.md)。
66
+
67
+ Lua `game.PlayAudio2D(id)` 触发白名单 MP3 按需缓存与播放,同源路由为 `/qxqy-audio/`,缓存目录可用 `QXQY_AUDIO_CACHE_DIR` 指定。首次自动播放被浏览器阻止时点击「开启声音」;支持停止、试玩暂停/继续和静音。参见 [音频说明](../studio/docs/audio-assets.md)。
68
+
65
69
  ## 部署与访问控制
66
70
 
67
71
  绑定非回环地址前,设置 `QXQY_WEB_PASSWORD`,登录用户名固定为 `simulator`。设置口令后,即使回环访问也要求认证。业务静态文件、API、SSE 与截图均受保护;写请求只接受 JSON 并校验浏览器 Origin。路径只能落在配置工作区内。
@@ -16,6 +16,7 @@ const elements = {
16
16
  device: byId('device-select'),
17
17
  playControls: byId('play-controls'),
18
18
  playStart: byId('play-start'),
19
+ playAudio: byId('play-audio'),
19
20
  playPause: byId('play-pause'),
20
21
  playResume: byId('play-resume'),
21
22
  playStep: byId('play-step'),
@@ -384,9 +385,14 @@ const play = createPlaySession({
384
385
  onSnapshot: onPlaySnapshot,
385
386
  onStatus: (next) => { applyPlayStatus(next); updatePlayChrome() },
386
387
  onError: (error) => notify(error.message, true),
388
+ onAudioStatus: status => {
389
+ elements.playAudio.textContent = !status.unlocked ? '开启声音' : status.muted ? '声音已关闭' : '声音已开启'
390
+ elements.playAudio.title = status.error || (!status.unlocked ? '点击或在画布内操作以解锁音效' : '切换静音')
391
+ },
387
392
  isActive: () => mode === 'play',
388
393
  })
389
394
  play.bindInput(elements.stageCanvas, { keysOn: elements.stageShell })
395
+ elements.playAudio.addEventListener('click', () => play.audio?.toggle())
390
396
 
391
397
  elements.archive.addEventListener('change', () => run(async () => {
392
398
  if (play.running) await play.stop().catch(() => {})