HSP3 ゲームのプログラミング
 シューティング・ゲーム制作 前へ 目次へ 

(10) 処理の追加(課題)

課題(shoot69.hsp)
 敵機が左右にも移動するようにする。

 乱数を利用して、左右に移動するかどうかを決定する。でたらめに左右に移動してもよいが、ここでは自機に向かってくるようにする。自機に向かわせるには、自機のx座標jkxから敵機のx座標tkxを減算し、正なら右へ、負なら左へ移動するよう敵機の移動量tkdxの値を変更する。

            ;自機に向かわせる
            tkr = rnd(20)     ;乱数発生0〜19
            if tkr = 0 {      ;tkr=0
                if jkx - tkx(cnt) > 0: tkdx(cnt) = 1
                if jkx - tkx(cnt) < 0: tkdx(cnt) = -1
            }
            if tkr > 15 : tkdx(cnt) = 0     ;tkr=16,17,18,19
 乱数で0〜19の20個の整数を発生し、乱数が0のときだけ左右に移動させる(確率1/20)。
 左右に移動したままでは行き過ぎることもあるので、乱数が16〜19のときにtkdxを0にしてまっすぐ移動するようにしている(確率1/5)。
 確率は実際に実行してみて、調整(変更)する。

 敵機が左右に移動すると左右の枠を超えることが起こる。敵機が左右の枠を超えたら消す処理を追加する。

            if tkx(cnt) < 0 : tkb(cnt) = -1            ;左枠
            if tkx(cnt) > winx - 4 : tkb(cnt) = -1     ;右枠


(リスト)



課題(shoot70.hsp)
 敵機を一定数以上爆破したら自機が増えるようにする。

 例えば、敵機を100機爆破するごとに自機が増えるようにする。だだし、自機の残数は最大5機までとする。
 敵機の爆破数をカウントする変数tekibを用意し、ゲーム開始前の設定の場所で0で初期化する。

    tekib = 0        ;敵機爆破数

 自玉と敵機の当たり判定(*atari1)で、敵機爆破と判定されたら変数tekibにカウントしていき、100になったら自機を1機加算する。

                tekib = tekib + 1    ;敵機爆破数加算
                if tekib = 100 {
                    jiki = jiki + 1            ;自機加算
                    if jiki > 5 : jiki = 5     ;自機数の制限
                    tekib = 0                  ;敵機爆破数クリア
                    gosub *jiki_disp           ;自機残り表示
                }


(リスト)



課題(shoot71.hsp)
 敵機の画像が変わるようにする。

 例えば、敵機を100機爆破したら敵機の画像が変わるようにする。敵機の画像は3つ用意してあり、画像の開始座標は(32,0)、(64,0)、(96*0)である。(32,0)の画像を1番、(64,0)の画像を2番、(96*0)の画像を3番として変数tkggに番号を設定する。初期値は1である。また、敵機の画像を記憶しておく配列tkgを用意して、変数tkggで初期化する。

 配列の宣言はほかの敵機用の配列宣言と同じ場所で行う。

    dim tkg, teki    ;敵機の画像

 敵機画像の初期化はゲームスタート時に行う。

    tkgg = 1        ;敵機画像番号
    foreach tkb
        tkg(cnt) = tkgg    ;敵機画像番号1
    loop

 敵機画像番号の変更は100機爆破ごととしたので自機加算と同じ場所で行う。

                tekib = tekib + 1    ;敵機爆破数加算
                if tekib = 100 {
                    jiki = jiki + 1            ;自機加算
                    if jiki > 5 : jiki = 5     ;自機数の制限
                    tekib = 0                  ;敵機爆破数クリア
                    tkgg = tkgg \ 3 + 1        ;敵機画像変更
                    gosub *jiki_disp           ;自機残り表示
                }

 最後に、敵機の初期化で敵機画像番号を設定する。

        ;敵機初期位置・移動量設定
        if tkb(cnt) = -1 & rnd(5) = 0 {
            tkx(cnt) = rnd(winx - 4) + 1    ;x座標
            tky(cnt) = -4        ;y座標
            tkdx(cnt) = 0        ;移動量x
            tkdy(cnt) = 1        ;移動量y
            tkb(cnt) = 0         ;敵機状態
            tkg(cnt) = tkgg      ;敵機画像番号
        }


(リスト)



課題(shoot72.hsp)
 敵機も玉を発射するようにする。敵玉は画面上に最大5発までとする。

 敵玉の移動処理、敵玉と自機、敵玉と自玉の当たり判定などが必要になる。

 敵玉の座標などを格納する配列を宣言する。

    tama2 = 5    ;敵玉の数
    dim ttx, tama2 : dim tty, tama2    ;敵玉の座標
    dim ttb, tama2             ;敵玉の状態 0=あり、-1=なし

 敵玉の状態をなしに設定する。

    foreach ttb
        ttb(cnt) = -1    ;敵玉状態、なし
    loop

 敵玉移動のサブルーチンである。自玉移動とほぼ同じである。

;敵玉移動 -----
*tama_move2
    foreach ttb
        if ttb(cnt) = 0 {
            tty(cnt) = tty(cnt) + 2
            pos ttx(cnt) * mm, tty(cnt) * mm
            gcopy 1, 16, 32, 16, 16
            if tty(cnt) >= winy : ttb(cnt) = -1
        }
    loop
    return

 敵玉の発射は乱数で決定し、さらに、敵玉なし(-1)かつ敵機あり(0)のときに発射する。

        ;敵機玉発射
        tr = rnd(20)
        cnt1 = cnt
        if tr = 1 {
            foreach ttb
                if ttb(cnt) = -1 & tkb(cnt1) = 0{
                    ttx(cnt) = tkx(cnt1)
                    tty(cnt) = tky(cnt1)
                    ttb(cnt) = 0
                    break
                }
            loop
        }

 次に、敵玉と自機、敵玉と自玉の当たり判定である。

;敵玉と自機、自玉の当たり判定・消去・残機減算表示 -----
*atari3
    foreach ttb    ;敵玉の個数分
        ;敵玉と自機
        if ttb(cnt) + jkb = 0 & abs(jky - tty(cnt) + 1) <= 2 & abs(jkx - ttx(cnt) + 1) <= 2 {
            ;爆破アニメーション
            redraw 1
            pos jkx * mm , jky * mm
            repeat 3, 1
                gcopy 1, cnt * 32, 32
                wait 50
            loop
            jkb = -1            ;自機状態なし 設定
            jiki = jiki - 1     ;自機1減
            gosub *jiki_disp
            break
        }
       ;敵玉と自玉
        cnt1 = cnt
        foreach jtb        ;自玉の個数分
            if ttb(cnt1) + jtb(cnt) = 0 & abs(tty(cnt1) - jty(cnt)) <= 1 & abs(ttx(cnt1) - jtx(cnt)) <= 1 {
                ttb(cnt1) = -1        ;敵機消去(爆破)
                tmb(cnt) = -1         ;自玉消去
            }
        loop
    loop
    return

 最後に、敵玉移動(*tama_move2)と敵玉判定(*atari3)のサブルーチン呼び出しをゲームのメインループ内に追加する。

        ;敵玉移動
        gosub *tama_move2
        ;敵玉と自機、自玉の当たり判定・消去・残機減算表示
        gosub *atari3


(リスト)


 シューティング・ゲーム制作 前へ 目次へ 
2007 © Hiroshi Masuda

 

 

inserted by FC2 system