找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7393|回复: 1

[转载] Ren'Py引擎从入门到放弃(13)——ATL要点拾遗

[复制链接]
发表于 2021-1-24 20:52:12 | 显示全部楼层 |阅读模式

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

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

×
Ren'Py引擎从入门到放弃(13)——ATL要点拾遗

世上无难事,只要肯放弃。

这是入门介绍的第十三篇,着重介绍几个ATL方面的要点。因为,后面要考!!(敲黑板)

第一个问题:event语句有什么用?

:往深了说,这是设计模式范畴的问题。

计算机程序运行过程中,各种数据不断变动,同时产生纷繁的信息。当程序的某个模块或者组件需要根据某些数据或者信息作出响应时,就需要一个获取信息的通道。解决这种需要的一种设计模式称做“事件总线模式”或者“监听者模式”。具体的不在本文内容范畴内,就先略过……使用这种设计模式的原因是,单个的模块或者组件不可能也没必要不停地去查看其他模块、组件的状态以决定是否产生自身需要的信息,所以设计出一个总线或者事件中心,来统一完成信息的首发。event直译的话,就是“事件”,也就是组件或模块产生的信息。

举个例子,我们定义了一个图片并显示:
[RenPy] 纯文本查看 复制代码
image test_image = "image.png"

当我们使用show语句显示图片时,这个image就会自动产生一个叫做“show”的event;同样,当我们使用hide语句隐藏图片时,也会自动产生一个叫做“hide”的event。这两个event是Ren'Py引擎自带的,不想要也得要!

如果制造几个原来没有的event,就可以在transform中使用event语句生成自定义的event了。

好像可以生成event了……但这玩意儿到底有什么用?

event语句生成事件,on语句监听事件。监听到需要的事件后,你们想干啥就干啥……

(理论上应该是这样,实际上自定义的event只能在其所属的transform代码块中有效,其他transform中是没效果的,至少我没搞定不同transform监听同一个自定义event的问题。)

官方文档里的样例代码如下:
[RenPy] 纯文本查看 复制代码
show logo base:
    on show:
        alpha 0.0
        linear .5 alpha 1.0
    on hide:
        linear .5 alpha 0.0

transform pulse_button:
    on hover, idle:
        linear .25 zoom 1.25
        linear .25 zoom 1.0

on语句中的 showhidehover idle 是Ren'Py自带的4种 event,分别表示图片显示隐藏指针悬置 空闲状态。这两段代码分别让图像淡入淡出,以及获取和失去鼠标焦点时执行一个缩放动画。

logo淡入淡出

logo淡入淡出

logo淡入淡出

按钮获取鼠标焦点

按钮获取鼠标焦点

按钮获取鼠标焦点

关键点就在这里:showhidehoveridle,这4个自带的 Extenal Event。请务必理解生成各 event的触发条件,后面定制化GUI会用到。

回到问题本身,event语句暂时来看的确没啥用处,on语句很有用……

第二个问题:contains 和 function语句又有什么用?

答:一般来说 contains用来在其他 image上加上 transform 中定义的 image,类似图层叠加。但是 contains语句不能多重嵌套。语法上不会报错,多层嵌套的结果是只显示 transform最外层的效果。另外,contains必须包含至少一个 image对象。

除了这种浅显的手法,contains有个特殊用途,用于不能直接定义 image而使用 Image()类 或 Frame()类定义图像的地方。因为 Image()类 和 Frame()类的定义不能使用序列帧,而 transform中是可以直接定义序列帧的。比如,上一篇中自定义对话框中就使用了这个办法。

function语句主要用来做 transform动画,类似其他通用游戏引擎里的动画曲线,可以实现某个或某些properties的精准控制。具体的放在下一篇里说。

第三个问题:哪些情况下可以触发External Events?

答:根据官方文档:

中文文档:动画和变换语言

start是预定义的事件,所有对象都默认会发送;

showreplacehide在使用show 和 hide语句时发送;

replaced是在 transform被替换时发送,应该是指被替换的 transform;

update是在GUI整套替换或切换语言类型时发送,仅仅用于修改分辨率和修改语言设置项的情况;

hover、idle、selected_hover 和 selected_idle 仅对 按钮(button)对象发送,普通的文本或者图片对象是监听不到这4个事件的(敲黑板,这个是考点)。

扯淡部分:

风吹鸡蛋壳,财去人安乐。

大半年过去了,算了算了……

预告部分:

后续开始做定制化GUI部分,预计会有4、5篇的样子。ALT的基础请务必掌握,不然你们会比我更早放弃的……

发表于 2021-1-25 21:43:13 | 显示全部楼层
怎么突然有空管理论坛了(笑
回复 支持 抱歉

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-3 23:49 , Processed in 0.133617 second(s), 31 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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