前几天看到了 Splatoon 2 的自动打图的程序的介绍。

解开了一直以来的疑惑不说,能把更自然的笔画的图更少失真的变成投稿,岂不美哉。(用触摸笔在 NS 屏幕上画过的应该都懂那种一个像素点要戳好几次才能点在期望的位置上的痛苦)

就是…… 可还是得一个小时啊?


喜闻乐见的 tl;dr 环节:

去追原 repo 吧。挺好的。除了最初的 Teensy ,现在 Arduino UNO R3 (搭载 Atmega16U2 用来模拟 USB 设备)也能用,就改一个配置项就行。

gbatemp 上有说 Atmega32U4 的板子也行。但是因为最终程序超过 8K ,所以 Atmega8U2 就只好勉为其难的下线了。

https://github.com/shinyquagsire23/Switch-Fightstick


以下是折腾流水账。

前言

首先还是得想好到底对哪里不满吧。

  • 每一行都是从左向右画的。从最右换行之后能不能接着画,不回到最左?
  • 因为清屏操作默认是清成白底的,所以如果是白色的部分能不能直接跳过不画?
  • 以上。

那就看代码吧

比我预想的要好的一点是,其实改的地方并不多。

本来还猜想是不是得预处理图片变数组的时候把偶数行的数据反过来记,结果一看 PRINT_DOT 里面每个点要不要点的 condition 都是现用现算 index 取的。挺好。

然后 MOVE_DOT 里面区分一下奇偶行,加上左端换行的 condition ,控制一下下一个操作(是不是略过空白点),够了。

本来是想在 MOVE_DOT 里包含换行处理的,在某一次尝试里突然意识到一次 loop 里只能发生一次按键操作… 虽然能同时按俩按键。

反正是废品,过程就省了吧

反正最后出来的是这样的:

咱还是说中文吧

最后一算时间,还是一个多小时。(这个是自带的图)

从这点上出发,我就不太想追究偶数行的点错和换行不准的问题了。虽然理论上来说我改的这版,留白的地方越多,图画的也就越快。

猜想可能因为连续 MOVE_DOT 的关系,实际上在默认的 60ms 间隔下,移动的空白并不精确。

但是如果用加长延迟的方法来修正(先暂且能够修正)这个问题的话,那前面省下来的时间是为啥…

反正都是一个多小时自动打图了,多等个 10 分钟又不会怎样。

…看来我还是太高估自己一闪的灵光所在的 level 了。完。