常量与变量

前言与确认

简单的输出文字虽然是开发游戏的必由之路,但仅仅局限于此,决不是任何优秀的开发者所追求的目标。

制作游戏不是写小说,仅仅靠在脚本中挥洒文采只能让玩家变成只看一次的“读者”。我们需要给游戏中的信息施加名为“变化”的魔法,而要实现对它的操作,就首先需要学习如何“指代”它。

教程依赖

本教程假设您已学习过快速开始。若您尚未学习过,我们强烈推荐您首先学习相应教程。

先确认一下我们现有的工程文件夹结构:

root/
 ├─ emuera.config
 ├─ Emuera1824.exe
 ├─ CSV/
 └─ ERB/
     └─ System.erb
1
2
3
4
5
6

其中,System.erb的代码为:

@EventFirst
  Print Hello World!
  Quit
1
2
3

值、常量与变量

让我们首先向你灌输一个概念:

  • 请把信息想象为一团不可名状的“东西”,它可能是一个数字,也可能是一句文本,而我们称这样的信息为“值”,在英语中,它可以叫做:“Value”;
  • 而正因为信息的不可名状,所以我们为了让游戏引擎明白我们如何操作信息,就创造了一个“有名字的容器”,这样的容器就被称为变量(或常量);
  • 常量与变量都是“有名字的容器”,但常量中装的东西是不变的,变量中装的东西是可变的。

举个例子:我的包里有三个石头,他的数量输出到屏幕上:Print 3。而我包里同时还有三个苹果,把他的数量也输出到屏幕上:Print 3,这样我们就得到一个脚本:

@EventFirst
  Print 3
  Print 3
  Quit
1
2
3
4

写完之后,我们和游戏引擎都会产生一个疑问:”究竟哪个3是金币,哪个3是苹果?“

别慌,显示的值不可名状,但我们可以用”有名字的容器“代替:

@EventFirst
  #Dim Stone = 3
  #Dim Apple = 3
  PrintV Stone
  PrintV Apple
  Quit
1
2
3
4
5
6

运行下来:

33
1

让我们详细地看看发生了什么:

  • #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
1
2
3
4
5
6
7

输出:

32
1

完美!程序正确地理解了我们的意思,并且把两个3正确地区分了开来!不仅可以设置新的值,我们还可以对他进行各种操作和运算,但那都是后文了,至少现在,我们可以知道,”有名字的容器“真的很方便!

常量的定义与打印

显而易见,我们现在的脚本,即使运行一百次,也不会发生任何变化,只会简单地输出我们已经预先写好的字符串。

我们来尝试写一些不那么“直接”的东西,请将System.erb中的内容改为这样:

@EventFirst
#Dim Const Food = 0
  PrintV Food
  Quit
1
2
3
4

运行!我们得到下列输出:

Hello World!
1

同样成功!

但……为什么?

我们现在突然遇到了几个不认识的代码以及几个不熟悉的用法。不过不用担心,我们分别看看:

  • @EventFirst定义函数。你已经学过了。
  • #Dim:定义(常量或变量)。这是你第一次见到它,不过它很简单,它的作用就是告诉游戏引擎:“看好了!我接下来要定义一个东西,它可能是常量或者变量”。这样游戏引擎就能做好相应准备。有关更多的定义常量定义变量,请移步至此处
  • Const常量关键字。这很好理解,毕竟前一个短语已经成功地吸引到引擎的注意了,紧跟着的这个关键词就是明确地说这次定义的就是定义的常量
  • Food:变量名。新定义的常量/变量名称。常量/变量完成定义后,可通过该名称再次找到这个常量/变量。
  • =:赋值符号。代表将符号右侧的数据装载到符号左侧的变量内,具体到这个地方,符号右边的“Hello World!”这句话,会装载到名为“Text”的变量内。
  • 0:一个数值。
  • PrintV:一个语句,可以将装载于语句后面的变量内的数据显示在屏幕上。
  • Quit:退出。你也已经学过了。

看上去突然增加了许多内容,但细细一捋,才发现游戏脚本就像小说一样,虽然有点絮絮叨叨,但也能被简简单单的理解,不是吗?

变量的定义与打印

好了,我们现在已经有一个方法实现不那么“直接”的数据暂存了,但仍然不能够通过改变数据来为游戏增加变化。具体地说,如果我们就是想改变“Hello World!”的文本,怎么办!

我们改变脚本:

该代码含有可期待的错误

@EventFirst
#Dim Const Food = 0
  Food = 1
  PrintV Food
  Quit
1
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
1
2
3
4
5

运行,看到输出:

How Are You?
1

成功!

但又有两个问题:

  • 为何我们直接删掉了Const
  • 为何我们使用的是Text = How Are You?,而不是Text = "How Are You?"(字符串外有双引号)

我想答案也不复杂:

  1. 对于#DimS语句来说,定义变量是默认用法,在这种情况下,可以省略。
  2. 我暂时也不知道。不过加上双引号后,显示出来的值也带有双引号,说明赋值在#DimS中和在外面独立使用的表现不一样。那就当作是”固定搭配“吧2333333
Last Updated: 2021/9/30 上午5:06:17
Contributors: Miswanting