Skip to content

开发实战经验与技巧

前言

前两篇(入门教程角色的定义、注册、使用与注销)讲的是“怎么写”。这一篇想聊的是“怎么写得更好”——那些只有真正动手做过一个游戏,才会一点点悟出来的经验。

教程依赖

本教程假设您已完成入门教程并读过角色的定义、注册、使用与注销。若您尚未学习过,我们强烈推荐您首先学习相应教程。

先做“最小可玩版本”

新手最容易犯的错误,是一上来就设计一个极其庞大的系统:几十个角色、上百条剧情、复杂的数值公式……然后写了三天发现跑不起来,热情耗尽,弃坑。

正确的做法是:先做一个能从头玩到尾的最小版本

  • 一个角色;
  • 一个循环(打工 → 攒钱 → 结束);
  • 一次存档、一次读档。

它能跑通,你就有了一个“骨架”。之后所有内容,都是往这个骨架上加东西。永远保持游戏是可运行的,这比“一次写对”重要得多。

组织你的 ERB 文件

当脚本超过几百行,就一定要分文件了。一个实用的分法:

ERB/
 ├─ System.erb        ; 标题、初始化、主循环等骨架
 ├─ Shop.erb          ; 商店/主界面相关
 ├─ Train.erb         ; 训练相关
 ├─ Character.erb     ; 角色相关的通用函数
 └─ Utils.erb         ; 通用小工具

文件名用英文、首字母大写(参考 MCS 代码风格)。引擎会读取 ERB/ 下的所有 .erb,所以文件怎么分,只影响你找代码的难度。

把文本和逻辑分开

Era 游戏的文本量往往极大,如果和逻辑混在一起,改一句台词都要在代码里翻半天。

一个常用的做法是:把大段文本放进单独的“口上”文件,主逻辑只负责“什么时候显示哪一句”。这样:

  • 改文案不用碰逻辑;
  • 逻辑出问题时,也更容易定位。

主循环是游戏的发动机

对大多数游戏来说,@SHOW_SHOP(或你自己的主循环函数)就是心脏。玩家的每一个操作,最终都回到这里。

写主循环时记住两点:

  1. 保持它简单——它只负责“显示选项、读入选择、分发处理”;
  2. 每个分支都要能回到主循环——否则玩家会“卡”在某个界面出不来。

一个健壮的主循环,通常长这样:

erb
@SHOW_SHOP
  ; 1. 显示状态
  ; 2. 显示可选操作
  ; 3. INPUT 读取选择
  ; 4. SELECTCASE 分发处理
  ; 5. 回到开头

数值设计的小建议

  • 不要把数值定得太死:用常量一样含义的“配置变量”集中管理,以后调整方便;
  • 让前几次操作就能看到变化:如果玩家玩十分钟还没感觉到成长,很难坚持下去;
  • 给点随机性RAND:100 之类的随机数能让重复操作不那么乏味,但别让随机决定一切。

调试与兼容

  • 出错了先看 emuera.log,再看错误与异常一节;
  • 开发时多用 ASSERT 守住前提,问题会暴露得更早;
  • 如果你打算让别人也能玩,先确认对方用的是哪一款引擎/改造版,不同改造版支持的特性不同(参考 Era 系列历史与 Eramaker 的差异)。

关于性能

大多数文字游戏的性能瓶颈,其实都出在循环上。

  • 能一次算完的,别放在每帧/每次输入里反复算;
  • 大批量地给数组赋值,用 VARSET 这样的内置命令,比手写 FOR 循环快得多;
  • 真的卡了,再用 AWAIT 做耗时任务的进度提示。

在绝大多数情况下,可读性比微小的性能提升更值得投资

一份“检查清单”

在发布你的第一个游戏之前,不妨过一遍:

小结与结语

  • 先做最小可玩版本,再往上加内容;
  • 用文件把代码分门别类;
  • 把大段文本和逻辑分开;
  • 主循环要简单、要能回到自己;
  • 数值、调试、性能都要为“可玩”服务。

到这里,指南部分就全部结束了。剩下的,只有一件事:去写你自己的游戏吧。 遇到问题时,随时回来查阅参考区域。

GPL-3.0+ Licensed