SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 5856|回复: 1
打印 上一主题 下一主题

[MOD] 变量(Variables)

[复制链接]

149

主题

331

帖子

2445

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2445
跳转到指定楼层
楼主
发表于 2020-11-29 11:41:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
目的
变量用于记录当前状态信息,以便后面可以用到。

概述
每个变量以变量名进行标识,变量名只能包含字母、数字和下横符。
变量可以被赋值、被查询、被清除。
  • 赋值变量。变量赋值(通常用[set_variable])是把一个值存储在变量中。除去[set_variable],场景开始时[variables]标签会给每个变量赋上一个初始值。
  • 查询变量。返回存储在变量中的最近值。
  • 清除变量。使整系统“忘记”这个变量。游戏不断运行,变量会不断增多,程序用于存储变量的内存也在增多,须要适时清除那些已确定不要再使用的以释放资源。mod用[clear_variable]清除变量。
    1. [clear_variable]
    2.         name=recruit
    3. [/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]来创建自己的数组:
  1. [set_variable]
  2.         name=my_awesome_array[0].x
  3.         value=10
  4. [/set_variable]
  5. [set_variable]
  6.         name=my_awesome_array[1].x
  7.         value=12
  8. [/set_variable]
  9. [set_variable]
  10.         name=my_awesome_array[2].x
  11.         value=14
  12. [/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]。
回复

使用道具 举报

149

主题

331

帖子

2445

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2445
沙发
 楼主| 发表于 2020-11-29 11:41:40 | 只看该作者

程序实现:概述


一、整个程序只有一个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增加一个标签。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2025-5-2 03:48 , Processed in 0.052202 second(s), 22 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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