我对 Minecraft 的向往由来已久,久到总想自己手搓一个。上一篇的「垃圾制作」是第一次下手,这一篇的工程接着往前走:2016 年 11 月备好的素材,2017 年 12 月变成了一个真正能玩的 2DMC。

素材:从游戏里截图,用 PS 抠

第一步不是写代码,是备料。方法说穿了很简单:自己开着 Minecraft 截图,再用 PS 一张一张抠出来、修好。五把镐子按科技树排开——木镐、石镐、铁镐、金镐、金刚石镐,一级不落:

木镐 石镐 铁镐 金镐 金刚石镐

方块类的贴图也备齐了,比如泥土和原石(鹅卵石):

泥土

原石

行走图也画了一张,文件名叫「屎蒂夫.png」——steve 的抽象版。最绝的是正视图,居然张了这么大的一个嘴巴:

屎蒂夫行走图

一年后,在 RMXP 里动手

2017 年 12 月 16 日傍晚 18:37,一个标题叫「RMXP版MC」的工程存了盘:默认脚本打底,加一个全方位像素移动脚本,再配一个 66RPG 的鼠标脚本——这就是第一版 2DMC 的全部家当。两个小时后的 20:06,它被打包成了「rmxp-minecraft ver beta 0.0.0.0.1」,同时还复制出一份 beta 0.0.0.0.5。然后是 2018 年 1 月 1 日的 beta 0.0.0.1.0。

这里得说实话:那时候我其实还不会写代码,用的都是 RMXP 这个游戏制作平台来学习。beta 0.0.0.1.0 的脚本清单就是证据——

物品仓库(66RPG)/ 简易小地图(66RPG)/ 秘籍(66RPG)/ 全方位像素移动 Ver α / 一个自定义的 Game_Character 补丁

我的工作是把这些从社区下载的脚本拼起来、调参数。比如像素移动脚本的开头,留着我自己写的配置注释:

1
2
$ud_ok = true   # 上下按键失效
$airjump = 1 # 空中跳跃开启

一个 2DMC 最要紧的两件事都在这两行里:上下方向键失效(不然就成了普通 RPG 的格子走路),空中跳跃开启(不然就不是 Minecraft 的手感了)。

游戏长这样

标题画面干脆直接用了 Minecraft 的图片,菜单就三项:新游戏、继续、退出。

rmxp-minecraft 标题画面

先交代操作:方向键里只有左右能操控移动,Z 键是跳跃——一跳能跳四五格方块,和 Minecraft 完全不一样,主要是我找的重力脚本只支持跳这么高,当时也改不动,没招了;空格是挖掘键,跳起来还能用空格挖头顶的树叶。背包要按 ESC 呼出——因为不会改 RMXP 的底层,这个键也绑定不了别处。

选「新游戏」,初始化完毕,直接落在地图上:

初始化进入

落地第一眼是这个画风:深绿草地、泥土坡面,树干是木头、树叶却是白色的——当年找到的树叶贴图就是白色,所以树长成了这副样子。你别说虽然2D和3D的差距在这里了,但搭得有模有样,不过地图是固定的。

落地第一眼

开局第一件事当然是砍树——跳进树冠里,把白色树叶挖下来顺便挖掘了两个木头,然后发现了这边也能树木悬空,哈哈:

砍树

攒够木头就开始合成,面板里能看到配方:木板(1原木=4)。第一次想合成点别的,吃了闭门羹——「材料不够!」;顺手把背包里的泥土放了一块到地图上,你别说这样的合成系统已经是我设计过了写出来得了,在这个平台里面我不会重编码,所以没办法:

合成

合成之余按 ESC 打开背包,状态栏则记着 steve 本人的数据:Lv、血条 100/100,还有游戏时间和方块计数:

状态面板

进入物品界面,家底全记在这里面:泥土 6 块、苹果 3 个、木门 1 扇……,这个木门不知道是一开始就放在这里的还是怎么来的:

背包

有了木镐就往下挖石头,挖出石头再合成石镐,换上石镐就能挖铁矿了。顺带一提,墙上还有种紫色的矿物——我的世界原版里没有,是我自己用PS调色调出来的测试矿,怎么挖都挖不动:

挖矿

挖矿现场还开着配方表:熔炉=6圆石、小镐子=1木板+1材质、小斧头=2木板+1材质,进入小镐子的界面还让玩家选了一次材质,有木头石头和铁的:

配方表

继续往下挖掘,左下角看到一个小房间,挖过去试了试,门是关的,居然能按空格就能开门交互,就是挖掘也是空格的话好像是冲突的呢,技术不够呀:

小房间

