马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 Furau 于 2023-10-3 16:24 编辑
《Ren'Py强化之旅:Windows下引擎潜力探索》05.renpy游戏更新技术(1)单资源更新
前言
认真翻看了前面四篇帖子的朋友应该可以发现此教程进行程序设计的规律,都是利用window接口或者Ren'py自带的包,去进行组合拼装,来实现我们想要的效果。
这正是最经典Windows程序开发的方式:
Windows API 他们犹如“积木块”一样,可以搭建出各种界面丰富,功能灵活的应用程序。所以可以认为API函数是构筑整个Windows框架的基石,在它的下面是Windows的操作系统核心,而它的上面则是所有的华丽的Windows应用程序。
在这里我们的底层是繁杂的Windows系统,在接口之上则是阉割后的Python包体,一份程序的本质其实是状态机,我们的工作,就是利用手中的工具,完成renpy程序的状态转换,这就是这几篇教程所要表达的。
游戏更新技术简介
游戏更新中的冷更新和热更新是两种常见的更新方式,它们有不同的特点和适用场景。
冷更新是指在游戏更新过程中需要重新启动游戏客户端才能生效的更新方式。
热更新是指在游戏更新过程中无需重新启动游戏客户端,即可实现更新内容的生效。
本篇实现的是资源冷更新中的单资源更新方案。
流程图
实现流程:
1.构建后端服务器,约定好传输协议,传输数据内容(格式),更新行为等等,等待renpy请求。
2.renpy使用requests请求库请求
3.后端对其请求进行响应处理
4.renpy获取到数据,做剩余操作(重启自身)
在笔者给出的范例中,信息传输协议为HTTP 信息传递格式为JSON,JSON 字符串中设计了如下字段
- 游戏ID(game_id):用于唯一标识游戏的ID。
- 游戏版本号(version):表示游戏的当前版本号,用于判断是否需要更新。
- 游戏更新描述(description):包含游戏更新的详细描述信息,可以包括新增内容、修复的bug等。
- 游戏更新时间(update_time):表示游戏更新的时间,可以用时间戳表示。
- 游戏更新文件(update_file):包含游戏更新所需的文件,可以是游戏的安装包或补丁文件。
- 游戏更新类型(update_type):表示游戏更新的类型,如普通更新、紧急修复等。
- 游戏更新状态(status):表示游戏更新的状态,如已发布、待发布等。
JSON可视化
SCREENS.RPY
[RenPy] 纯文本查看 复制代码 textbutton _("检查更新") action ShowMenu("Update")
SCRIPT.RPY
[RenPy] 纯文本查看 复制代码 # 游戏的脚本可置于此文件中。
# 声明此游戏使用的角色。颜色参数可使角色姓名着色。
define e = Character("艾琳")
# 游戏在此开始。
label start:
label Update:
python:
import ctypes
import requests
import os
def messagebox(title, message):
MB_OK = 0x00000000
user32 = ctypes.WinDLL('user32')
user32.MessageBoxW.argtypes = (ctypes.c_void_p, ctypes.c_wchar_p, ctypes.c_wchar_p, ctypes.c_uint)
title = ctypes.c_wchar_p(title)
message = ctypes.c_wchar_p(message)
user32.MessageBoxW(None, message, title, MB_OK)
res = messagebox("title","正在检查更新....")
url = "http://127.0.0.1:8080/game/update"
response = requests.get(url)
if response.status_code == 200:
response_data = response.json()
update_switch = response_data.get("update_switch")
update_file = response_data.get("update_file")
description = response_data.get("description")
if update_switch:
messagebox("title:", "有更新内容" + description)
file_url = update_file
file_response = requests.get(file_url)
if file_response.status_code == 200:
with open("game/gui/main_menu.png", "wb") as file:
file.write(file_response.content)
messagebox("更新成功,自动重启","文件下载成功!")
os.system("update.exe")
sys.exit()
else:
print("文件下载失败!")
else:
messagebox("title","无更新内容")
else:
messagebox("请求失败!","title")
默认参数demo:
修改参数demo:
后端server:https://vip.123pan.cn/1818691018/url/server.zip
工程可以自行构建
调试方法:
先启动server部分,然后写入script,构建包,在包中调试
|