; 疑似3D道路を描画する / Drawing pseudo 3D roads ; 道路画像を使わずにプログラムで描画する版 #define BG_FILE "bg_16col.png" #define SCR_W 640 #define SCR_H 360 ; 同梱ファイル / bundled files #pack BG_FILE #packopt name "road02b" ; exe filename #packopt type 0 ; generate ".exe" #packopt xsize SCR_W #packopt ysize SCR_H 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 bg image bgimgid = 4 buffer bgimgid, 1280, 720 picload BG_FILE bgw = ginfo_winx bgh = ginfo_winy dist = 150.0 ; 画面までの距離 / distance to screen angle = 0.0 scroll_z = 0 camera_x = 0 *mainloop ; ESC key to exit stick k if k & 128 : goto *jobend base_y = int(double(disph) * 0.5) road_y = 100 road_x = 300 h = disph - base_y camera_x = 0 ; camera_x = 600.0 * sin(deg2rad(angle * 0.75)) redraw 0 ; 描画開始 / draw start gsel 0 ; 背景(遠景)を描画 / draw BG gmode 0 ax = sin(deg2rad(double(angle) * 0.25)) * ((bgw - dispw) / 2) bg_x = (bgw / 2 - (dispw / 2)) + ax bg_y = bgh / 2 - base_y pos 0,0 gcopy bgimgid, bg_x, bg_y, dispw, disph ; gradf 0, (disph / 2), dispw, (disph / 2), 1, $449044, $080808 ; 道路を描画 / draw road repeat h scrn_y = h - cnt - 1 if scrn_y = 0 : continue road_z = road_y * dist / scrn_y scrn_x = road_x * dist / road_z center_x = camera_x * dist / road_z addv = (((road_z + scroll_z) / 32) & $1) ; 1ラスター分を描画 / draw 1 raster road_w = scrn_x * 2 draw_x = -scrn_x + (dispw / 2) + center_x draw_y = scrn_y + base_y kind = addv gosub *draw_raster_road loop redraw 1 ; 描画終了 / draw end angle += 1 scroll_z += 10 await (1000 / 30) goto *mainloop *draw_raster_road ; 道路を1ラスター分描画 ; ; draw_x, draw_y : draw x, y ; road_w : road width ; kind : 0 or 1 ; dispw : screen width ; draw ground if kind = 0 { ; color R, G, B color 114, 185, 66 } else { color 22, 174, 63 } ; boxf x0, y0, x1, y1 boxf 0, draw_y, dispw, draw_y ; draw road base if kind = 0 { color 133, 149, 158 } else { color 149, 168, 179 } boxf draw_x, draw_y, draw_x + road_w, draw_y ; draw white line lw = double(road_w) * 48.0 / 2048.0 ; white line width if kind = 0 { color 255, 255, 255 lx = double(draw_x) boxf lx, draw_y, lx + lw, draw_y lx = lx + road_w - lw boxf lx, draw_y, lx + lw, draw_y lx = double(draw_x) + (double(road_w) * 0.5) - (lw * 0.5) boxf lx, draw_y, lx + lw, draw_y lx = double(draw_x) + double(road_w) * 0.25 - (lw * 0.5) boxf lx, draw_y, lx + lw, draw_y lx = double(draw_x) + double(road_w) * 0.75 - (lw * 0.5) boxf lx, draw_y, lx + lw, draw_y } else { color 228, 236, 252 lx = double(draw_x) + lw boxf lx, draw_y, lx + lw, draw_y lx = double(draw_x) + road_w - (lw * 2) boxf lx, draw_y, lx + lw, draw_y } return *jobend end