; gzoom を使って画像を拡大縮小描画する #define IMG_FILE "char1_256.png" #define SCR_W 512 #define SCR_H 288 ; 同梱ファイル #pack IMG_FILE #packopt name "gzoom_01" ; 生成ファイル名 #packopt type 0 ; .exe生成を指定 #packopt xsize SCR_W #packopt ysize SCR_H ; ウインドウの初期化とサイズ取得 screen 0, SCR_W, SCR_H, 0 gsel 0 ; width SCR_W, SCR_H dispw = ginfo_winx disph = ginfo_winy cls 4 ; 画像を読み込み imgid = 3 buffer imgid, 2048, 2048 picload IMG_FILE imgw = ginfo_winx imgh = ginfo_winy ; 仮バッファ作成 tmpid = 4 buffer tmpid, 4096, 4096 angle = 0 ; onkey goto *jobend ; 何かキーが押されたら終了する *mainloop ; ESC key to exit stick k if k & 128 : goto *jobend redraw 0 gsel 0 ; ウインドウID0 を描画先として選択 ; 背景を青一色で塗り潰し color 0, 128, 255 boxf ; 描画先、描画元の座標やサイズを求める scale = sin(deg2rad(angle)) * 2.5 + 3.0 dst_w = int(double(imgw) * scale) dst_h = int(double(imgh) * scale) dst_x = dispw / 2 - (dst_w / 2) dst_y = disph / 2 - (dst_h / 2) src_w = imgw src_h = imgh src_x = 0 src_y = 0 kind = 2 switch kind case 0 ; gzoomのみを使った事例 ; 拡大縮小描画はできているが、透明色を扱えない gsel 0 gmode gmode_rgb0 ; RGB=(0,0,0)を透明色として扱う pos dst_x, dst_y gzoom dst_w, dst_h, imgid, src_x, src_y, src_w, src_h, 0 swbreak case 1 ; gcopy を使った事例 ; RGB=(0,0,0)を透明色として扱えるが、拡大縮小描画はできない gsel 0 gmode gmode_rgb0 ; RGB=(0,0,0)を透明色として扱う pos dst_x, dst_y gcopy imgid, src_x, src_y, src_w, src_h swbreak case 2 ; 仮バッファを使ってgzoomで透明色を扱ってるように見せかける事例 ; 拡大縮小しつつ、RGB=(0,0,0)が透明色になっている ; 一旦、仮バッファに gzoom で拡大縮小描画 gsel tmpid pos 0, 0 gzoom dst_w, dst_h, imgid, src_x, src_y, src_w, src_h, 0 ; 仮バッファから実スクリーンに gcopy でコピー gsel 0 gmode gmode_rgb0 ; RGB=(0,0,0)を透明色として扱う pos dst_x, dst_y gcopy tmpid, 0, 0, dst_w, dst_h swbreak swend redraw 1 angle += 3 await (1000 / 60) goto *mainloop *jobend end