HSP3 プログラミングの基礎X | |
◆ 虫さん(複数匹バージョン)
1匹バーションを複数匹に変更する。
(ssaver15.hsp)
次のリストは、スクリーンセーバー本体となるものである。
;ssaver15.hsp randomize hiki = 6 : kosu = 20 dim x, hiki, kosu : dim y, hiki, kosu dim dx, hiki : dim dy, hiki win_x = 640 win_y = 480 rr = 10 ;直径 repeat hiki dx(cnt) = rr : dy(cnt) = rr ;移動量 h = cnt x(h, 0) = rnd(win_x / 2) : y(h, 0) = rnd(win_y / 2) ;先頭位置 repeat kosu - 1, 1 x(h, cnt) = x(h, cnt - 1) + rr : y(h, cnt) = y(h, 0) ;水平に並べる loop loop *mainlp redraw 0 color 0, 0, 0 boxf repeat hiki h = cnt if h \ 3 = 0 : color 153, 0, 0 if h \ 3 = 1 : color 0, 153, 0 if h \ 3 = 2 : color 0, 0, 153 repeat kosu - 1, 1 circle x(h, cnt), y(h, cnt), x(h, cnt) + rr, y(h, cnt) + rr ;描画 loop if h \ 3 = 0 : color 255, 0, 0 if h \ 3 = 1 : color 0, 255, 0 if h \ 3 = 2 : color 0, 0, 255 circle x(h, 0), y(h, 0), x(h, 0) + rr, y(h, 0) + rr ;先頭描画 loop redraw 1 repeat hiki h = cnt repeat kosu - 1, 1 ;2番目以降を移動 x(h, kosu - cnt) = x(h, kosu - cnt - 1) y(h, kosu - cnt) = y(h, kosu - cnt - 1) loop loop repeat hiki rd = rnd(100) *retry if rd = 0 : dx(cnt) = 0 : dy(cnt) = -rr ;上 if rd = 1 : dx(cnt) = 0 : dy(cnt) = rr ;下 if rd = 2 : dx(cnt) = -rr : dy(cnt) = 0 ;左 if rd = 3 : dx(cnt) = rr : dy(cnt) = 0 ;右 if rd = 4 : dx(cnt) = rr : dy(cnt) = -rr ;右上 if rd = 5 : dx(cnt) = rr : dy(cnt) = rr ;右下 if rd = 6 : dx(cnt) = -rr : dy(cnt) = -rr ;左上 if rd = 7 : dx(cnt) = -rr : dy(cnt) = rr ;左下 xx = x(cnt, 0) + dx(cnt) : yy = y(cnt, 0) + dy(cnt) ;先頭仮移動 if xx = x(cnt, 2) & yy = y(cnt, 2) : rd = rnd(8) : goto *retry if xx < 0 | xx >= win_x - rr { ;壁 dx(cnt) = -dx(cnt) if dy(cnt) = 0 : if rnd(2) = 0 : dy(cnt) = rr : else : dy(cnt) = -rr } if yy < 0 | yy >= win_y - rr { ;壁 dy(cnt) = -dy(cnt) if dx(cnt) = 0 : if rnd(2) = 0 : dx(cnt) = rr : else : dx(cnt) = -rr } x(cnt, 0) = x(cnt, 0) + dx(cnt) : y(cnt, 0) = y(cnt, 0) + dy(cnt) ;先頭移動 loop await 100 goto *mainlp end
完成 (ssaver16.hsp) ←リンクをクリックするとリストが表示される。
スクリーンセーバーに作り替えたものを次に示す。作り替える手順は、虫さん(1匹バージョン)と同じである。
;ssaver16.hsp #packopt name "screensaver" ;実行ファイル名 #packopt type 2 ;スクリーンセーバー #packopt xsize 320 #packopt ysize 120 scrname = "screensaver" 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 "スクリーンセーバー" gosub *dataread ;設定データファイル読み込み pos 10, 8 : mes "虫の長さ" ;設定画面作成 pos 80, 8 : input skosu pos 10, 40 : mes "直 径" pos 80, 40 :input srr pos 240, 80 : button "OK", *settei stop *settei noteadd skosu, 0, 1 noteadd srr, 1, 1 notesave scrname + ".dat" ;設定データファイル書き込み end ;プレビュー画面 ----- *preview win_x = ginfo_winx ;ウィンドウサイズ(幅) win_y = ginfo_winy ;ウィンドウサイズ(高さ) ;font "MS ゴシック", 12 goto *ssmain stop ;スクリーンセーバー本体 ----- *ssaver win_x = ginfo_dispx ;ディスプレイサイズ(幅) win_y = ginfo_dispy ;ディスプレイサイズ(高さ) bgscr 1, win_x, win_y ;枠なしのウィンドウ *ssmain gosub *dataread ;設定データファイル読み込み randomize hiki = 6 ;: kosu = 20 dim x, hiki, kosu : dim y, hiki, kosu dim dx, hiki : dim dy, hiki ;win_x = 640 ;win_y = 480 ;rr = 10 直径 repeat hiki dx(cnt) = rr : dy(cnt) = rr ;移動量 h = cnt x(h, 0) = rnd(win_x / 2) : y(h, 0) = rnd(win_y / 2) ;先頭位置 repeat kosu - 1, 1 x(h, cnt) = x(h, cnt - 1) + rr : y(h, cnt) = y(h, 0) ;水平に並べる loop loop *mainlp redraw 0 color 0, 0, 0 boxf repeat hiki h = cnt if h \ 3 = 0 : color 153, 0, 0 if h \ 3 = 1 : color 0, 153, 0 if h \ 3 = 2 : color 0, 0, 153 repeat kosu - 1, 1 circle x(h, cnt), y(h, cnt), x(h, cnt) + rr, y(h, cnt) + rr ;描画 loop if h \ 3 = 0 : color 255, 0, 0 if h \ 3 = 1 : color 0, 255, 0 if h \ 3 = 2 : color 0, 0, 255 circle x(h, 0), y(h, 0), x(h, 0) + rr, y(h, 0) + rr ;先頭描画 loop redraw 1 repeat hiki h = cnt repeat kosu - 1, 1 ;2番目以降を移動 x(h, kosu - cnt) = x(h, kosu - cnt - 1) y(h, kosu - cnt) = y(h, kosu - cnt - 1) loop loop repeat hiki rd = rnd(100) *retry if rd = 0 : dx(cnt) = 0 : dy(cnt) = -rr ;上 if rd = 1 : dx(cnt) = 0 : dy(cnt) = rr ;下 if rd = 2 : dx(cnt) = -rr : dy(cnt) = 0 ;左 if rd = 3 : dx(cnt) = rr : dy(cnt) = 0 ;右 if rd = 4 : dx(cnt) = rr : dy(cnt) = -rr ;右上 if rd = 5 : dx(cnt) = rr : dy(cnt) = rr ;右下 if rd = 6 : dx(cnt) = -rr : dy(cnt) = -rr ;左上 if rd = 7 : dx(cnt) = -rr : dy(cnt) = rr ;左下 xx = x(cnt, 0) + dx(cnt) : yy = y(cnt, 0) + dy(cnt) ;先頭仮移動 if xx = x(cnt, 2) & yy = y(cnt, 2) : rd = rnd(8) : goto *retry if xx < 0 | xx >= win_x - rr { ;壁 dx(cnt) = -dx(cnt) if dy(cnt) = 0 : if rnd(2) = 0 : dy(cnt) = rr : else : dy(cnt) = -rr } if yy < 0 | yy >= win_y - rr { ;壁 dy(cnt) = -dy(cnt) if dx(cnt) = 0 : if rnd(2) = 0 : dx(cnt) = rr : else : dx(cnt) = -rr } x(cnt, 0) = x(cnt, 0) + dx(cnt) : y(cnt, 0) = y(cnt, 0) + dy(cnt) ;先頭移動 loop await 100 goto *mainlp end ;設定データファイル読み込み ----- *dataread notesel cfg exist scrname + ".dat" ;設定データファイル if strsize = -1 { ;ファイルなし kosu = 20 : skosu = "20" ;個数 rr = 10 : srr = "10" ;直径 } else { ;ファイルあり noteload scrname + ".dat" noteget skosu, 0 ;個数(文字型) noteget srr, 1 ;直径(文字型) kosu = 0 + skosu ;整数変換 rr = 0 + srr } return
(ssaver16b.hsp)
虫さんの引数を設定できるように変更する。
スクリーンセーバー本体のrandomize命令の次行の「hiki = 6」を削除する。
設定画面と設定データファイル読み込みの処理を変更するだけである。追加した行の先頭を太字で示す。
;設定画面 ----- *config title "スクリーンセーバー" gosub *dataread ;設定データファイル読み込み pos 10, 8 : mes "虫の長さ" ;設定画面作成 pos 80, 8 : input skosu pos 10, 40 : mes "直 径" pos 80, 40 :input srr pos 10, 80 : mes "虫の匹数" pos 80, 80 :input shiki pos 240, 80 : button "OK", *settei stop *settei noteadd skosu, 0, 1 noteadd srr, 1, 1 noteadd shiki, 2, 1 notesave scrname + ".dat" ;設定データファイル書き込み end
;設定データファイル読み込み ----- *dataread notesel cfg exist scrname + ".dat" ;設定データファイル if strsize = -1 { ;ファイルなし kosu = 20 : skosu = "20" ;個数 rr = 10 : srr = "10" ;直径 hiki = 6 : shiki = "6" ;匹数 } else { ;ファイルあり noteload scrname + ".dat" noteget skosu, 0 ;個数(文字型) noteget srr, 1 ;直径(文字型) noteget shiki, 2 ;匹数(文字型) kosu = 0 + skosu ;整数変換 rr = 0 + srr hiki = 0 + shiki } return
2007 © Hiroshi Masuda |