常量与变量
前言与确认
简单的输出文字虽然是开发游戏的必由之路,但仅仅局限于此,决不是任何优秀的开发者所追求的目标。
制作游戏不是写小说,仅仅靠在脚本中挥洒文采只能让玩家变成只看一次的“读者”。我们需要给游戏中的信息施加名为“变化”的魔法,而要实现对它的操作,就首先需要学习如何“指代”它。
教程依赖
本教程假设您已学习过快速开始。若您尚未学习过,我们强烈推荐您首先学习相应教程。
先确认一下我们现有的工程文件夹结构:
root/
├─ emuera.config
├─ Emuera1824.exe
├─ CSV/
└─ ERB/
└─ System.erb
2
3
4
5
6
其中,System.erb
的代码为:
@EventFirst
Print Hello World!
Quit
2
3
值、常量与变量
让我们首先向你灌输一个概念:
- 请把信息想象为一团不可名状的“东西”,它可能是一个数字,也可能是一句文本,而我们称这样的信息为“值”,在英语中,它可以叫做:“Value”;
- 而正因为信息的不可名状,所以我们为了让游戏引擎明白我们如何操作信息,就创造了一个“有名字的容器”,这样的容器就被称为变量(或常量);
- 常量与变量都是“有名字的容器”,但常量中装的东西是不变的,变量中装的东西是可变的。
举个例子:我的包里有三个石头,他的数量输出到屏幕上:Print 3
。而我包里同时还有三个苹果,把他的数量也输出到屏幕上:Print 3
,这样我们就得到一个脚本:
@EventFirst
Print 3
Print 3
Quit
2
3
4
写完之后,我们和游戏引擎都会产生一个疑问:”究竟哪个3是金币,哪个3是苹果?“
别慌,显示的值不可名状,但我们可以用”有名字的容器“代替:
@EventFirst
#Dim Stone = 3
#Dim Apple = 3
PrintV Stone
PrintV Apple
Quit
2
3
4
5
6
运行下来:
33
让我们详细地看看发生了什么:
#Dim Stone = 3
- 我们用
#Dim
命令定义了一个变量Stone
,并使用=
符号将3
装入其中;
- 我们用
#Dim Apple = 3
- 我们用
#Dim
命令定义了一个变量Apple
,并使用=
符号将3
装入其中;
- 我们用
PrintV Stone
- 我们使用
PrintV
命令将变量Stone
的值输出到屏幕上;
- 我们使用
PrintV Apple
- 我们使用
PrintV
命令将变量Apple
的值输出到屏幕上;
- 我们使用
是不是特别简单就能理解?
我们加点难度,假如我的苹果后来变成了2个,怎么表示?
很简单,只需要告诉引擎,我的苹果的数量变为了2
就可以:
@EventFirst
#Dim Stone = 3
#Dim Apple = 3
Apple = 2
PrintV Stone
PrintV Apple
Quit
2
3
4
5
6
7
输出:
32
完美!程序正确地理解了我们的意思,并且把两个3
正确地区分了开来!不仅可以设置新的值,我们还可以对他进行各种操作和运算,但那都是后文了,至少现在,我们可以知道,”有名字的容器“真的很方便!
常量的定义与打印
显而易见,我们现在的脚本,即使运行一百次,也不会发生任何变化,只会简单地输出我们已经预先写好的字符串。
我们来尝试写一些不那么“直接”的东西,请将System.erb
中的内容改为这样:
@EventFirst
#Dim Const Food = 0
PrintV Food
Quit
2
3
4
运行!我们得到下列输出:
Hello World!
同样成功!
但……为什么?
我们现在突然遇到了几个不认识的代码以及几个不熟悉的用法。不过不用担心,我们分别看看:
@EventFirst
:定义函数。你已经学过了。#Dim
:定义(常量或变量)。这是你第一次见到它,不过它很简单,它的作用就是告诉游戏引擎:“看好了!我接下来要定义一个东西,它可能是常量或者变量”。这样游戏引擎就能做好相应准备。有关更多的定义常量、定义变量,请移步至此处。Const
:常量关键字。这很好理解,毕竟前一个短语已经成功地吸引到引擎的注意了,紧跟着的这个关键词就是明确地说这次定义的就是定义的常量。Food
:变量名。新定义的常量/变量名称。常量/变量完成定义后,可通过该名称再次找到这个常量/变量。=
:赋值符号。代表将符号右侧的数据装载到符号左侧的变量内,具体到这个地方,符号右边的“Hello World!”这句话,会装载到名为“Text”的变量内。0
:一个数值。PrintV
:一个语句,可以将装载于语句后面的变量内的数据显示在屏幕上。Quit
:退出。你也已经学过了。
看上去突然增加了许多内容,但细细一捋,才发现游戏脚本就像小说一样,虽然有点絮絮叨叨,但也能被简简单单的理解,不是吗?
变量的定义与打印
好了,我们现在已经有一个方法实现不那么“直接”的数据暂存了,但仍然不能够通过改变数据来为游戏增加变化。具体地说,如果我们就是想改变“Hello World!”的文本,怎么办!
我们改变脚本:
该代码含有可期待的错误
@EventFirst
#Dim Const Food = 0
Food = 1
PrintV Food
Quit
2
3
4
5
这样,Text 中的值就可以变化了吗?
运行得到:
错误信息索引
System.erbの3行目でエラーが発生しました:Emuera1824
Food = 1
エラー内容:代入文の左辺に変更できない変数を指定することはできません
現在の関数:@EVENTFIRST(System.erbの1行目)
関数呼び出しスタック:
...
System.erb的第3行发生错误:Emuera1824
Text = "How Are You?"
错误:你不能在赋值语句的左边指定一个不能改变的变量
当前函数:@EVENTFIRST (System.erb第1行)
函数调用栈:
Hmmmmm.....
这其实不难理解,毕竟我们定义的Text
是个常量。
改成变量就好了!
修改为:
@EventFirst
#Dim Food = 0
Food = 1
PrintV Food
Quit
2
3
4
5
运行,看到输出:
How Are You?
成功!
但又有两个问题:
- 为何我们直接删掉了
Const
? - 为何我们使用的是
Text = How Are You?
,而不是Text = "How Are You?"
(字符串外有双引号)
我想答案也不复杂:
- 对于
#DimS
语句来说,定义变量是默认用法,在这种情况下,可以省略。 - 我暂时也不知道。不过加上双引号后,显示出来的值也带有双引号,说明赋值在
#DimS
中和在外面独立使用的表现不一样。那就当作是”固定搭配“吧2333333