找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 276|回复: 0

[原创] 《Ren'Py强化之旅:Windows下引擎潜力探索》01.Windows与Ren'Py的hello world

[复制链接]
发表于 2023-9-25 22:07:39 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 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的效果如下。
Snipaste_2023-09-25_21-41-17.png
在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



Snipaste_2023-09-25_21-55-21.png

可以看到这份程序,它完成了我们上面描述的效果。程序主要调用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

效果:
Snipaste_2023-09-25_22-05-50.png
点击开始游戏,自动弹出我们希望看到的的win32 hello world 对话框
至此,完成了renpy对底层DLL 库的调用,这里说renpy而不是python 是因为renpy的Python比较特殊,这个会在02做详细解释











评分

参与人数 1活力 +300 干货 +3 收起 理由
被诅咒的章鱼 + 300 + 3 感谢分享!

查看全部评分

本帖被以下淘专辑推荐:

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

本版积分规则

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

GMT+8, 2024-5-14 09:13 , Processed in 0.093943 second(s), 37 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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