当前位置: 首页 > 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.dtcms.com/a/332625.html

相关文章:

  • pycharm2025导入anaconda创建的各个AI环境
  • C++第二十课:快递运费计算器 / 黑白配+石头剪刀布小游戏
  • 医院网络安全重保方案
  • 用 KNN 算法解锁分类的奥秘:从电影类型到鸢尾花开
  • 从电影分类到鸢尾花识别:KNN 算法实战指南
  • @[TOC](计算机是如何⼯作的) JavaEE==网站开发
  • MySQL 关键字总结,并结合 SQL 类型(DDL / DML / DQL / DCL / TCL) 说明每类关键字的作用、使用场景和示例
  • 华为实验综合小练习
  • Android RxJava变换操作符详解
  • MuMu模拟器Pro Mac 安卓手机平板模拟器(Mac中文)
  • 9.对象介绍
  • iOS App TF 上架多工具协作实战,一次高效的应用内测分发流程
  • 【数据结构初阶】--排序(三):冒泡排序、快速排序
  • Tomcat部署JDK8项目启动失败:系统化诊断指南
  • 【科研绘图系列】R语言绘制多种饼图
  • OpenCV 阈值处理
  • 基于定制开发开源AI智能名片与S2B2C商城小程序的H5页面小游戏营销模式创新研究
  • 综合案例:Python 函数知识整合 — 学生成绩管理系统
  • fastdds.ignore_local_endpoints 属性
  • 自动化框架pytest(1)
  • Vue3 Element-plus 封装Select下拉复选框选择器
  • Vue3 + Element Plus 实现可搜索、可折叠、可拖拽的部门树组件
  • 基于element-plus的基础表单样式
  • [微服务]ELK Stack安装与配置全指南
  • Pytest项目_day17(随机测试数据)
  • 大模型微调分布式训练-大模型压缩训练(知识蒸馏)-大模型推理部署(分布式推理与量化部署)-大模型评估测试(OpenCompass)
  • 专题:2025跨境电商市场布局、供应链与产业带赋能报告 |附130+份报告PDF、原数据表汇总下载
  • Sparse-ICP—(3) 点到面稀疏迭代最近点算法(matlab版)
  • PDF Replacer:高效便捷的PDF文档内容替换专家
  • 国内多光谱相机做得好的厂家有哪些?-多光谱相机品牌厂家