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

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

目录

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

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


代码仓地址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.xdnf.cn/news/17772.html

相关文章:

  • 用GPT解释“GPT-5”是什么,有什么优势
  • python-pycharm切换python各种版本的环境与安装python各种版本的环境(pypi轮子下载)
  • Flink Stream API 源码走读 - map 和 flatMap
  • KNN(k近邻算法)
  • Chrome插件开发实战:从架构到发布全流程
  • 准备用Qt6 重写音视频会议系统服务端
  • 开源 Arkts 鸿蒙应用 开发(十五)自定义绘图控件--仪表盘
  • 开源 Arkts 鸿蒙应用 开发(十六)自定义绘图控件--波形图
  • 【Javaweb学习|黑马笔记|Day1】初识,入门网页,HTML-CSS|常见的标签和样式|标题排版和样式、正文排版和样式
  • 前端css学习笔记6:盒子模型
  • 国内著名AI搜索优化专家孟庆涛发表《AI搜索内容可信度评估综合指南》
  • liteflow
  • Vue3中的ref与reactive全面解析:如何正确选择响应式声明方式
  • Java List 集合详解(ArrayList、LinkedList、Vector)
  • 水印消失术!JavaAI深度学习去水印技术深度剖析
  • 传输层协议TCP(3)
  • Flink Stream API 源码走读 - socketTextStream
  • 集成电路学习:什么是Machine Learning机器学习
  • 从单机到分布式:用飞算JavaAI构建可扩展的TCP多人聊天系统
  • 【力扣56】合并区间
  • easyexcel模板导出Map数据时空值列被下一行列非空数据覆盖
  • 从零开始的云计算生活——第四十三天,激流勇进,kubernetes模块之Pod资源对象
  • 使用Docker和Miniconda3搭建YOLOv13开发环境
  • 深入解析 Spring IOC 容器在 Web 环境中的启动机制
  • 小知识:for of,for in与forEach
  • Spark Shuffle机制原理
  • 图论(5)最小生成树算法
  • 计算机视觉Open-CV
  • OpenCV图像处理2:边界填充与平滑滤波实战
  • 23.Linux : ftp服务及配置详解