HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0513
たかしSTGで敵にHPをつけたいです。1未解決


たかし

リンク

2014/5/13(Tue) 22:39:57|NO.61980

STGを作っていて、敵にHPをつけたいのです。
ですが私の作ったプログラムでは5発当たったら倒せるようにしたのに、
1発あたっただけで敵はやられてしまいます。
次が私の作ったプログラムです。

buffer 1,128,66 //仮想バッファ画面を用意
picload "jam.png" //仮想のバッファ画面に画像ファイルの読み込みと画像の表示
buffer 2,768,192
picload "explosion.png"
buffer 3,392,455
picload "beam.png"
screen 0,800,800 //メインウィンドウを表示
gmode 2 //画像ファイルの黒い部分を背景とみなして透明にする

//自機の情報
HP = 300 //自機のHP
x = 400 //自機の初期位置
y = 800

//自機の弾の情報
//レベル1
dim tama,40
dim tama_x,40
dim tama_y,40

//敵の情報
dim enemy,20
dim enemy_x,20
dim enemy_y,20
dim enemy_hp,20

//敵機HPの配列を初期化
e = 1
repeat 20
enemy_hp(e)=5
e++
loop

//爆発アニメ
dim exp,10 //爆発アニメの現在のコマ
dim exp_x,10 //爆発した座標が入る
dim exp_y,10

*main
gosub *display
gosub *jiki_process
gosub *enemy_appear
gosub *bullet
gosub *enemy_process
gosub *explosion

redraw 1
await 0
redraw 0
goto *main


//画面初期化&自機描画ルーチン
*display
color 0,0,0 //背景の色
boxf 0,0,800,800 //指定範囲を塗りつぶす
pos x,y //gcopyで切り取りコピーしてきた画像データの表示位置
gcopy 1,0,0,64,66 //バッファ画面にある画像をメインウィンドウへ切り出す
color 30,30,70 //体力ゲージの色
boxf 0,0,HP,20 //体力ゲージ

return

//自機の操作ルーチン
*jiki_process
stick key,31 //自機の操作
if key && 1:x--
if key && 2:y--
if key && 4:x++
if key && 8:y++


//スペースキーで弾を打つ
if key && 16 {
repeat 40
if tama(cnt) = 0 { //tama(cnt)=0ならば番号cntの弾は発射されていない
tama(cnt) = 1 //弾の発射状態をtama(cnt)=1にする。
//弾の座標を指定
tama_x(cnt) = x+3
tama_y(cnt) = y
break
}
loop
}


//自機が画面からはみ出ないように範囲を指定
if x < 0 :x = 0
if x > 730:x = 730
if y < 0 :y = 0
if y > 730:y = 730

return


//敵出現ルーチン
*enemy_appear
time++
if (time \ 200) = 0 { //timeが200の倍数になるたびに実行
repeat 20
if enemy(cnt) = 0 {
enemy(cnt) = 1
enemy_x(cnt) = rnd(761) //敵機出現座標はランダム
enemy_y(cnt) = -40
enemy_hp(cnt) = 10
break
}
loop
}
return

//敵機挙動ルーチン
*enemy_process
//敵の処理
repeat 20
if enemy_y(cnt) > 800 : enemy(cnt) = 0
if enemy(cnt) = 1{
enemy_y(cnt)++
if (abs(x - enemy_x(cnt)) < 40) & (abs(y - enemy_y(cnt)) < 40){
enemy(cnt) = 0 //自機と敵機が重なったら敵機消滅
repeat 10
HP=HP-100 //ダメージ受ける
if exp(cnt) = 0 :i = cnt:break //exp(cnt)=0の配列を探す。見つけたらbreak。
loop
exp(i) = 1 //exp(i)=1にして爆発状態にする
exp_x(i) = enemy_x(cnt) - 28 //爆発した座標をexp_x,yに入れる
exp_y(i) = enemy_y(cnt) - 28
}
pos enemy_x(cnt),enemy_y(cnt)
gcopy 1,65,0,128,66
}
loop
return

//弾の処理ルーチン
*bullet
repeat 40
if tama_y(cnt) < 0 : tama(cnt) = 0 //弾が画面外に出たらtama(cnt)=0に戻す
if tama(cnt) = 1 {
tama_y(cnt)-=10 //1ループごとに弾を上方向へ動かす
i = cnt
repeat 20
if enemy(cnt) = 1 {
if (abs(tama_x(i) - enemy_x(cnt)) < 40) & (abs(tama_y(i) - enemy_y(cnt)) < 40){
enemy_hp(cnt)--
if(enemy_hp(cnt) < 0){
enemy(cnt) = 0 //弾と敵機が重なったら敵機消滅
repeat 10

if exp(cnt) = 0 :i = cnt:break
loop
exp(i) = 1
exp_x(i) = enemy_x(cnt) - 28
exp_y(i) = enemy_y(cnt) - 28
}
pos enemy_x(cnt),enemy_y(cnt)
gcopy 1,40,0,40,40
}
}
loop
pos tama_x,tama_y
gcopy 3,0,0,40,40

}
loop

return


//爆発アニメ
*explosion
repeat 10
if exp(cnt) = 0 :continue
pos exp_x(cnt),exp_y(cnt)
flame = int((exp(cnt)-1)/4)
if (exp(cnt) >= 1) & (exp(cnt) <= 36) :gcopy 2,flame * 96,0,96,96
if (exp(cnt) >= 37) & (exp(cnt) <= 60) :gcopy 2,flame * 96,96,96,96
exp(cnt)++
if exp(cnt) = 61 :exp(cnt) = 0
loop
return


最初に敵機のHP配列を5に初期化して、弾の処理ルーチンで1発あたるごとにHPを1ずつ減らします。
敵のHPが0になったらif文の中身が実行され、敵は消滅します。

どこがいけないのかご教授お願いします。



この記事に返信する


暇人

リンク

2014/5/13(Tue) 23:33:48|NO.61983

複数おかしい所があるけど・・・

一番の原因は、弾が当たった後に、弾を消してないので
弾が通り抜けるまで複数回当たる事になる

これを解決してもまだ似たような現象が起きると思う
それは、await 0にしてるから
スペースを押して放されるまでの間にかなりの弾数が出てる(メインループ回るのが速すぎる)
自分の環境だとポンと押しただけで20発出てる(PCの性能で変る)

まずは、await 16でFPS60ぐらいを維持できるように作った方が良いと思う

>HP配列を5に初期化して
5で初期化はしてるけど
実際に使ってるのは
>enemy_hp(cnt) = 10
10になってる


>pos tama_x,tama_y
これは

pos tama_x(cnt),tama_y(cnt)
って、しないと全部一箇所に描画される



ONION software Copyright 1997-2023(c) All rights reserved.