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

(3) 自機の移動

サンプル(shoot12.hsp)
 自機を画面の下に表示し、左右のカーソルキーで移動させる。左右の壁で止まるようにする。

 自機の座標は変数jkx, jkyに格納し、初期位置は(25,55)とする。

    ;ゲーム開始前の設定
    foreach tkb
        tkb(cnt) = -1       ;敵機状態、なし
    loop
    jkx = 20 : jky = 55     ;自機の初期位置

 自機の移動は、表示する座標をpos命令で設定して、gcopyで表示するだけなのでサブルーチンにはしていない。自機のコピー開始座標は(0, 0)である。

        ;自機移動
        pos jkx * mm , jky * mm
        gcopy 1, 0, 0
        ;キー入力
        gosub *key_input

 自機は左右それぞれ2ずつ移動して、敵機より速く移動するようする。

;-------------------------
;----- Subroutine
;キー入力 -----
*key_input
    stick kk, 5        ;キー入力情報
    if kk & 128 : end            ;[Esc]
    if kk & 1 : jkx = jkx - 2    ;[←]
    if kk & 4 : jkx = jkx + 2    ;[→]
    jkx = limit(jkx, 0, winx - 4)    ;左右の壁の制限
    return

実行自機が表示され、左右のカーソル移動キーで移動する。ただし、自機と敵機が当たっても何も起こらない。



(4) 自機と敵機の衝突判定

サンプル(shoot13.hsp)
 自機と敵機の当たり判定をする。

 当たり判定の処理はサブルーチン*atari2として作成する。サブルーチン*atari2の呼び出しを追加する。

        ;自機と敵機の当たり判定・自機消去・残機減算表示
        gosub *atari2


 図のような状態で、自機と敵機の当たり判定をする。自機の座標は(jkx,jky)、敵機の座標は(tkx,tky)の配列である。自機と敵機の座標の差が±2の範囲で当たりと判定する。

abs(jkx - tkx(cnt)) <= 2  &  abs(jky - tky(cnt)) <= 2

 敵機は複数あるので、すべての敵機と当たり判定をするのではなく、敵機状態ありの分だけ判定する。

;自機と敵機の当たり判定・自機消去・残機減算表示 -----
*atari2
    foreach tkx    ;敵機の個数分
        if tkb(cnt) = 0 & abs(jky - tky(cnt)) <= 2 & abs(jkx - tkx(cnt)) <= 2 {

            <<当たりのときの処理>>
            break
        }
    loop
    return

 自機と敵機が当たったとき、自機が爆発するようなアニメーションを表示するようにする。
 用意した画像の(32,32)、(64,32)、(96,32)に爆破アニメーション用の画像を用意してある。この3枚の画像を順番に切り替えて表示して、アニメーションのように見せる。次に、爆破アニメーションの処理を示す。これを「当たりのときの処理」として追加する。

            ;爆破アニメーション
            redraw 1
            pos jkx * mm , jky * mm
            repeat 3, 1
                gcopy 1, cnt * 32, 32
                wait 50
            loop
 "redraw 1"で実際に描画するように設定している。メインで"redraw 0"としているためである。
 爆破アニメーションは、自機と同じ場所に描画するので、"pos jkx * mm , jky * mm"としている。
 "gcopy"のcnt*32で32ドットずつずらして描画している。描画の間隔は"wait 50"で500ミリ秒としている。"repeat"で3回繰り返し、システム変数cntが1から始まるようにrepeat 3, 1のように1で初期化している。

実行自機と敵機が当たると、爆破アニメーションが表示される。ただし、自機が消えないので爆破アニメーションが連続して表示される。



課題(shoot62.hsp)
 「自機の移動」と「自機と敵機の衝突判定」の処理を追加する。また、爆破アニメーションが1回終わったらプログラムが終了するようにする。

ヒント次の3点について追加・修正する。
・自機の状態を変数jkbで管理し、0であり、-1でなしとする(敵機と同じ)。
   jkb = 0        ;自機の状態 0=あり、-1=なし
・当たりと判定されとき、変数jkbを-1に設定し、自機状態をなしにする。
   jkb = -1    ;自機状態なし 設定
・自機が爆破して、自機状態が1になったら再スタートするためループを抜け出す。
   if jkb = -1 : break    ;自機状態なし


(リスト)



課題(shoot63.hsp)
 自機を3機とし、自機が爆破したら1ずつ減になり、再スタートする。3機の自機がなくなったらプログラムを終了する。

ヒント次の3点について追加・修正する。
・残りの自機数を変数jikiでカウントする。変数jikiは3で初期化する。
   jiki = 3    ;自機残数
・当たりと判定されとき、変数jikiを1減じる。
   jiki = jiki - 1    ;自機1減
・ゲームオーバー判定として次のif文を追加する。
   if jiki > 0 : goto *restart     ;自機の残数が0より大きいとき、げーむMainに移動


(リスト)



課題(shoot64.hsp)
 ゲームオーバーでプログラムを終了する前に確認のダイアログを表示する。

ヒント
・ダイアログでメッセージを表示する命令は dialog である。
 図のようにダイアログが表示されるようにヘルプを参考にして考えよ。
 メッセージ 「ゲーム・オーバーです。もう一度しますか。」の途中で改行させる場合、改行したい位置に "\n" を入れる。
 「はい」をクリックすると自機の残数3機からスタートする。「いいえ」をクリックするとプログラムを終了する。


(リスト)


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

 

 

inserted by FC2 system