; 画面外にはみ出す分、幅や高さを減らして gzoom で拡大縮小描画 #define SCR_W 640 #define SCR_H 360 ; #define SCR_W 1280 ; #define SCR_H 720 #define FRAMERATE 60 ; 同梱ファイル / bundled files #define SPR_FILE "trees.png" #pack SPR_FILE #packopt name "gzoom_03" ; exe filename #packopt type 0 ; generate ".exe" #packopt xsize SCR_W #packopt ysize SCR_H ; onkey goto *jobend randomize 0 ; 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 spite image sprimgid0 = 6 buffer sprimgid0, 1024, 512 picload SPR_FILE spr0w = ginfo_winx spr0h = ginfo_winy ; init temporary image buffer tmpid = 7 buffer tmpid, 4096, 4096 x = 16 y = 16 *mainloop #define KEY_ESC 128 #define KEY_UP 2 #define KEY_DOWN 8 #define KEY_LEFT 1 #define KEY_RIGHT 4 #define KEY_CTRL 64 ; ESC key to exit stick k, 255 if k & KEY_ESC : goto *jobend ; check cursor key spd = 8 if k & KEY_CTRL : spd = 1 if k & KEY_UP : y -= spd if k & KEY_DOWN : y += spd if k & KEY_LEFT : x -= spd if k & KEY_RIGHT : x += spd ; 描画開始 / draw start redraw 0 gsel 0 gmode gmode_gdi ; clear screen color 32, 64, 128 boxf 0, 0, dispw, disph ; draw sprite imgid = sprimgid0 imgw = spr0w imgh = spr0h dx = x dy = y scale = 1.5 dw = int(256.0 * scale) dh = int(256.0 * scale) n = 5 ; sprite No. draw_sprite_gzoom dx, dy, dw, dh, imgid, imgw, imgh, n, tmpid, dispw, disph, 0 ; draw text font "Arial", 18, 1 color 255, 255, 255 pos 6, 6 mes "Push cursor key" redraw 1 ; 描画終了 / draw end await (1000 / FRAMERATE) goto *mainloop #module #deffunc draw_sprite_gzoom int dst_x, int dst_y, int dst_w, int dst_h, int imgid, int imgw, int imgh, int n, int tmpid, int dispw, int disph, int dstid ; スプライト相当を拡大縮小して描画 ; ; dst_x, dst_y : 描画先の左上座標 ; dst_w, dst_h : 描画先のサイズ ; imgid : 元画像バッファID ; imgw, imgh : 元画像サイズ ; n : スプライトNo. ; tmpid : 作業用イメージバッファID ; dispw, disph : 画面サイズ ; dstid : 描画先イメージバッファID ; テクスチャのソース座標を算出 src_w = (imgw / 4) src_h = (imgh / 2) src_x = (n & 3) * src_w src_y = ((n >> 2) & 1) * src_h if dst_x >= dispw or (dst_x + dst_w) < 0 : return if dst_y >= disph or (dst_y + dst_h) < 0 : return dx = dst_x dy = dst_y dw = dst_w dh = dst_h sx = src_x sy = src_y sw = src_w sh = src_h ; 画面外になっている分、幅や高さを減らす if dx < 0 { w = (-dx) * sw / dw sx += w sw -= w dw += dx dx = 0 } if dy < 0 { h = (-dy) * sh / dh sy += h sh -= h dh += dy dy = 0 } if (dx + dw) > dispw { dwd = (dx + dw) - dispw swd = dwd * sw / dw sw -= swd dw -= dwd } if (dy + dh) > disph { dhd = (dy + dh) - disph shd = dhd * sh / dh sh -= shd dh -= dhd } ; gzoom は透明色を扱えないので小技が必要 ; 一旦、仮バッファに拡大縮小描画 gsel tmpid pos 0, 0 gzoom dw, dh, imgid, sx, sy, sw, sh, 0 ; 仮バッファから実スクリーンに gcopy でコピー ; gcopy なら RGB=(0,0,0) を透明色として扱える gsel dstid ; gmode gmode_rgb0 ; RGB=(0,0,0)を透明色として扱う pos dx, dy gcopy tmpid, 0, 0, dw, dh gmode gmode_gdi if 1 { ; draw text gmode gmode_gdi font "Arial", 18, 1 color 255, 255, 255 pos 6, 28 mes "x, y = " + dst_x + ", " + dst_y + " dest w,h = " + dw + ", " + dh } return #global *jobend end