HSP3 プログラミングの基礎X | |
◆ ボール(画像ファイル利用)
ボールの画像ファイルをりようしてスクリーンセーバーを制作する。
(ssaver11.hsp)
次のリストは、スクリーンセーバー本体となるものである。
;ssaver11.hsp randomize kosu = 50 ;画像の個数 dim x, kosu : dim y, kosu ;個数分の座標用配列 dim dx, kosu : dim dy, kosu ;個数分のX移動量用配列 dim b, kosu ;ボールの番号(0〜6) buffer 2 picload "ball.bmp" win_x = 640 ;ginfo_dispx or ginfo_winx win_y = 480 ;ginfo_dispy or ginfo_winy screen 0, win_x, win_y ;bgscr 1, win_x, win_y gmode 2, 16, 16 ;コピーモード repeat kosu ;配列の個数分繰り返し x(cnt) = rnd(win_x - 16) : y(cnt) = rnd(win_y - 16) ;初期座標 dx(cnt) = 5 + rnd(5) * 2 : dy(cnt) = 5 + rnd(5) * 2 ;移動量 b(cnt) = rnd(7) ;ボール番号 loop repeat ;描画処理 redraw 0 color 0, 0, 0 boxf repeat kosu ;配列の個数分繰り返し pos x(cnt), y(cnt) gcopy 2, b(cnt) * 16, 0 ;移動方向 x(cnt) = limit(x(cnt) + dx(cnt), 0, win_x - 16) ;座標計算 y(cnt) = limit(y(cnt) + dy(cnt), 0, win_y - 16) if x(cnt) <= 0 | x(cnt) >= win_x - 16 : dx(cnt) = -dx(cnt) if y(cnt) <= 0 | y(cnt) >= win_y - 16 : dy(cnt) = -dy(cnt) loop redraw 1 await 100 loop end
画像は図のようなものを用意した。一つのボールは16×16ドットで作成している。
ball.bmp (3KB)
画像ファイルは、buffer 2で用意したウィンドウIDの2番に読み込んでいる。
(ssaver12.hsp) 次に、スクリーンセーバーに書き直したリストを示す。
スクリーンセーバー本体部分の青色は削除、マゼンタは追加である。
;ssaver12.hsp #packopt name "ball" ;実行ファイル名 #packopt type 2 ;スクリーンセーバー #packopt xsize 320 #packopt ysize 120 scrname = "ball" para = dir_cmdline ;パラメータ取得 para = strmid(para, 0, 2) if para = "/p" | para = "/P" : goto *preview ;プレビュー if para = "/s" | para = "/S" : goto *ssaver ;フルスクリーン if para = "/c" | para = "/C" : goto *config ;コンフィグ dialog "無効なオプションです。" + "[" + para + "]" end ;設定画面 ----- *config title scrname gosub *dataread ;設定データファイル読み込み pos 10, 8 : mes "表示個数" ;設定画面作成 pos 100, 8 : input skosu pos 240, 80 : button "OK", *settei stop *settei noteadd skosu, 0, 1 notesave scrname + ".dat" ;設定データファイル書き込み end ;プレビュー画面 ----- *preview win_x = ginfo_winx ;ウィンドウサイズ(幅) win_y = ginfo_winy ;ウィンドウサイズ(高さ) winid = 0 ;ウィンドウID 0 goto *ssmain stop ;スクリーンセーバー本体 ----- *ssaver win_x = ginfo_dispx ;ディスプレイサイズ(幅) win_y = ginfo_dispy ;ディスプレイサイズ(高さ) bgscr 1, win_x, win_y ;枠なしのウィンドウ winid = 1 ;ウィンドウID 1 *ssmain gosub *dataread ;設定データファイル読み込み randomize ;kosu = 50 ;画像の個数 dim x, kosu : dim y, kosu ;個数分の座標用配列 dim dx, kosu : dim dy, kosu ;個数分のX移動量用配列 dim b, kosu ;ボールの番号(0〜6) buffer 2 picload "ball.bmp" ;win_x = 640 ;ginfo_dispx or ginfo_winx; ;win_y = 480 ;ginfo_dispy or ginfo_winy; ;screen 0, win_x, win_y ;bgscr 1, win_x, win_y gsel winid gmode 2, 16, 16 ;コピーモード repeat kosu ;配列の個数分繰り返し x(cnt) = rnd(win_x - 16) : y(cnt) = rnd(win_y - 16) ;初期座標 dx(cnt) = 5 + rnd(5) * 2 : dy(cnt) = 5 + rnd(5) * 2 ;移動量 b(cnt) = rnd(7) ;ボール番号 loop repeat ;描画処理 redraw 0 color 0, 0, 0 boxf repeat kosu ;配列の個数分繰り返し pos x(cnt), y(cnt) gcopy 2, b(cnt) * 16, 0 ;移動方向 x(cnt) = limit(x(cnt) + dx(cnt), 0, win_x - 16) ;座標計算 y(cnt) = limit(y(cnt) + dy(cnt), 0, win_y - 16) if x(cnt) <= 0 | x(cnt) >= win_x - 16 : dx(cnt) = -dx(cnt) if y(cnt) <= 0 | y(cnt) >= win_y - 16 : dy(cnt) = -dy(cnt) loop redraw 1 await 100 loop end ;設定データファイル読み込み ----- *dataread notesel cfg exist scrname + ".dat" ;設定データファイル if strsize = -1 { ;ファイルなし kosu = 20 skosu = "20" } else { ;ファイルあり noteload scrname + ".dat" noteget skosu, 0 ;個数(文字型) kosu = 0 + skosu ;整数変換 } return
2007 © Hiroshi Masuda |