骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 小黑盒加速器
查看: 2785|回复: 3

[版主推荐] 带参数的presentation

[复制链接]

949

主题

1万

回帖

1万

积分

侯爵[超级版主]

枢机主教

Rank: 8Rank: 8Rank: 8Rank: 8

UID
45575
第纳尔
41703
精华
20
互助
1060
荣誉
584
贡献
1796
魅力
1699
注册时间
2007-10-24

骑砍中文站APP会员勋章元老骑士勋章原版正版勋章战团正版勋章火与剑正版勋章拿破仑正版勋章维京征服正版勋章骑士美德之英勇勋章[杰出会员活跃勋章]骑士美德之大无畏勋章[杰出会员高级活跃勋章]骑士美德之仁慈勋章[杰出会员互助勋章]骑士美德之侠义勋章[杰出会员高级互助勋章]骑士美德之谦恭勋章[杰出会员财富勋章]骑士美德之公正勋章[杰出会员高级财富勋章]骑士美德之忠诚勋章[杰出会员精华勋章]骑士美德之正义勋章[杰出会员荣誉勋章]骑士美德之荣耀勋章[杰出会员高级荣誉勋章]骑士美德之圣洁勋章[杰出会员高级精华勋章]杰出汉化小组成员勋章骑士美德之慷慨勋章骑士荣誉之原版汉化勋章骑士荣誉之战团汉化勋章骑士美德之高贵勋章骑士美德之奉献勋章汉匈决战正版勋章

鲜花(2608) 鸡蛋(8)
发表于 2015-12-28 21:14:19 | 显示全部楼层 |阅读模式
本帖最后由 rubik 于 2015-12-28 21:27 编辑

常见的presentation都是展现特定的界面,里面的元素都是固定的。但也有特殊的presentation,其元素是变化的,甚至整个presentation是围绕这个元素开展的,比如兵种升级树界面,这个变化的元素就是阵营的ID,这个presentation相当于是以阵营为参数的presentation。
module_scripts.py里的script是有直接的参数,通过store_script_param_1,store_script_param_2等来直接设定和调用,各种触发器也有相关的操作符:store_trigger_param_1,store_trigger_param_2等。 presentation里也有参数,因为本质上,presentation就是由几个触发器组成的,但我们要的参数并不是触发器的参数,而是以presentation描述的对象为参数的参数。

相关的例子有带参数的菜单,都是以notification_开头的,里面就有两个全局变量作为来参数:"$g_notification_menu_var1"和"$g_notification_menu_var2",所有的notification_开头的都共用这两个全局变量形式的参数。我们可以仿照这个方法,给presentation也增加2个全局变量作为参数:"$g_prsnt_param_1"和"$g_prsnt_param_2"。很多时候,只需要用一个,就只用"$g_prsnt_param_1"就行了。把变化后的参数赋值到"$g_prsnt_param_1",再重新加载presentation,就可以实现带参数的presentation,关键是共用2个全局变量形式的参数。

当然,"$g_prsnt_param_1"和"$g_prsnt_param_2"是很抽象的。具体使用的时候,要赋值到一个变量名字有可读性的局部变量再用,而不是直接把"$g_prsnt_param_1"和"$g_prsnt_param_2"拿来用,那就失去了参数的意义,代码的可读性也很差。以上面提到的兵种升级树界面为例,参数为阵营ID,那么在ti_on_presentation_load这个触发器的头部,就加入一行:
(assign, ":selected_faction", "$g_prsnt_param_1"),
这样就让presentation的参数1("$g_prsnt_param_1")变得可读了,然后ti_on_presentation_load这个触发器内部都可以直接拿":selected_faction"来写了。

这一行代码的作用,完全类似于module_scripts.py里的:
(store_script_param_1, ":selected_faction"),
只是受机制的限制,导致外在形式不一样。

当然了,局部变量的有效范围仅仅限于它所在的那个[ ]范围内,所以在一个presentation另外一个触发器里,比如ti_on_presentation_run里面:
(assign, ":selected_faction", "$g_prsnt_param_1"),
这一句又要再写一遍。

带参数的presentation,其参数"$g_prsnt_param_1"和"$g_prsnt_param_2"一直不变的话,那就失去了带参数的意义了。而presentation参数里的对象ID变化一般都在ti_on_presentation_event_state_change里进行,当然也有在ti_on_presentation_mouse_press或者ti_on_presentation_run里进行的。 参数的变化,说白了也是赋值,把变化后的对象ID赋值到"$g_prsnt_param_1"和(或)"$g_prsnt_param_2"里。比如:
(assign, "$g_prsnt_param_1", ":selected_faction"),
然后再重新载入presentation。

想以前,我在有些presentation里都是用"$temp","$temp_2"来作为参数的。而且就这样直接用,不赋值到名字可读的局部变量里来使用。而对于有些presentation,则是每个presentation都新建一个名字可读的全局变量来作为参数。 两下一合计,就想出了这种共用2个全局变量作为带参presentation参数的方法。
rubik

0

主题

22

回帖

7

积分

平民

Rank: 1

UID
2576824
第纳尔
258
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2015-8-8
鲜花(0) 鸡蛋(0)
发表于 2015-12-29 16:58:24 | 显示全部楼层
好复杂

38

主题

1185

回帖

517

积分

骑士

Rank: 4Rank: 4

UID
2544612
第纳尔
4718
精华
0
互助
26
荣誉
2
贡献
0
魅力
28
注册时间
2015-6-23
鲜花(190) 鸡蛋(0)
发表于 2015-12-29 17:44:50 | 显示全部楼层

是不是可以这样理解:
presentation相关的代码是用来形成游戏界面功能的代码。
而对于一些有变量的界面,则需要用到那两个全局变量。
又因为要考虑可读性,所以r大就用两个全局变量"$g_prsnt_param_1"和"$g_prsnt_param_2",来定义所有需要的presentation里面的参数,只是在需要的时候,赋予可读的局部变量。(?)


小队ai思路http://bbs.mountblade.cn/thread-2027387-1-1.html

自定义进场基础http://bbs.mountblade.cn/forum.php?mod=viewthread&tid=2030991&page=1&extra=#pid8616532

224

主题

6034

回帖

2982

积分

男爵[离任版主]

Rank: 5Rank: 5Rank: 5

UID
169987
第纳尔
15231
精华
1
互助
101
荣誉
50
贡献
1605
魅力
252
注册时间
2009-11-28

元老骑士勋章汉匈决战正版勋章骑士美德之英勇勋章[杰出会员活跃勋章]骑士美德之大无畏勋章[杰出会员高级活跃勋章]骑士美德之仁慈勋章[杰出会员互助勋章]骑士美德之谦恭勋章[杰出会员财富勋章]骑士美德之公正勋章[杰出会员高级财富勋章]骑士美德之奉献勋章骑士美德之高贵勋章骑砍中文站微博会员勋章

鲜花(1473) 鸡蛋(56)
发表于 2016-1-2 11:20:03 | 显示全部楼层
愚见认为在同时只有一个prsnt运行的限制来看这样的做法很大程度上解决了prsnt的一个读写问题(主要还是读)
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2024-11-19 10:25 , Processed in 0.136411 second(s), 23 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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