再往下就是这一层就出现了钻石。只不过钻石旁边,往往就伴着危险的岩浆。岩浆倒是出乎意料的精致——居然做了动画效果,会在几张贴图之间来回切换:

钻石和岩浆

挖了一会儿手痒,开始测试死亡机制——跳进岩浆里,玩家闪红,并且扣血,最后黑屏,直接死亡了:

死亡一

回到主菜单之后重新开始游戏,一落地就发现右边有一条竖直的管道,跳下去先扣了一截血,落地又挨着岩浆,没一会儿就黑屏了,又被岩浆烫死了,这说明游戏是有做掉落伤害的,原理大概就是:

死亡二

打开编辑器,看看这套东西是怎么写的

光看演示不够,这次把 RMXP 的编辑器也打开了,截了九张关键部位。编辑器里可没有什么图例,所以每张图我直接点名,说清它在哪、要看的是什么。

先看名叫 tools 的工作地图——游戏里出现过的每一种方块,都在这边存了一份事件模板。左下角的地图列表也能看到全部家当:tools、开始、主世界、0.0测试用,一共四张图。图里这个事件用的是 0004:斧头 变量结算(砍树专用),挖到哪儿了就切换哪张 ores 贴图:

tools 地图:所有方块的事件仓库

图 1|tools 地图:所有方块的事件仓库

是不是觉得大地图会按照这边的方块事件来随机生成?那就错了。接下来这张是「主世界」——完全就是一个方块一个方块手动放置的死地图,没有任何随机生成:

主世界:一个方块一个方块摆出来的死地图

图 2|主世界:一个方块一个方块摆出来的死地图

再来看模拟天色变暗的并行事件:每三帧把画面色调调暗一点,从 -5 一路加到 -75——用色调硬生生垒出了黄昏:

天色变暗:更改画面色调的并行事件

图 3|天色变暗:更改画面色调的并行事件

下一张进了数据库,公共事件列表里居然还藏着个作弊器——「作弊器—tp 工具」:输入想去 X/Y 坐标,直接场所移动过去,全图瞬移:

作弊器—tp 工具:输入坐标全图瞬移

图 4|作弊器—tp 工具:输入坐标全图瞬移

这张是「小镐子的合成」公共事件:先选材料定硬度——木板(1硬度)、圆石(3硬度)、铁链(5硬度);判定持有材料后扣材料、给木镐,并给变量 [0002:稿子] 赋值——木板赋 1,圆石赋 3。这个数值,就是后面能不能挖的入场券:

小镐子的合成:材料定硬度

图 5|小镐子的合成:材料定硬度

这张是石头方块的事件(EV203):先赋 特殊=10,再减去稿子变量的数值;稿子>=1 才进入循环,每三帧 特殊-=1,按剩余量在 ores 贴图之间切换——挖石头的手感就是这么来的:

石头方块:按稿子硬度播放破坏动画

图 6|石头方块:按稿子硬度播放破坏动画

这张是铁矿的事件(EV483):结构一模一样,只是入场券门槛抬到了稿子>=2。木镐(硬度 1)只能干瞪眼,石镐(硬度 3)才能挖:

铁矿事件:硬度门槛 2

图 7|铁矿事件:硬度门槛 2

这张是岩浆的事件:碰到主角,独立开关 A 打开:

岩浆事件:碰到的瞬间打开独立开关 A

图 8|岩浆事件:碰到的瞬间打开独立开关 A

它还有第二页(出现条件:独立开关 A 为 ON),专门处理后果:显示 [受伤] 动画、扣 [steve] 血量 5 点、等五帧,然后把独立开关 A 关回去——回到第一页,等着下一次烫。一开一关,岩浆就成了一块会持续烫人的方块:

岩浆事件第二页:掉血与受伤动画

图 9|岩浆事件第二页:掉血与受伤动画

至于掉落伤害,原理大概率也是同一套思路:跳落的那一下按高度结算扣血,然后再走一次受伤演出。

以条件而论,这局录像就是当时能做到的全部了:一个不会写重代码的初三学生,靠拼社区脚本、改参数,在 RPG 引擎里搭出了一个能挖矿、能合成、会掉血、会死亡的方块世界。2018 年 6 月我要参加中考,这段游戏就录在初三那年——对一个初中生来说,做到这个份上,已经挺不错了。

beta 0.0.0.1.0 之后

版本号从 0.0.0.0.1 走到 0.0.0.1.0,第四位数字前进了一位,1.0 还遥遥无期。但一个”不会写代码的人”用拼脚本的方式,真的做出了一个能存档、能走进去的方块世界——这一步的意义,比版本号大得多。