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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
1114
当たり判定が動かない4解決


リンク

2015/11/14(Sat) 13:33:59|NO.73010

またしても上手くイカなくなったので質問させていただきます。いろいろ書いていって、とりあえず
完成間近までなったのですが、ここで問題が出てきました。円形弾幕を発射する敵が、
画面外に出た時に、生存フラグを0にするということを書くのを忘れていたので、その部分を付け足しました。
そして、実行したところ、最初の数発の自機狙い弾が自機をすり抜けていくようになったのです。

if enemy_x2(cnt)>500.0 or enemy_x2(cnt)<-8.0: enemy_f2(cnt) = 0
の部分を消すとちゃんと
動くのですが、入れるとちゃんと動きません。なぜでしょうか?
;乱数初期化
randomize
buffer 2
font"MSゴシック",40,1
mes "GAME CLEAR!!"

;画面作成
screen 0,500,500


;変数の確保
jiki_x = 250.0
jiki_y = 400.0


enemy_max = 500
;自機狙い弾の敵と弾
dim enemy_f,enemy_max
ddim enemy_x,enemy_max
ddim enemy_y,enemy_max

dim e_shot_f,enemy_max
ddim e_shot_x,enemy_max
ddim e_shot_y,enemy_max
ddim e_shot_vx,enemy_max
ddim e_shot_vy,enemy_max
;円形弾幕の敵と弾
dim enemy_f2,enemy_max
dim enemy_type,enemy_max
ddim enemy_x2,enemy_max
ddim enemy_vx2,enemy_max
ddim enemy_y2,enemy_max


dim e_shot_f2,enemy_max
ddim e_shot_x2,enemy_max
ddim e_shot_y2,enemy_max
ddim e_shot_vx2,enemy_max
ddim e_shot_vy2,enemy_max

frame = 0
time_limit = 8000.00


e_frame = 240 ; 自機狙い弾を発射する間隔
e_time = 720  ; 円形弾幕を発射する間隔

;メインループ
*main
	
;画面の塗りつぶし
	color 255,255,255 : boxf


;キー入力取得
	stick k,15
		if k&1:jiki_x-2.0
		if k&2:jiki_y-2.0
		if k&4:jiki_x+2.0
		if k&8:jiki_y+2.0
		if k = 128:end
;画面外に出ないようにする処理	
	if jiki_x>492:jiki_x = 492.0
	if jiki_x<8:jiki_x = 8.0
	if jiki_y>492:jiki_y = 492.0
	if jiki_y<8:jiki_y = 8.0
	
;三角の敵出現
	if frame\e_frame = 1 : gosub*enemy_search
;丸の敵出現
	if frame\e_time = 1 : gosub*enemy_search2
;自機狙い弾弾発射	
	repeat enemy_max
	if enemy_y(cnt) = 100.0{
	enemy_num=cnt
		gosub*e_shot_search
		}
	loop
;円形弾幕発射
	repeat enemy_max
	if enemy_x2(cnt) = 250.0 or enemy_x2(cnt) = 260.0{
				e_number = cnt
				gosub *circle_shot_search
			}
	loop
;当たり判定
for i,0,enemy_max,1

ax = jiki_x-enemy_x(i) : ay = jiki_y-enemy_y(i)
ax2 = jiki_x-e_shot_x(i) : ay2 = jiki_y-e_shot_y(i)
ax3 = jiki_x-enemy_x2(i) : ay3 = jiki_y-enemy_y2(i)
ax4 = jiki_x-e_shot_x2(i) : ay4 = jiki_y-e_shot_y2(i)

ax = ax*ax : ay = ay*ay
ax2 = ax2*ax2 : ay2 = ay2*ay2
ax3 = ax3*ax3 : ay3 = ay3*ay3
ax4 = ax4*ax4 : ay4 = ay4*ay4

if enemy_f(i) = 1{
	if ax+ay<=16.0:goto*game_end
	} 
if enemy_f2(i) = 1{
	if ax2+ay2<=16.0:goto*game_end
	} 
if e_shot_f(i) = 1{
	if ax3+ay3<=16.0:goto*game_end
	} 
if e_shot_f2(i) = 1{
	if ax4+ay4<=16.0:goto*game_end
	} 
	
next


;移動と描画
	repeat enemy_max
	
	if enemy_f(cnt) = 1{
		enemy_y(cnt) + 2.0
		color 255,0,0
		pos enemy_x(cnt)-8.0,enemy_y(cnt)-8.0
		mes"▼"
		}
	if enemy_y(cnt)>500.0:enemy_f(cnt)=0
	
	if enemy_f2(cnt) = 1{
		enemy_x2(cnt)+enemy_vx2(cnt)
		color 255,0,255
		pos enemy_x2(cnt)-8.0,enemy_y2(cnt)-8.0
		mes"★"
	}
	if e_shot_f(cnt) = 1{
		e_shot_x(cnt) = e_shot_x(cnt) + e_shot_vx(cnt)
		e_shot_y(cnt) = e_shot_y(cnt) + e_shot_vy(cnt)		
		color 255,0,0
		pos e_shot_x(cnt)-8.0,e_shot_y(cnt)-8.0
		mes"●"
	}
	if e_shot_f2(cnt) = 1{
		e_shot_x2(cnt) = e_shot_x2(cnt) + e_shot_vx2(cnt)
		e_shot_y2(cnt) = e_shot_y2(cnt) + e_shot_vy2(cnt)
		color 255,,255
		pos e_shot_x2(cnt)-8,e_shot_y2(cnt)-8
		mes"●"
	}
	if e_shot_x(cnt)>508.0 or e_shot_x(cnt)<-8.0 or e_shot_y(cnt)>508.0 or e_shot_y(cnt)<-8.0 : e_shot_f(cnt) = 0
	if e_shot_x2(cnt)>508.0 or e_shot_x2(cnt)<-8.0 or e_shot_y2(cnt)>508.0 or e_shot_y2(cnt)<-8.0 : e_shot_f2(cnt) = 0
	if enemy_y(cnt)>508.0 : enemy_f(cnt) = 0
	if enemy_x2(cnt)>508.0 or enemy_x2(cnt)<-8.0: enemy_f2(cnt) = 0
	loop
