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 

 

 

inserted by FC2 system