2023-12-11 01:19 普罗_puluo
R半身像对话技术

[size=3]估计大部分人都玩过galgame,对半身像对话的剧情模式应该不陌生。对于作者懒得摆R形象 或者R剧情出场人数很少的作品,可以考虑使用半身像对话来代替R剧情。
[attach]149836[/attach]

要注意的是,这次我准备开辟一条新的技术路线:DLL静态注入技术。听名字好像很高大上,其实就是 我把功能写到了dll中,大家直接把dll接入exe即可,不需要大段大段抄代码了。
DLL注入是日后引擎发展的一个趋势,可以对引擎架构进行解耦(即把不同的功能分散到不同的DLL模块中,彼此之间互不干扰的设计)。因此本帖会对“dll注入”的具体方法做一个简单的介绍。[/size]

[size=5][b]实装方法[/b][/size]

[size=3]首先发布一下dll文件:
[attach]149828[/attach]

将该文件放置到游戏目录中,然后打开Stud_PE,用该软件打开ekd5.exe,来到【函数】一栏:
[attach]149829[/attach]

如上图 在空白区域右键,选择【输入新的输入表】,dll选择DanTiao.dll,函数选择Chat,然后点【加入】:
[attach]149830[/attach]

加入成功后,在左侧可以看到DanTiao.dll,我们展开这一项,可以看到下图中箭头处有个数字,该数字+400000H称作[color=Red]外部函数指针[/color],大家记住这个数字就好,后面有用。
[attach]149831[/attach]

接下来改一点汇编,改的内容非常少,6.2~6.4都是这样改(6.1及以下未测试):
004139A0   > \8B45 F4            mov eax,dword ptr ss:[ebp-C]
004139A3   .  8038 30            cmp byte ptr ds:[eax],30
004139A6   .  75 04              jnz short Ekd5.004139AC
004139A8   .  6A 01              push 1
004139AA   .  EB 02              jmp short Ekd5.004139AE
004139AC   >  6A 00              push 0
004139AE   >  FF75 FC            push dword ptr ss:[ebp-4]
004139B1   .  FF75 F8            push dword ptr ss:[ebp-8]
004139B4   .  FF75 F4            push dword ptr ss:[ebp-C]
004139B7   .  FF15 14315400      call dword ptr ds:[543110]      ;  这里的这个543110 就是上面说的[color=Red]外部函数指针[/color],大家按照自己的情况填入该数值
[attach]149832[/attach]

现在引擎已经具备半身像对话的功能了。接下来讲一下剧本的写法,也非常简单:
[attach]149833[/attach]

第一行是说话人,取值1~2;
第二行开始是对话内容,目前对话框的尺寸最多支持两行。

然后说一下图片的要求,
首先需要建立一个BMP文件夹,每一个角色的头像名称为 data编号+“.bmp”,尺寸为192×272;每一个角色还需要一个暗掉的头像 名称为 data编号+"_.bmp";
然后需要往BMP文件夹放一个对话框图像,名称为border.bmp,尺寸为600×120。
示例:
[attach]149834[/attach]

(对话框图片取自【国风轶事】,因为没有获得公开授权,所以这里不会公开对话框的原图)[/size]

[size=5][b]字体参数[/b][/size]

[size=3]本节为非必需项,如果想自定义文字风格的可以看一下。
用od打开dll,查找到以下地址:(如果找不到的话可以直接搜索二进制:6A 00 6A 00 6A 01 6A 02 6A 01 6A 00 6A 00 6A 00 68 90 01 00 00 6A 00 6A 00 6A F9 6A F0)
[attach]149835[/attach]

对于这些参数,可以查询[url]https://learn.microsoft.com/zh-cn/windows/win32/api/wingdi/nf-wingdi-createfonta[/url],来获悉各个参数的意义并做修改,主要是字体高度和宽度可能需要修改,至于加粗、斜体、下划线个人不推荐用,影响观感。[/size]

[size=5][b]更新前瞻[/b][/size]

[size=3]下一版本准备优化一下图片显示,尝试制作渐入渐出的效果;
尝试实现简易的gif半身像;
实现彩色文字 以及 文字显示整型变量数字的功能。

以上全是饼,现在需要测试当前版本是否稳定 以及是否有恶性bug,待初版完善后会继续更新上述的功能。
[/size]


[b][size=5]因为本人精力有限,测试不多,欢迎大家测试反馈bug[/size][/b]

[color=Silver][[i] 本帖最后由 普罗_puluo 于 2023-12-22 02:33 编辑 [/i]][/color]

2023-12-11 09:46 斑鸠凉
:hz1048:普罗大大回来了呢~

2023-12-11 11:27 ささきこじろう
有点意思。

2023-12-11 12:39 鲍三郎
:hz1003::hz1003::hz1003::hz1020::hz1020::hz1020:

2023-12-11 14:20 59054695
:!!
我的天,你真是小天使啊!!!!
2020202020202020

2023-12-11 15:16 star175
回复 #1 普罗_puluo 的帖子

这种修改方法很有意思,以后换引擎就方便了

2023-12-12 09:21 norton
大佬们都回来了。看到希望了!

2023-12-12 11:57 鲍三郎
:hz1003::hz1003::hz1003::hz1020::hz1020::hz1020:

2023-12-12 13:43 十里风波恶
:hz1004::hz1004:好哎

2023-12-12 20:18 一流也
[quote]原帖由 [i]star175[/i] 于 2023-12-11 15:16 发表
这种修改方法很有意思,以后换引擎就方便了 [/quote]

6.3exe 和6.4exe可以再重发帖子吗?谢谢。

2023-12-14 13:57 狂笑四海
前些日子有想过类似橙光游戏剧情模式,写起来比较轻松。

请问为啥要多准备一张暗色的头像?

2023-12-14 23:45 普罗_puluo
回复 #11 狂笑四海 的帖子

两个人说话的时候,说话的人是亮的,没说话的人是暗的,这样可以很快速地区分出谁在说话。

2023-12-16 00:45 狂笑四海
回复 #12 普罗_puluo 的帖子

可是……如果当前场景人物超过2个呢?

2023-12-16 01:45 普罗_puluo
回复 #13 狂笑四海 的帖子

目前最多支持2人同屏,可以用对话2切换当前显示的角色。

当然增加到3人也完全可以,不过感觉容易扰乱视线,让人摸不清谁在发言

2023-12-16 08:47 狂笑四海
回复 #14 普罗_puluo 的帖子

我想问的是:同屏A和B两个人,如果A(或者B)不说话也有必要显示头像吗?

按之前引擎设定,谁说话就显示谁,是不是更好一点。

2023-12-16 15:37 普罗_puluo
回复 #15 狂笑四海 的帖子

可以,只要你使用【对话2】的时候,把另一个人设置成无就好了。

不过对话2的第一行依旧要标注说话人是1还是2

2023-12-18 01:53 狂笑四海
回复 #16 普罗_puluo 的帖子

谢谢解答,基本明白了。在指令15中1和2两个位置不指定人物,则不会显示头像。

其实用这个办法也不用准备暗色头像图片了吧?

2023-12-18 12:26 普罗_puluo
回复 #17 狂笑四海 的帖子

如果全程都是单头像对话的话 就不需要暗色头像了。
[attach]149843[/attach]

占楼传个头像(逃

[color=Silver][[i] 本帖最后由 普罗_puluo 于 2023-12-22 02:37 编辑 [/i]][/color]

页: [1]
查看完整版本: R半身像对话技术


Powered by Discuz! Archiver 5.0.0  © 2001-2006 Comsenz Inc.