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 |