PICO-8

创建于:2017-11-26

创建人: Humble Ray

5 信息 27 成员
Fantasy Console 的代表 PICO-8 小巧精美多变

pico-8 精彩代码解析 3

83872309 2019-11-01

Image title


作者: Luca@lucatron_

来源:twitter


整理过后14行代码:

c={10,9,8,2,1,0}
fillp(0xa5a5)
function _draw()
 for i=24576,32767 do
  poke(i,peek(i)/2)
 end
 for z=6,1,-.1 do
  for b=0,7 do
   b=b/8+sin(z/8+t()/4)/30
   k=19-sin((6-z)/20)*40*(.5+sin(t()/2+z/9+b*2)/2)
   circfill(64+cos(b)*k,64+sin(b)*k,z*2.3,c[flr(z)]+c[flr(z+.5)]*16)
  end
 end
end

1-2行,c是触手的颜色,顶部到底部由明止暗。fillp是填充样式,点阵图样填充,有种渐变的效果(在最后详细解释)。

Image title


4-6行,是残影效果,这里没有用cls清空画布,直接将屏幕内存中的数值每帧减半,最终降为0透明,来实现透明效果

Image title


10-11行,两个嵌套循环,外层的z表示,每个触手的层数,内层b表示触手的数量(8个)。单个触手是由从下至上,大小递减,颜色逐渐变亮的圆组成,z表示圆的位置,相当于z轴的坐标,从6-1共有60层。

9行,b/8 将八只触手映射到 0-1,pico8中三角函数的参数取值0-1代表着0-360°。在第11行的circlefill 圆的绘制函数中,圆B的位置 x,y =  64+cos(b)*k,64+sin(b)*k 。 其中原点是屏幕的中心点64,64;角度b为每个触手映射的角度,k为圆至屏幕中心的距离。

Image title


10行 计算每个圆至屏幕中心的距离k,我们先把圆的角度b从中去掉看下结果。k=19-sin((6-z)/20)*40*(.5+sin(t()/2+z/9)/2)

Image title


将圆的z轴坐标z映射到至中心的距离k,通过sin的映射使得,距离k根据z呈现正弦波的形状。

最后把角度b加回去,k=19-sin((6-z)/20)*40*(.5+sin(t()/2+z/9+b*2)/2) 使得不同的触手在波形上拥有不同的位置。

Image title


第11行 circlefill 画圆,其中圆的半径 根据z轴距离变化,z*2.3。圆的颜色c[flr(z)]+c[flr(z+.5)]*16 是两个颜色相加,利用高低位的不同颜色,再配合第2行的fillp实现两种颜色的填充图样。


最后补充下fillp的用法。pico8中用一个4*4的图来填充 circ() circfill() rect() rectfill() pset() line()等函数画的图形。

Image title

16个像素点用上图表格里的数字代表,如果想让某个点不着色就将点对应的数值累加,将最终得到的值传给fillp,比如只让对角线

32768,1024,32,1没有颜色,fillp(32768+1024+32+1)

Image title


也可以7+8*16 指定第二个颜色。



(转发自:原日志地址

近期喜欢的会员

 

加入 indienova

  • 建立个人/工作室档案
  • 建立开发中的游戏档案
  • 关注个人/工作室动态
  • 寻找合作伙伴共同开发
  • 寻求线上发行
  • 更多服务……
登录/注册