TDJの隠れ家♪ トップ>HSP >Scripts>シューティング

シューティング

シューティングです。
自分や敵は全て文字だけですので、とても軽いと思います。
自分も敵も同じ変数で一括管理します。

shooting.hsp
ソースのダウンロード

#define Wait_time 0
#define global Font_size 20

とりあえず宣言です。
フォントの大きさと待ち時間を設定しておきます。
フォントのサイズはモジュールでも使うのでグローバルにしてあります。
動作が早過ぎると思う人はWait_timeの0を適当な長さ(例えば10など)に代えてください。

#module
#deffunc scan_put int max,array char
    count=-1
    repeat max
        if char(cnt,0)!0 : continue
        count=cnt
        break
    loop
    return count
#global

何も情報が書かれていない配列変数を探して値を返す命令を作ります。
何も書かれていないものがあればその値を、なければ-1を返します。
モジュールが分からない人はブラックボックスにしておいてください。

#module
#deffunc scan_hit int max,array char,int count
    hit=-1
    repeat max
        if (char(cnt,0)=0)|(cnt=count) : continue
        if char(count,0)=1 : {
            if (char(cnt,0)=2)|(char(cnt,0)=4) : {
                if (char(cnt,1)>char(count,1)-Font_size)&(char(cnt,1)char(count,2)-Font_size)&(char(cnt,2)                     hit=cnt
                    break
                }
            }
        }
        if char(count,0)=2 : {
            if char(cnt,0)=3 : {
                if (char(cnt,1)>char(count,1)-Font_size)&(char(cnt,1)char(count,2)-Font_size)&(char(cnt,2)                     hit=cnt
                    break
                }
            }
        }

    loop
    return hit
#global

あたり判定です。当たっていればどれと接触したかが返ります。当たっていなければ-1が返ります。
これも分からない人は飛ばしても問題ないです。

*index
    randomize
    wx=300 : wy=450 : screen 0,wx,wy
    mes"シューティングゲーム" : button"START",*start : stop

初期画面です。
まず画面を初期化します。サイズはwxとwyを調節するといいです。
スタートを押すと始まります。

*start
    max=128                        ;総キャラ数
    dim char,max,5        ;一つ目0は死 それ以外は種類
                                        ;二つ目X 三つ目Y 四つ目Xの増加量 五つ目Y
                                        ;自機=1 敵機=2 通常弾=3 敵の弾=4
                                        ;追尾弾=5
    char(0,0)=1 : char(0,1)=wx/2 : char(0,2)=wy-Font_size
    point=0
    cls

いろいろな設定をします。
総キャラ数を少なくすると速くなるかもしれません。
(それほど速くならないことの方が多いです。なぜなら128個も画面に同時に表示されることはまずないからです)
charの0に自機の情報を入力します。
pointは得点管理用の変数です。
配列変数は0から始まるのでご注意下さい。

*main
    stick k,15
    if k=128 : end
    redraw 0 : color 0,0,0 : boxf : font"MSゴシック",Font_size
    if rnd(50)=0 : gosub *set
    gosub *put
    color 255,255,255 : pos 0,0 : mes "POINT:"+point
    redraw 1 : await Wait_time : goto *main

メインループです。私は習慣的に"*main"と名づけます。
これ自体は特に何もせず、各サブルーチンに飛ばすだけです。

*set
    scan_put max,char : if stat=-1 : return
    char(stat,0)=2 : char(stat,1)=rnd(wx) : char(stat,2)=-Font_size
    return

敵を出すサブルーチンです。
ランダムで出現させるだけです。
メインループのrndの値を代えると、敵の出現率が変わります。

*put
    repeat max
        if char(cnt,0)=0 : continue
        if char(cnt,0)=1 : {
            count=cnt : scan_hit max,char,count
            if stat!-1 : char(cnt,0)=0 : char(stat,0)=0 : continue
            if k&1 : char(cnt,1)-=2
            if k&2 : char(cnt,2)-=2
            if k&4 : char(cnt,1)+=2
            if k&8 : char(cnt,2)+=2
            if k&16 : {
                scan_put max,char : if stat!-1 : {
                    char(stat,0)=3 : char(stat,1)=char(cnt,1) : char(stat,2)=char(cnt,2)-Font_size
                }
            }
            pos char(cnt,1),char(cnt,2) : color 255,255,255 : mes "機"
        }

自機に関する処理です。
キー情報を取得し、それを反映させます。

        if char(cnt,0)=2 : {
            count=cnt : scan_hit max,char,count
            if stat!-1 : char(cnt,0)=0 : char(stat,0)=0 : point+=10 : continue
            if rnd(100)=0 : {
                scan_put max,char : if stat!-1 : {
                    char(stat,0)=4 : char(stat,1)=char(cnt,1) : char(stat,2)=char(cnt,2)+Font_size
                }
            }
            char(cnt,2)+=1
            if char(cnt,2)>wy : char(cnt,0)=0
            pos char(cnt,1),char(cnt,2) : color 255,0,0 : mes "敵"
        }

敵に関するループです。
横移動はないので、縦に落ちてくるだけです。
ランダムで弾を発射します。
これも出る量を変えることが出来ます。

        if char(cnt,0)=3 : {
            char(cnt,2)-=3
            if char(cnt,2)<0-Font_size : char(cnt,0)=0
            pos char(cnt,1),char(cnt,2) : color 0,255,0 : mes "弾"
        }

自分の弾です。
横移動はないので弾は上がっていくだけです。

        if char(cnt,0)=4 : {
            char(cnt,2)+=3
            if char(cnt,2)>wy : char(cnt,0)=0
            pos char(cnt,1),char(cnt,2) : color 255,170,0 : mes "弾"
        }

敵の弾です。
構造は自分の弾とほぼ同じです。

    loop
    return

このスクリプトが便利なのは、拡張性が高いからです。例えば5番に追尾弾を作れば、すぐにその機能が実装できます。変数を新たに作る必要もありません。