找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 472|回复: 7

[原创] 《Ren'Py强化之旅:Windows下引擎潜力探索》05.renpy游戏更新技术(1)单资源更新

[复制链接]
发表于 2023-10-3 16:05:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 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程序的状态转换,这就是这几篇教程所要表达的。

游戏更新技术简介
游戏更新中的冷更新和热更新是两种常见的更新方式,它们有不同的特点和适用场景。
冷更新是指在游戏更新过程中需要重新启动游戏客户端才能生效的更新方式。
热更新是指在游戏更新过程中无需重新启动游戏客户端,即可实现更新内容的生效。
本篇实现的是资源冷更新中的单资源更新方案。
流程图
Snipaste_2023-10-03_14-25-02.png
实现流程:
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可视化
Snipaste_2023-10-03_15-45-35.png
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,构建包,在包中调试
 楼主| 发表于 2023-10-4 06:09:57 | 显示全部楼层
大家有任何疑问可以帖子回复,或者电邮到code233@126.com
方便我进行程序改进
回复 支持 抱歉

使用道具 举报

发表于 2023-10-4 18:41:37 | 显示全部楼层
http://www.furau.com/
是真实存在的……
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2023-10-5 06:18:26 | 显示全部楼层
被诅咒的章鱼 发表于 2023-10-4 18:41
http://www.furau.com/
是真实存在的……

这个就是我的自己的站点,为了演示上传的文件。
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2023-10-5 06:18:59 | 显示全部楼层
被诅咒的章鱼 发表于 2023-10-4 18:41
http://www.furau.com/
是真实存在的……

你本地测试可以换成你需要的url,我这里是为了方便demo运行
回复 支持 抱歉

使用道具 举报

发表于 2023-10-5 22:17:08 | 显示全部楼层
1. 考虑到跨平台性,推荐直接在renpy中编写一个界面而非调用win组件
2. 更新不可能只是图片,可以做成压缩包的形式,下载后再使用python内置的zipfile库解压
3. 由于更新内容不是确定的,可以写一些函数用于更新内容的接收。如有了新场景对话或美术资源等该如何插入在游戏中。这里我推荐直接写一个Update类用于控制整个更新的流程。
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2023-10-6 05:58:30 | 显示全部楼层
ZYKsslm 发表于 2023-10-5 22:17
1. 考虑到跨平台性,推荐直接在renpy中编写一个界面而非调用win组件
2. 更新不可能只是图片,可以做成压缩 ...

这个是单资源,后面会更新你说的这个情况 还有代码重载部分 可以更新逻辑和资源
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2023-10-6 06:10:40 | 显示全部楼层
ZYKsslm 发表于 2023-10-5 22:17
1. 考虑到跨平台性,推荐直接在renpy中编写一个界面而非调用win组件
2. 更新不可能只是图片,可以做成压缩 ...

还有兼容部分 不会考虑兼容除了Windows之外的平台,因为不同的操作系统 IO部分与Windows相差太大
即便界面绘制在renpy,底层IO也是有很大的差距,这加重了维护成本 我的这份教程只考虑Windows
回复 支持 抱歉

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|RenPy中文空间 ( 苏ICP备17067825号|苏公网安备 32092302000068号 )

GMT+8, 2024-4-29 19:55 , Processed in 0.072717 second(s), 16 queries , File On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表