Experiment

一片 ASCII 海

四条鲨鱼、几群小鱼,全部由字符绘制。移动鼠标,鱼群会让开;点一下水面,会有波纹。

它是什么

来自 stackedlol/ascii-sharks—— 一个零依赖的 TypeScript 引擎,在 canvas 上把鱼和鲨鱼画成字符。它不渲染图片,只往格子里填字, 所以整个海洋其实是一张字符网格在逐帧重排。

里面在算什么

鱼群是经典的 boids 变体,每条鱼受三个力:跟邻居对齐方向、向局部中心聚拢、靠近时互相推开。 不同物种的权重不一样——沙丁鱼的切向力很强,会绕成一个旋转的饵球;凤尾鱼几乎只对齐, 所以排成整齐的带状;虾虎鱼的随机扰动极大,看上去像一盘散沙。

水流用一个无散度的场驱动,来源于漂移流函数的旋度。无散度意味着它只搬运、不堆积, 所以鱼群不会被推到某个角落挤成一团。鲨鱼会在身后投下阴影,鱼群感知到就会让开。

我改了什么

逻辑一行没动(那份 1500 行的源码在 src/ascii-sharks/),做的是接入:给它一块黑画布、 套上站点的等宽字体、按页面尺寸自适应,并且尊重「减少动态效果」的系统设置——那种情况下它只画一帧静帧, 不会一直跑动画。滚出视口时也会自动暂停。

作者 stackedlol · MIT 协议查看源码 ↗