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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0929
ko-kkoシューティング {敵と自機との衝突判定}2解決


ko-kko

リンク

2010/9/29(Wed) 01:01:34|NO.35188

現在STGを作っています。今「ライフが最初に3つあって敵とぶつかるとライフが一つ減る」という処理を作りたいですが、
まず敵との衝突判定が分かりません。
講座どうりやってみたけど敵機と自機がぶつかってもそのままスルーしました



randomize
buffer 1 ;ウィンドウID1
picload "HSP2.jpg";画像
screen 0,1010,530 ;画面
boxf
gmode 2
button "start" ,*start ;スタート
*mainmenu
await 1
goto *mainmenu
*start
cls 4
gsel 0
tama=0 ;自機弾0:発射していない1:発射している
tama_x=0 : tama_y=0 ;自機弾の座標


ENEMYMAX=5;敵の最大

repeat ENEMYMAX
enemy.cnt=0 ;敵の存在 0:いない1:いる
emx.cnt=0:emy.cnt=0 ;敵の座標
loop

jkx=(1010-60)/2:jky=400 ;初期位置
jkb=0  ;自機の存在 0:いる -1:いない
nokori=3 ;自機残数
dim tama,2  自機弾
dim tama_x,2
dim tama_y,2

*game
;mainloop メインループ
repeat 1
redraw 0

gosub *move ;自機処理
gosub *teki1 ;敵機処理
gosub *hitcheck ;当たり判定
gosub *attack  ;自機と敵との衝突判定
gosub *jiki_disp ;自機残数処理
if jkb=-1:nokori=nokori-1 ;自機状態なし
loop

repeat ENEMYMAX

if enemy.cnt : pos emx.cnt,emy.cnt : gcopy 1,155,0,70,55 ;敵
loop

await 16
redraw 1
goto *game

*move
color 165,250,250
boxf
color 0,0,0

;移動量
pos jkx,jky
gcopy 1,0,0,55,60 ;画像
stick key, 15 ;キー
if key&1:jkx=jkx-16 ;左
if key&2:jky=jky-16 ;上
if key&4:jkx=jkx+16 ;右
if key&8:jky=jky+16 ;下

;弾設定
if key&&16{
repeat 2
if tama(cnt)=0{
tama(cnt)=1
tama_x(cnt)=(jkx)
tama_y(cnt)=(jky)
break
}
loop
}

repeat 2
if tama_y(cnt)<0:tama(cnt)=0
if tama(cnt)=1{
tama_y(cnt)-=30
pos tama_x(cnt),tama_y(cnt)
gcopy 1,60,0,57,70;弾画像

}
loop

;ウィンドウ内
if jkx>=ginfo_winx-50:jkx=ginfo_winx-50
if jkx<=0:jkx=0
if jky>=ginfo_winy-50:jky=ginfo_winy-50
if jky<=0:jky=0
return

*teki1
repeat ENEMYMAX
emrnd=rnd(20)
if emrnd<12:break
b=rnd(1010-60) ;乱数
if enemy.cnt=0:emx.cnt=b:emy.cnt=0:enemy.cnt=1
loop

repeat ENEMYMAX ;敵の処理

if enemy.cnt:emy.cnt+=3 ;SPEED
if emy.cnt>530:emx.cnt=0:emy.cnt=0:enemy.cnt=0
loop
return

;当たり判定
*hitcheck

repeat ENEMYMAX

if enemy.cnt and tama {
ex=emx.cnt:ey=emy.cnt:tx=tama_x:ty=tama_y
if (ex<tx+57)and(ex+70>tx)and(ey<ty+70)and(ey+65>ty){
enemy.cnt=0:emx.cnt=0:emy.cnt=0
break
}
}loop
return

*jiki_disp
if nokori <= 0 :return ;残り0なら戻る
color 0, 10, 40 ;表示領域
boxf 0,465,200,530 ;自機消去
repeat nokori - 1
pos 60,470
font "MSゴジック",26,1
color 255,255,255
mes strf("LIFE %01d" , nokori )
pos 0 ,468
gcopy 1, 0, 0,55,60
loop
return

;敵機と自機の衝突判定
*attack
foreach ENEMYMAX
if enemy.cnt = 0 & (jky+60 > emy.cnt) && (jkx+55 > emx.cnt) &&(emx.cnt+57>jkx) &&(emy.cnt+70>jky) {
;爆破アニメーション
redraw 1
pos jkx * 8 , jky * 8
repeat 17, 1
gcopy 1, cnt * 60, 60
wait 50
loop
jkb = -1 ;自機状態なし 設定
break
}
loop
return



この記事に返信する


SYAM

リンク

2010/9/29(Wed) 10:49:51|NO.35192

間違いその1:
foreach の使い方が間違っています。foreachに与えるのはループ回数ではありません。

foreach enemy
のように、処理したい配列変数名を与えるか、または repeat にループ回数を与えてループさせましょう。

間違いその2:
当たりの条件に「その敵が"いない"とき」なんてのが入っています。よく見てみましょう。

間違いその3:
掲示板にスクリプトを貼るときは、<pre>と</pre>で囲みましょう。(実際には半角の)
すると

こんな感じ
になります。
また、一応動くスクリプトを貼ったあとは書き換えたりしないようにしましょう。
全角スペースとか混じってると動かなくなってしまいます。



ko-kko

リンク

2010/11/14(Sun) 11:44:11|NO.35818

解決できました。ありがとうございます



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