Back
Featured image of post 《超级马力欧创作家2》评论自动绘图

《超级马力欧创作家2》评论自动绘图

在“马造2”的评论中绘制自定义图像

在《超级马力欧创作家》下文简称为“马造”一代中,评论功能就已经出现了,玩家可以给正在游玩的关卡添加涂鸦评论,但是随着 2017 年 Miiverse 服务的关闭,马造 1 的评论功能也随之下线。但是在马造 2 中,评论功能又重新回归,玩家可以添加文字、涂鸦,或是预设的图案评论。在涂鸦模式下,除了使用触屏、摇杆操作画笔外,我们还可以使用十字键进行像素级别的精确绘制,所以本文要实现的目标也就比较清晰了:通过自动输入手柄十字键操作指令,将数字化的图像绘制在马造 2 的评论中。

前人的工作

在任天堂的另一款游戏《Splatoon》系列中,也出现了类似的绘图功能,玩家在游戏广场中绘图投稿后,玩家的形象、绘制的作品会随机出现在其他玩家的广场上。针对这个机制,已经有不少类似的自动绘图的轮子,但 Splatoon 系列的涂鸦系统只支持黑白两种颜色,而马造 2 的涂鸦支持 17 种颜色。所以我们可以在这类项目的基础上进行扩展,适配马造 2 的涂鸦系统,加入色彩的支持。

Splatoon 中的涂鸦投稿 image via

Splatoon 中的涂鸦投稿 image via /u/Stofers
Splatoon 中的涂鸦投稿 image via /u/Stofers

马造 2 中的自动绘图

马造 2 的涂鸦板
马造 2 的涂鸦板

马造 2 的涂鸦板画布大小为 320x180,支持 17 中预设固定色彩,扳机键可以左右切换颜色,最小的画笔大小可进行像素级别的绘制。所以整体上的思路是:通过外部硬件模拟 USB 手柄,输入十字键指令调整位置,蛇形遍历整个画布、ZR/ZL 扳机键指令更换画笔颜色、A 键着笔绘制。

硬件

硬件上比较简单,我使用的是 Teensy 2.0++,通过转接线转接到 NS 的 C 口连接即可。

硬件连接
硬件连接

图像处理

因为涂鸦板的色彩空间有限,在处理真彩色图像时要对色彩重新采样。常用的方式主要有两种:

  • 对于每个像素,采样取值为色彩空间中最近的色值;
  • 牺牲分辨率,通过抖动算法取得整体观感上更佳的图像。

这两者的区别及应用已经在之前折腾 GameBoy 打印机时提到过。下面以一副图像为例,分别展示各个方法处理后的图像:

原始图像
原始图像
抖动采样
抖动采样
平均采样
平均采样
黑白灰采样
黑白灰采样

一般情况下,抖动采样更适合真实拍摄的图像;平均采样适合矢量图像。

编码与绘制

图像在 PC 上预处理完毕后,需要写入到 Teensy 2.0++ 中以便于后续绘制。因为总共有 17 种色彩取值可能,我在这里使用 5 bit 编码一个像素,横向编码理论上有更高效的方案,但方便起见就牺牲一下空间,对应关系如下:

颜色 序号 编码
白色 0 0 0000
黑色 1 0 0001
灰色 2 0 0010
紫色 3 0 0011
浅紫色 4 0 0100
紫色 5 0 0101
浅紫色 6 0 0110
蓝色 7 0 0111
浅蓝色 8 0 1000
绿色 9 0 1001
浅绿色 10 0 1010
橘色 11 0 1011
黄色 12 0 1100
棕色 13 0 1101
米黄色 14 0 1110
深红色 15 0 1111
红色 16 1 0000

将蛇形顺序编码后的图像写入到image.c中的数组里,绘制时可直接使用。

在绘制时,控制十字键蛇形遍历画布,对于每一个像素点:

  • 如果是白色,直接继续遍历下一个像素点;
  • 如果非白色,控制 ZR/ZL 扳机键,就近移动到目标色彩,按下 A 键着笔。

具体的代码实现:https://github.com/HFO4/SMM2-Printer

结果

 
 

因为绘制过程十分耗时,所以也就没画几张。不过绘制时的音效还是挺带感的:

YouTube Link

最后在超级小桀的关卡下画了一个,没想到还真被桀哥翻牌了hhh,具体可见 2019 年 8 月 14 日直播录像 P2 30 分 54 秒起。

 

Licenced under CC BY-NC-SA 4.0
views