马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 Furau 于 2023-9-26 04:48 编辑
《Ren'Py强化之旅:Windows下引擎潜力探索》
01.Windows与Ren'Py的hello world
前言
因为自己的项目需要深度绑定Windows系统,所以有了这个系列文章,这系列是一份教程档案,也是一份代码测试档案,是笔者对Ren'Py在Windows下深度运行能力的探索。
[!!!重要]此教程code与Windows操作系统高度绑定,属于特殊平台兼容的代码,不支持其余操作系统平台
[!!!重要]教程使用Ren'Py版本为:8.1.3.23091805
[!!!重要]教程使用Windows版本为:10.0.19043
前置知识
Python 开发基础
Win32 开发基础
COM 接口调用基础
HTTP 协议
DLL动态链接库
[!!!注]随着教程的更新,前置知识也会随着更新,前置知识缺失不影响阅读,正如前言中所说的,这也是一份代码测试档案,如果你的软件版本与教程一致,代码就是可以直接运行并且产生直观效果的。可以在学习后补充这些前置知识
Hello world程序
有其他语言基础的朋友应该知道这份程序,在C和Python中,这个程序的样子是这样的
C:
[RenPy] 纯文本查看 复制代码 #include <stdio.h>
int main(void)
{
printf("Hello, World!");
return 0;
}
Python:
[RenPy] 纯文本查看 复制代码 print("Hello, World!")
这两个各有千秋,在笔者所使用的操作系统中,运行Python的效果如下。
在Windows系统中,想要输出独特的helloWord,写法并不像上面两种语言如此简便,我们首先将Helloworld概念拆解,这两种语言输出的都是隐藏了操作系统的底层操作(API 调度等等),但是平时无论我们作为普通用户还是Windows程序开发人员
都接触的更多是Windows GUI,GUI是Windows的优势部分,在Windows架构中,这个部分也被不断强化,于是我们可以不经过任何包装,直面Windows的强势点,使用Windows系统本身的资源编写helloworld程序,直接翻译就是使用GUI方式弹出Hello world
[!!!注]这里可以参考https://zh.wikipedia.org/wiki/Microsoft_Windows
所以我们现在想要制造“Windows hello world”这个程序,就需要思考如何调度Windows GUI去显示我们想要的字符串数据
在网络资料中,可以轻易找到对应的代码
win32 asm
[RenPy] 纯文本查看 复制代码 .586
.model flat, stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
includelib user32.lib
includelib kernel32.lib
.data
szTitle db "Hello W32asm",0
szCaption db "title",0
.data?
result db ?
;这里可以定义一个变量
.const
.code
start:
invoke MessageBox,0,addr szTitle,addr szCaption,MB_OK
invoke ExitProcess,0
end start
可以看到这份程序,它完成了我们上面描述的效果。程序主要调用Windows操作系统中的user32.dll完成了message 弹出的效果。
user32.dll是Windows操作系统中的一个动态链接库(Dynamic Link Library),它包含了许多与用户界面相关的函数和资源。user32.dll提供了一系列的API函数,用于管理和控制窗口、菜单、对话框、消息传递等用户界面的操作。
因为renpy底层使用Python进行调度等一系列的操作,所以现在我们的问题是:
使用Python调度系统dll并且测试是否能够嵌入到renpy中
[!!!注]这里之所以说“测试是否能够”,是因为renpy的Python导入机制是有特殊性质的。这个在第二节中继续讨论
Ren'Py最终代码
[RenPy] 纯文本查看 复制代码 # 游戏的脚本可置于此文件中。
# 声明此游戏使用的角色。颜色参数可使角色姓名着色。
define e = Character("艾琳")
init python:
import ctypes
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)
label start:
# 显示一个背景。此处默认显示占位图,但您也可以在图片目录添加一个文件
# (命名为 bg room.png 或 bg room.jpg)来显示。
scene bg room
python:
messagebox("title","Hello Windows!")
# 显示角色立绘。此处使用了占位图,但您也可以在图片目录添加命名为
# eileen happy.png 的文件来将其替换掉。
show eileen happy
# 此处显示各行对话。
e "您已创建一个新的 Ren'Py 游戏。"
e "当您完善了故事、图片和音乐之后,您就可以向全世界发布了!"
# 此处为游戏结尾。
return
效果:
点击开始游戏,自动弹出我们希望看到的的win32 hello world 对话框
至此,完成了renpy对底层DLL 库的调用,这里说renpy而不是python 是因为renpy的Python比较特殊,这个会在02做详细解释
|