;自機描画
		color 0,0,255
		pos jiki_x-8.0,jiki_y-8.0
		mes"▲"
	color ,,,
	pos 0,0
	mes "残り時間:あと"+time_limit / 100.0000

if time_limit = 0.0{
	goto*game_clear
		
	}
if frame=1000 or frame = 3000 or frame = 5000{
	e_frame = e_frame / 2
	e_time = e_time / 2

}
	redraw 1
	redraw 0
	await 7
frame++
time_limit--
goto*main
;三角の敵の検索
*enemy_search
	repeat enemy_max
if enemy_f(cnt) =0{
		enemy_f(cnt) = 1
		enemy_x(cnt) = 1.0+rnd(500)
		enemy_y(cnt) = -8.0
		break
	}
	loop
return
;自機狙い弾の検索
*e_shot_search
	repeat enemy_max
if e_shot_f(cnt) = 0{
	e_shot_f(cnt) = 1
		e_shot_x(cnt) = enemy_x(enemy_num)
		e_shot_y(cnt) = enemy_y(enemy_num)
		t = atan(jiki_y-e_shot_y(cnt),jiki_x-e_shot_x(cnt))
		e_shot_vx(cnt) = cos(t) * 2.5
		e_shot_vy(cnt) = sin(t) * 2.5
	break
	}
	loop
return
;丸の敵の検索
*enemy_search2
	repeat enemy_max
if enemy_f2(cnt) =0{
		enemy_f2(cnt) = 1
		enemy_type(cnt) = cnt\2
	if enemy_type(cnt)=0{
			enemy_x2(cnt) = -8.0
			enemy_vx2(cnt) = 3.0
		}else{
			enemy_x2(cnt) = 500.0
			enemy_vx2(cnt) = -3.0
		}
		enemy_y2(cnt) = 1.0+rnd(270)
		break
	}
	loop
return
;円形弾幕の情報を作成
*circle_shot_search
	g = 50	;敵一騎が作成する敵弾数
	repeat g
		t2=m_pi*2*cnt/g  ;円形弾幕の一つの弾がもつ角度
		gosub *e_shot_search2
		if number = -1 : break
		e_shot_x2(number) = enemy_x2(e_number)
		e_shot_y2(number) = enemy_y2(e_number)
		e_shot_f2(number) = 1
		e_shot_vx2(number) = cos(t2) * 1.5 
		e_shot_vy2(number) = sin(t2) * 1.5
	loop
return

;円形弾幕の検索
*e_shot_search2
	number = -1
	repeat enemy_max
if e_shot_f2(cnt) = 0:number = cnt:break
	loop
return

;被弾した時の処理
*game_end
	
dialog "もう一回チャレンジしますか?",2,"GAME OVER"
if stat = 6 :goto*start
if stat = 7 : end

;リプレイするときに各値を初期値に戻す
*start
	jiki_x = 1.0+rnd(500) : jiki_y = 400.0
	frame = 0 : time_limit = 8000.0
	e_frame = 240 : e_time = 720
	repeat enemy_max
		enemy_f(cnt) = 0
		enemy_f2(cnt) = 0
		e_shot_f(cnt) = 0
		e_shot_f2(cnt) = 0
	loop

goto*main

*game_clear
	color 255,255,255 : boxf
	redraw 1
	pos 100,250
	gcopy 2,0,0,400,41
	
	color ,,,
	pos 10,320
	mes "Enterキー : もう一回遊ぶ | スペースキー : ゲームを終了する"
	
	
	repeat
			getkey key,13 :if key : break
			getkey key,32 :if key : end
		await 4
	loop
goto*start



この記事に返信する


Noap

リンク

2015/11/14(Sat) 17:56:22|NO.73016

enemy_f2(cnt) = 0ではなくe_shot_f(i)=0だと思います
間違っていればごめんなさい



k

リンク

2015/11/14(Sat) 23:31:45|NO.73024

当たり判定の部分が入れ替わってますね

if enemy_f2(i) = 1{ if ax2+ay2<=16.0:goto*game_end } if e_shot_f(i) = 1{ if ax3+ay3<=16.0:goto*game_end }


if e_shot_f(i) = 1{ if ax2+ay2<=16.0:goto*game_end } if enemy_f2(i) = 1{ if ax3+ay3<=16.0:goto*game_end }
にしたら当たりました^^;



Noap

リンク

2015/11/14(Sat) 23:42:18|NO.73025

そこが逆でしたか。ちゃんとフラグを追っていったつもりなのですが間違えてしまいました。ごめんなさい。



リンク

2015/11/15(Sun) 00:28:55|NO.73026

おふたりともありがとうございました。
私が見落としていたばっかりにすみません。



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