; gzoom を使って画像を拡大縮小描画する ; 木をたくさん並べて手前に動かす #define IMG_FILE "images\\trees_512x512_32col.png" #define BG_FILE "images\\bg_16col.png" ; #define SCR_W 640 ; #define SCR_H 360 #define SCR_W 1280 #define SCR_H 720 ; 同梱ファイル #pack IMG_FILE #pack BG_FILE #packopt name "gzoom_02" ; 生成ファイル名 #packopt type 0 ; .exe生成を指定 #packopt xsize SCR_W #packopt ysize SCR_H #define OBJ_MAX 64 onkey goto *jobend ; get windows size screen 0, SCR_W, SCR_H, 0 gsel 0 ; width SCR_W, SCR_H dispw = ginfo_winx disph = ginfo_winy cls 4 ; load image imgid = 3 buffer imgid, 2048, 2048 picload IMG_FILE imgw = ginfo_winx imgh = ginfo_winy bgimgid = 4 buffer bgimgid, 1280, 720 picload BG_FILE bgw = ginfo_winx bgh = ginfo_winy tmpid = 5 buffer tmpid, 4096, 4096 dim objx, OBJ_MAX dim objy, OBJ_MAX dim objz, OBJ_MAX dim objim, OBJ_MAX dim objsc, OBJ_MAX dim zlist, OBJ_MAX dz = 150 zd = 20 z = (OBJ_MAX * zd) + dz repeat OBJ_MAX gosub *get_new_x objx(cnt) = x objy(cnt) = 100 objz(cnt) = z objim(cnt) = rnd(4) objsc(cnt) = (double(rnd(50)) / 100.0 - 0.25) + 1.0 z -= zd loop init_cnt = 0 *mainloop ; ESC key to exit stick k if k & 128 : goto *jobend ; z値でソート repeat OBJ_MAX zlist(cnt) = objz(cnt) loop sortval zlist, 1 ; 大きい順でz値をソート redraw 0 gsel 0 ; 背景を描画 if 0 { color 0, 128, 255 boxf 0, 0, dispw, (disph / 2) color 60, 132, 76 boxf 0, (disph / 2), dispw, disph } else { gmode 0 pos 0,0 gcopy bgimgid, 0, 0, bgw, bgh ; color 60, 132, 76 ; boxf 0, (disph / 2), dispw, disph ; gradf 0, (disph / 2), dispw, (disph / 2), 1, $B1A192, $2E1E11 gradf 0, (disph / 2), dispw, (disph / 2), 1, $449044, $080808 } init_cnt = 0 ; 木を描画 repeat OBJ_MAX sortget i,cnt ; ソート前のインデックス値を取得 ; 描画先のサイズや座標を取得 scale = objsc(i) * (double(disph) * 8.0 / 10.0) * double(dz) / double(objz(i)) dst_w = scale dst_h = scale dst_x = (objx(i) * dz / objz(i)) + (dispw / 2) - (dst_w / 2) dst_y = (objy(i) * dz / objz(i)) + (disph / 2) - dst_h ; テクスチャのソース座標を算出 kind = objim(i) src_w = (imgw / 2) src_h = (imgh / 2) src_x = (kind & 1) * src_w src_y = ((kind >> 1) & 1) * src_h if dstx_x < dispw & (dst_x + dst_w) > 0 { ; gzoom は透明色を扱えないので小技が必要 ; 一旦、仮バッファに拡大縮小描画 gsel tmpid pos 0, 0 gzoom dst_w, dst_h, imgid, src_x, src_y, src_w, src_h, 0 ; 仮バッファから実スクリーンに gcopy でコピー ; gcopy なら RGB=(0,0,0) を透明色として扱える gsel 0 gmode gmode_rgb0 ; RGB=(0,0,0)を透明色として扱う pos dst_x, dst_y gcopy tmpid, 0, 0, dst_w, dst_h } objz(i) -= 4 if objz(i) <= (dz / 3) | dst_x > dispw | (dst_x + dst_w) < 0 { gosub *get_new_x objx(i) = x objz(i) += (OBJ_MAX * zd) init_cnt += 1 } loop redraw 1 await (1000 / 30) goto *mainloop *get_new_x x = rnd(2000) + 250 if rnd(100) > 50 : x *= -1 return *jobend end