;=========================================================== ; 2010/9/28 title "空雲" ; version. 1.0 ; GAM-22 ;=========================================================== /* start.ax : 3634/6000 byte 容量的にはまだ余っているのですが、 費やす方向がまだ定まってないです。 */ ;----------------------------------------------------------- ; constants ;----------------------------------------------------------- ; number one = 1.0 ; size of a perlin noise #const bx 256 #const by bx #const bxy bx*by #const b2x bx*2 #const b2y by*2 #const b2xy bxy*2 ; max of octaves a noise #const octave_max 6 #const octave_2max octave_max*2 ; length of a VRAM #const VRAM_length bxy*3 #const VRAM_2length VRAM_length*2 ; window buffers #enum main_buf = 0 #enum perlin_buf #enum compose_buf #enum buffer_buf ; settings #const slider_max 3 ; 閾値 #enum threshold = 0 ; 風力 #enum wind ; wait #enum wait_ slider_title = "threshold:", "wind:", "wait:" slider_value = 110, 1, 20 dim slider_on, slider_max ; font font_thema = "Palatino Linotype" ; key codes #const esc 128 #const Lclick 256 #const Rclick 512 ; debug mode #const debug 0 if 0 { ;----------------------------------------------------------- ; functions ;----------------------------------------------------------- #defcfunc noise int px, int py // ノイズ参照 mx = px\t my = py\t if px<0 : mx = t-1 if py<0 : my = t-1 return noise_data(mx,my) #defcfunc interpolate double p1, double p2, double p3 // 内挿 m1 = 0.5 * (one - cos(p3 * M_PI)) return p1*(one-m1) + p2*m1 } *top ;----------------------------------------------------------- ; top ;----------------------------------------------------------- #if debug=0 // start up screen font font_thema, 20 pos 0,0 : mes "Please wait..." palcolor 7 repeat 12 gosub *status_bar loop palcolor 12 randomize dim octave, b2xy dim octave_id ;------------------------------------------------------- ; draw two piece of perlin noise ;------------------------------------------------------- repeat octave_2max ; ブロックの幅 s = 1 << (octave_id\octave_max) ; ブロックの数の平方 t = bx/s // ノイズ生成 dim noise_data, t,t repeat t*t noise_data(cnt\t, cnt/t) = rnd(256) loop // // ノイズをスムーズに dim noise_, bx,by repeat t*t x = cnt\t y = cnt/t noise_(x,y) = ( noise(x-1,y-1) + noise(x+1,y-1) + noise(x+1,y+1) + noise(x-1,y+1) )/16 + ( noise(x-1,y) + noise(x+1,y)+noise(x,y-1) + noise(x,y+1) )/8 + noise(x,y)/4 loop // // ノイズを引き伸ばす repeat t*t x = cnt\t y = cnt/t v1 = noise_(x, y) v2 = noise_((x+1)\t, y) v3 = noise_(x, (y+1)\t) v4 = noise_((x+1)\t, (y+1)\t) repeat s*s v5 = interpolate(v1,v2, one/s*(cnt\s)) v6 = interpolate(v3,v4, one/s*(cnt\s)) octave( octave_id/octave_max*bxy + ( y*s+(cnt/s) )*bx + x*s+(cnt\s) ) += 0 + interpolate( v5,v6, one/s*(cnt/s) )*s/64 loop loop // octave_id ++ gosub*status_bar wait 10 loop ;---- #endif // perlin buffer buffer perlin_buf, bx,b2y #if debug picload "い.bmp" #endif #if debug=0 mref VRAM, 66 repeat VRAM_2length // ノイズをバッファに描画 poke VRAM, cnt, octave(cnt/3) loop #endif // compose buffer buffer compose_buf, bx,by mref VRAM, 66 // buffer buffer buffer buffer_buf *main ;----------------------------------------------------------- ; compose ;----------------------------------------------------------- gsel compose_buf ;redraw 0 color : boxf gmode gmode_add, bx,by, 127 d = (mcnt*slider_value.wind)\256 pos 0,0 : gcopy perlin_buf, bx-d, by, d, by pos d,0 : gcopy perlin_buf, 0, by, bx-d, by pos 0,0 : gcopy perlin_buf, 0, d, bx, by-d pos 0,by-d : gcopy perlin_buf, 0, 0, bx, d repeat bxy // パーリンノイズを雲に加工(200ms) c = limit( (peek(VRAM, cnt*3)-slider_value) << 3 , 0, 235) wpoke VRAM, cnt*3, c<<8 | c poke VRAM, cnt*3+2, c loop ;redraw ;----------------------------------------------------------- ; buffer ;----------------------------------------------------------- gsel buffer_buf ;redraw 0 gradf ,,,, 1, $1020ff, $2060ff repeat 6 ; 3*2枚並べる gmode gmode_add, bx,by, 255 pos bx*(cnt\3), by*(cnt/3) gcopy compose_buf loop ;redraw ;----------------------------------------------------------- ; main ;----------------------------------------------------------- gsel main_buf;, 1 // キー入力 key_log = key stick key, Lclick ; setting mode change setting ^= key&Rclick ; [esc] resset if key&esc { palcolor 10 goto*top } redraw 0 x1 = 0, 640, 640, 0 y1 = 0, 0, 480, 480 x0 = -640, 1280, 640, 0 y0 = 0, 0, 480, 480 gmode gsquare buffer_buf, x0,y0, x1,y1 if setting { // settings // base gmode gmode_alpha, 1,1, 128 color 22,22,22 grect 320,240, 0, 500,300 // -Settings- palcolor 10 font font_thema, 30 pos 80,90 : mes "-Settings-" font font_thema, 15 // slider #const slider_left 200 #const slider_right 200+255+1 #const slider_top 190 #const slider_bottom 190+3 #const slider_knob_top slider_top-5 #const slider_knob_bottom slider_bottom+5 #const slider_knob_left 200 #const slider_knob_right 200+1 #const slider_knob_value_left 200-3 repeat slider_max d = 70*cnt if ((key_log&Lclick)=0) * (key&Lclick) * (mousex>=slider_left) * (mousex<=slider_right) * (mousey>=slider_knob_top+d) * (mousey<=slider_knob_bottom+d) { ; catch slider_on.cnt = 1 } ; hold slider_on.cnt &= (key&Lclick) = Lclick if slider_on.cnt { slider_value.cnt = limit(mousex-slider_knob_left, 0, 255) c = 55*(mcnt\2)+200 } else { c = 230 } color c,c,c ; 配列変数の参照はコストが高いので dup v1, slider_value.cnt ; title pos 100,180+d : mes slider_title.cnt ; bar boxf slider_left, slider_top+d, slider_right, slider_bottom+d ; knob boxf slider_knob_left+v1, slider_knob_top+d, slider_knob_right+v1, slider_knob_bottom+d ; value pos slider_knob_value_left+v1, 165+d : mes v1 loop } redraw await slider_value.wait_ mcnt ++ goto *main *status_bar // draw a status bar boxf 16*cnt+2, 32, 16*cnt+15, 64 return