pico-8 精彩代码解析 4
来源:twitter
整理了一下作者的代码,共计15行:
for i=0,11 do pal(i,({135,10,9,137,8,136,2,130,128})[i+1],1) end function _draw() srand(3) rectfill(0,0,127,40,0) for y=52,170,2 do k=y/19-2 x=y*44%138-4 h=40+rnd(20) for i=-20,20 do line(x+i*h/70,y,x+sin(t()/4+x/500+y/300)/7*h,y-h,i>0 and k+2 or k) end end end
1-3行, 将调色板的颜色映射,这里用到了第二块调色板的颜色,更好的表示渐变。关于第二块调色板的内容,在解析 2里有详细说明。
5行, 初始随机数种子,在计算树木高度的时候详细解释为什么每次绘制要初始随机数
6行, 画背景,我们用cls()代替手动绘制背景,可以更好的测试
7行, 循环得到y,y值是树的y轴位置,从52-170,每两个树之间相差2
8行, k用来将树按照y值的顺序,映射到调色板的色值,实现近景到远景的颜色渐变
9行, 计算树的x坐标,根据y轴坐标的倍数与138取余,就把树木限制在0-138的范围内一排排的码好。
10行, 计算树木的高度h,这里每棵树的高度是随机的,但是每帧绘制的时候同一棵树的高度是不变的,也就是每一帧绘制的时候rnd(20)会得到同一个随机值,这就得益于在第5行,绘制开始的时候重新初始化随机数种子,使得每帧获得随机数是一致的。
11-13行,绘制一棵树。pico8没有直接绘制三角形的函数,这里用40根线段拼成了一个三角形。我们先看下简化的代码,line(x+i,y,x,y-h,i>0 and k+2 or k) 。i值(-20 -> 20)是三角形底边的x轴偏移量,从线段 起点(x-20,y) 终点 (x,y-h) 到 起点 (x+20,y) 终点 (x,y-h)] 共计画了40跟线段组成了三角形,三角形的底边宽40。简化的效果图如下。
line(x+i*h/70,y,x+sin(t()/4+x/500+y/300)/7*h,y-h,i>0 and k+2 or k) 原代码计算起点时将偏移量i乘以树木的高度h/70用来表示,矮的树木拥有更窄的底边。计算终点时,树尖的x坐标根据时间,取正弦值,用来模拟来回摆动的效果,且越矮的树木摆动幅度越低。最后根据偏移量i来觉得颜色,i<0为树木左半边,i>0为树木右半边。