当前位置: 首页 > news >正文

关于截屏时实现游戏暂停以及本地和上线不同步问题

目录

需求:在点击截屏时需要自动暂停游戏运行,并在关闭弹窗后游戏自动恢复

问题:本地测试通过但是部署上线报错


代码仓地址https://github.com/ceilf6/Xbuilder

需求:在点击截屏时需要自动暂停游戏运行,并在关闭弹窗后游戏自动恢复

需要从游戏引擎角度实现,否则游戏都不会完全停止

// 在 spx-gui/public/spx_2.0.0-beta9/runner.html 中添加
window.pauseGame = async () => {// 使用时间缩放来暂停游戏if (typeof window.gdspx_platform_set_time_scale === 'function') {window.gdspx_platform_set_time_scale(0.0);  // 时间缩放为0,游戏完全停止console.log("游戏已通过时间缩放暂停 (time_scale = 0.0)")}
}window.resumeGame = async () => {// 使用时间缩放来恢复游戏if (typeof window.gdspx_platform_set_time_scale === 'function') {window.gdspx_platform_set_time_scale(1.0);  // 时间缩放为1,游戏正常速度console.log("游戏已通过时间缩放恢复 (time_scale = 1.0)")}
}

接着通过在引擎组件中通过 defineExpose 来暴露方法

defineExpose({async pauseGame() {const iframeWindow = iframeWindowRef.valueawait iframeWindow.pauseGame()  // 调用iframe中的方法},async resumeGame() {const iframeWindow = iframeWindowRef.valueawait iframeWindow.resumeGame()}
})

(且由于 XBuilder 上有两个引擎,需要在两个组件中构建完方法后还得去顶层组件中统一暴露)

然后就是去截屏组件中应用

const handleScreenshot = async () => {// 1. 暂停游戏await projectRunner.pauseGame()// 2. 截图const screenshot = await projectRunner.takeScreenshot()// 3. 显示截图弹窗isScreenshotModalVisible.value = true
}// 关闭截图弹窗时恢复游戏
const handleCloseScreenshotModal = async () => {await projectRunner.resumeGame()
}

录屏加上了观察者模式,因为录屏弹窗的调用是截屏的两倍

// 弹窗打开时暂停游戏
watch(() => props.visible, async (newVisible) => {if (newVisible) {await props.projectRunner.pauseGame()}
})// 开始录屏时恢复游戏
const startGameCanvasRecording = async () => {await props.projectRunner.resumeGame()  // 让录屏能录制到游戏画面
}// 停止录屏时暂停游戏
const handleStopRecording = async () => {await props.projectRunner.pauseGame()
}// 关闭弹窗时恢复游戏
const handleModalClose = async () => {await props.projectRunner.resumeGame()
}

问题:本地测试通过但是部署上线报错

通过 vercel 部署上去后报错 找不到新定义的方法

于是我去 vercel 上看了 public 中的 runner.html 文件,发现未和本地同步,于是我去看了 runner 的更新逻辑,发现 install-spx.sh 脚本在构建时会从 GitHub 下载 spx_web.zip 并解压,覆盖我们修改的 runner.html 且 Vite 配置中 spx_* 文件被设置了1年的缓存时间

于是我在脚本文件中重新应用更改

http://www.lryc.cn/news/621492.html

相关文章:

  • Java研学-SpringCloud(四)
  • Flink Stream API 源码走读 - keyBy
  • 转换一个python项目到moonbit,碰到报错输出:编译器对workflow.mbt文件中的类方法要求不一致的类型注解,导致无法正常编译
  • Vue响应式系统在超大型应用中的性能瓶颈
  • 中年海尔,是时候押注新方向了
  • 训练大模型的前提:数据治理工程:从原始数据到高质量语料的系统化治理实践
  • 抽奖程序web程序
  • 小迪安全v2023学习笔记(六十二讲)—— PHP框架反序列化
  • 实战 AI8051U 音视频播放:USART-SPI→DMA-P2P→SPI+I2S 例程详解
  • Redis 实用型限流与延时队列:从 Lua 固定/滑动窗口到 Streams 消费组(含脚本与压测)
  • 大华相机RTSP无法正常拉流问题分析与解决
  • (Arxiv-2025)Stand-In:一种轻量化、即插即用的身份控制方法用于视频生成
  • openwrt增加自定义网页
  • 基于asp.net#C##VUE框架的独居老人物资配送系统的设计与实现#sql server#visual studio
  • 国内多光谱相机做得好的厂家有哪些?-多光谱相机品牌厂家
  • 8月4日实训考察:重庆五一职院走进成都国际影像产业园
  • Flink面试题及详细答案100道(1-20)- 基础概念与架构
  • 基于.net、C#、asp.net、vs的保护大自然网站的设计与实现
  • Vue3中的ref与reactive全面解析:如何正确选择响应式声明方式
  • java 策略模式 demo
  • 基于微信小程序的家教服务平台的设计与实现/基于asp.net/c#的家教服务平台/基于asp.net/c#的家教管理系统
  • 「iOS」————APP启动优化
  • 什么是接口?PHP如何使用 SessionHandlerInterface 接口实现Session自定义会话数据存储
  • Spark 运行流程核心组件(二)任务调度
  • Python 基础语法笔记.2
  • Dijkstra与Floyd求最短路算法简介
  • zabbix部署问题后常见问题
  • sqli-labs通关笔记-第50关 GET数值型order by堆叠注入(手工注入+脚本注入两种方法)
  • StringBoot-SSE和WebFlux方式消息实时推送-默认单向-可增加交互接口
  • qt项目中解决关闭弹窗后执行主界面的信号槽时闪退问题