函数的定义与用法
前言与确认
写到现在,我们所有的代码都挤在 @EventFirst 里。可游戏一旦复杂起来,几百上千行堆在一起,改一行都要找半天。函数就是解决这个问题的:它把一段逻辑打包起来,起个名字,之后想用就“叫”它一次。
先确认一下我们现有的工程文件夹结构:
root/
├─ emuera.config
├─ Emuera1824.exe
├─ CSV/
└─ ERB/
└─ System.erb其中,System.erb的代码为:
erb
@EventFirst
Print Hello World!
Quit定义函数
定义一个函数,就是给一段代码起个名字。名字前要加 @:
erb
@EventFirst
CALL Greet
CALL Greet
Quit
@Greet
PrintL 你好呀!
RETURN@Greet 这一行表示“下面开始是 Greet 函数的内容”,RETURN 表示“函数到此结束”。运行上面的脚本,会输出两遍:
你好呀!
你好呀!在这里,@EventFirst 和 @Greet 都是函数。区别只是:@EventFirst 由引擎在“新游戏开始”时自动调用,而 @Greet 由我们自己用 CALL 叫出来。
调用函数
调用函数用 CALL,后面跟函数名:
erb
CALL Greet给函数传参数
函数可以接收“材料”,这叫参数。传进来的数值放在 ARG 里,字符串放在 ARGS 里:
erb
@EventFirst
CALL Greet, "小明"
CALL Greet, "小红"
Quit
@Greet, ARGS:0
Print 你好,
PrintS ARGS:0
PrintL !
RETURN输出:
你好,小明!
你好,小红!- 定义时写
@Greet, ARGS:0,表示这个函数接收一个字符串参数; - 调用时写
CALL Greet, "小明",把"小明"传进去; - 函数内部就能通过
ARGS:0拿到它。
如果参数是数值,就用 ARG:0、ARG:1……:
erb
@EventFirst
CALL Add, 3, 4
Quit
@Add, ARG:0, ARG:1
PrintV ARG:0 + ARG:1
PrintL
RETURN函数的返回值
函数还能把结果“交回来”,这就是返回值。用 RETURN 返回,调用方从内置变量 RESULT 里取:
erb
@EventFirst
#Dim Sum = 0
CALL Add, 3, 4
Sum = RESULT
PrintL 3 + 4 =
PrintV Sum
PrintL
Quit
@Add, ARG:0, ARG:1
RETURN ARG:0 + ARG:1输出:
3 + 4 = 7可以一次返回多个值,也可以用
RETURNF专门返回表达式;这些属于进阶用法,现在知道有这回事就好。
事件函数:引擎自动调用的函数
前面反复出现的 @EventFirst,其实也是一种函数,只不过它是由引擎在特定时机自动调用的。这类函数叫事件函数。
常见的还有:
@SYSTEM_TITLE:标题画面;@SHOW_SHOP、@EVENTTRAIN、@EVENTCOM:游戏流程中的各个环节。
事件函数是“游戏的骨架”,我们会在内置流程一节里专门认识它们。这里先记住一句话:写函数,就是在给引擎或自己准备一段随时可以调用的代码。
小结
- 函数用
@名称定义,用RETURN结束; - 用
CALL 名称调用函数; - 参数通过
ARG(数值)和ARGS(字符串)传递; - 返回值放在
RESULT里; - 事件函数是引擎在特定时机自动调用的特殊函数。
下一步,我们让游戏能保存进度:游戏的保存与加载。