pico-8 精彩代码解析 2

作者:83872309
2019-11-06
10 6 5

作者:2DArray 

来源:twiiter

神奇的漩涡效果,代码发布在作者的 twitter 上,整理下只有 11 行:

p={130,141,2,136,8,137,142,9}
for i=1,8 do
pal(i-1,p[i],1)
end
::_::
x=rnd(128)
y=rnd(128)
d=sqrt((x-64)^2+(y-64)^2)-t()*4
a=atan2(y-64,x-64)*16
pset(x,y,(a+d/4)%8)
goto _

1-4 行代码是调色板映射代码,用来实现渐变的颜色。我们知道 pico8 只有 16 种颜色,16 种颜色很难配合出渐变的过渡效果。这里作者用到 pico8 隐藏的调色板,变量 p 中的 130, 141, 136, 137, 142 都是隐藏调色板的色号。这个隐藏的调色板在官方文档里也没有介绍,在论坛翻了了好久才找到,新旧两个调色板的对比,我做了个对比图:

6-9 行定义了 4 个参数:

  • x, y 在屏幕范围内随机取值
  • d 是取的点 (x, y) 相对于 (64, 64) 即中心点的距离,后面的 t()*4 是为了使距离根据运行时间改变
  • a 是点 (x, y) 相对于中心点的角度,pico8 中 atan2 的返回值是 0-1,对应着 0°-360°。后面的 *16a 的取值变成了 0-16

第 10 行 根据 da 的值将对应颜色填充到 x, y。我们可以分开来看下


pset(x,y,a%8)

如果只用 a 来计算,会将屏幕按照点的到中间点的角度分割成 16 份,这个比较好理解,因为 a 的取值是 0-16,相当于把屏幕中的点映射到 16 个区域。

pset(x,y,(d/4)%8)

d 是点到中心的距离,相同距离的圆形区域被填充同一个颜色。

pset(x,y,(a+d/4)%8)

当把角度和距离加起来的时候神奇的图像就出现了,而且角度 a 必须于 8 的倍数相乘才可以对齐,不知道原理是什么,真的很神奇。

本文为用户投稿,不代表 indienova 观点。

近期点赞的会员

 分享这篇文章

您可能还会对这些文章感兴趣

参与此文章的讨论

  1. Erufu 2019-11-06

    想起了Circa Infinity

  2. love2dgame 2019-11-06

    你们真的会折腾自己...

  3. 方程 2019-11-07

    下一期就是触手了吧 ♥

  4. RanceA 2019-11-18

    a是初始角度,d是增量角度
    a越大周期越短线条越细
    d决定了弯曲程度,d系数越大远处的线条颜色时针方向越超前,图像越弯
    喜欢这种的朋友可以看看shadertoy

  5. GreenPack 2019-12-24

    因为(a+d/4)%8 这里有除以8取余 所以a的系数需要是8的倍数才能刚好形成一个循环。如果改成7种颜色,那系数就要取7的倍数了。

您需要登录或者注册后才能发表评论

登录/注册