SDL中文论坛
标题:
变量(Variables)
[打印本页]
作者:
ancientcc
时间:
2020-11-29 11:41
标题:
变量(Variables)
目的
变量用于记录当前状态信息,以便后面可以用到。
概述
每个变量以变量名进行标识,变量名只能包含字母、数字和下横符。
变量可以被赋值、被查询、被清除。
赋值变量。变量赋值(通常用[set_variable])是把一个值存储在变量中。除去[set_variable],场景开始时[variables]标签会给每个变量赋上一个初始值。
查询变量。返回存储在变量中的最近值。
清除变量。使整系统“忘记”这个变量。游戏不断运行,变量会不断增多,程序用于存储变量的内存也在增多,须要适时清除那些已确定不要再使用的以释放资源。mod用[clear_variable]清除变量。
[clear_variable]
name=recruit
[/clear_variable]
复制代码
以上这个清变量块可同时清recruit标量变量、recruit结构变量,对于结构变量如果是数组,它可清空此个数组。
变量类型
标量(Scalar)
标量类型的变量可以存储单个字符串或数字。mod给标量赋值时一般使用[set_variable]块或{VARIABLE}宏,像{VARIABLE foo (_"sample value")}。对于值,也可以在[set_variable]或{VARIABLE}中使用公式。
{VARIABLE foo 4}
{VARIABLE name "$($foo*2+4)"}
{DEBUG_MSG "$name"}将返回12
结构(Container)
结构类型变量可以存储若干个标量类型变量或/和数组变量。mod给结构变量赋值要用特定WML块,像[store_side]。
要引用存储在foo这个结构变量中的bar变量,格式是foo.bar。一个对数组索引变量也认为是一个结构变量。
数组(Array)
数组类型变量是一系列结构变量。
mod中用特定标签给数组赋值,例如[store_unit]和[store_locations]。也可以使用[set_variable]来创建自己的数组:
[set_variable]
name=my_awesome_array[0].x
value=10
[/set_variable]
[set_variable]
name=my_awesome_array[1].x
value=12
[/set_variable]
[set_variable]
name=my_awesome_array[2].x
value=14
[/set_variable]
复制代码
如果数组名是foo,那么foo[0]是表示数组中第一个结构变量名,foo[1]是第二个,以此类推。foo.length则指示foo中存储了的结构变量数。因此如果foo.length值是18,最后一个结构变量是foo[17]。
如果你想以结构变量形式使用数组,这时需要简单地使用index[0]。因此$foo.bar和$foo[0].bar是等意义的。
注意:不要把一个数组单元看作标量,数组单元是结构变量。因此foo[3]不是指向一个标量,取而代之应使用foo[3].value或foo_3来存储一个标量。(当你忽略这条规则,程序会产生不可预见后果。它可以引起未定义行为,例如加载一个含有变量游戏会报出WML错误而失败)。
变量替换
[
http://wiki.wesnoth.org/VariablesWML
]
[variables]标签
游戏存档中的[variables]用于描述每个变量当前值,场景文件中的[variables]则用于指针场景开始时的各个变量值。
描述标量以属性格式,属性值就是存储在变量中的值。
描述结构变量以WML块格式,例如结构变量foo是以使用[foo]...[/foo]。
描述数组变量以数个WML块格式。例如数组foo,第一个[foo]块表示foo[0],第二个表示foo[1]。
自动被存储的变量
自动被存储的变量是指不必mod指定,程序内部会创建、清除的变量。这些变量虽不是mod创建,但mod可以查询、修改这些变量。
side_number:当前正在操作的阵营。(start或prestart事件中这变量还没出现);
turn_number:当前回合数。(start或prestart事件中这变量还没出现);
x1:最近一个被触发事件时的主x坐标(mod坐标系);
y1:最近一个被触发事件时的主y坐标(mod坐标系);
x2:最近一个被触发事件时的次x坐标(mod坐标系);
y2:最近一个被触发事件时的次y坐标(mod坐标系);
unit:事件内,($x1, $y1)指向的单位;
second_unit:事件内,($x2, $y2)指向的单位;
this_unit:在标准单位筛选内,它用于示极可能匹配单位;
damage_inflited:在attack、attack_hits、defender_hits事件中,它是受损伤值;
weapon:attack、attack_hits、defender_hits、die和last_breath中,主部队使用武器。它一般直接来自于[attack]。
second_weapon:attack、attack_hits、defender_hits、die和last_breath中,次部队使用武器。它一般直接来自于[attack]。
作者:
ancientcc
时间:
2020-11-29 11:41
标题:
程序实现:概述
(, 下载次数: 4354)
上传
点击文件名下载附件
一、整个程序只有一个game_state实例,它在game_controller中。其它game_state都是或对它的引用,或对它的指针。(图中红色线表示引用,黑色线表示指针)
二、变量存储在game_state中的variables字段。它的类型config,config中的一个string_map正好对应一个标量,一个标签则对应一个结构变量或一个数组单元。
三、game_state中特别标出了scoped_variables字段,该字段是形成“自动被存储变量”用的,它当中的一个元素总是形成一个结构变量。注:1)scoped_variables只是存储类“附加”数据,变量数值还是存储在variables;2)player结构变量不由scoped_variables形成,它是直接向variables增加一个标签。
欢迎光临 SDL中文论坛 (http://www.libsdl.cn/bbs/)
Powered by Discuz! X3.3