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


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0819
Empeld-Crn弾を消すときに・・・4解決


Empeld-Crn

リンク

2009/8/19(Wed) 10:44:22|NO.27154

すみません、この掲示板で何度か質問をさせて頂いてるEmpeld-Crnといいます。
今回は、画面外に出た弾を消すときに起こる問題について質問させて頂きます。

それは、弾が勝手に消えてしまうということです。
弾が1個の時は問題ないのですが、弾が2個以上になると問題が起こります。

おそらく、1個目の弾を消すときに間違えて2個目(?)の処理を止めてしまい、
2個目(?)の処理が行われなくなってしまったことが原因と思われます。

さらに、3個目以上になると、2個目が消えるときにエラーメッセージが出ます。

エラーメッセージは以下の通りです。

#Error 7 in line 68 (main.hsp)
-->配列の要素が無効です

この問題を解決するべく、修正を加えたりネットで調べたりしましたが
良い解決方法が見つかりませんでした。

解決方法をご存じの方が居ましたら教えて下さるとありがたいです。

プログラムは以下の通りです。
十字キーで移動、 スペースキーで弾発射です。

scr_x = 640 ; スクリーンの大きさ指定(x) ; 1行目 scr_y = 480 ; スクリーンの大きさ指定(y) screen 0,scr_x,scr_y player_ballet_onmany = 0 ; 画面上に弾がいくつあるか background_R = 0 ; 背景色R background_G = 0 ; 背景色G background_B = 0 ; 背景色B player_ballet_max = 8 dim player_ballet_x ,player_ballet_max dim player_ballet_y ,player_ballet_max dim player_ballet_onscr,player_ballet_max player_main_move = 4 ;動く速さ player_ballet_move = 8 ;球の速さ player_main_x = scr_x / 2 - player_main_size / 2 ; 初期位置設定(x) player_main_y = scr_y / 2 - player_main_size / 2 ; 初期位置設定(y) buffer 2,32*5,32 player_main_size = ginfo(13) ;プレイヤーのサイズを取得する buffer 3,32*5,32 player_ballet_size = ginfo(13) ;弾のサイズを取得する *game_main gsel 0 gmode 2 //完全な黒は透過する repeat player_state = 0 redraw 0 color background_R,background_G,background_B : boxf //キー判定部 stick keychk,1+2+4+8 if keychk && 1 { if player_main_x > 0 { player_main_x = player_main_x - player_main_move } } if keychk && 2 { if player_main_y > 0 { player_main_y = player_main_y - player_main_move } } if keychk && 4 { if player_main_x + player_main_size < scr_x { player_main_x = player_main_x + player_main_move } } if keychk && 8 { if player_main_y + player_main_size < scr_y { player_main_y = player_main_y + player_main_move } } if keychk && 16 { //弾を発射するかどうか if player_ballet_onmany < player_ballet_max { if player_ballet_onscr(player_ballet_onmany) = 0 { player_ballet_x(player_ballet_onmany) = player_main_x player_ballet_y(player_ballet_onmany) = player_main_y player_ballet_onscr(player_ballet_onmany) = 1 ; 発射 player_ballet_onmany++ } } } if keychk && 128 : end //デバッグ用 title "キー:"+keychk+" 状態:"+player_state+" 玉の数"+player_ballet_onmany //主人公の描絵処理部 pos player_main_x,player_main_y gcopy 2,player_main_size,0,player_main_size,player_main_size //玉の描絵処理部 repeat player_ballet_onmany,1 var = player_ballet_onmany - cnt if player_ballet_onscr(var) = 1 { //エラーの起こる68行目です。 pos player_ballet_x(var),player_ballet_y(var) plballet_glphi = plballet_state*player_ballet_size gcopy 3,plballet_glphi,0,player_ballet_size,player_ballet_size player_ballet_y(var) = player_ballet_y(var) - player_ballet_move player_ballet_y2(var) = player_ballet_y(var) + player_ballet_size if player_ballet_y2(var) < 0 { player_ballet_onscr(var) = 0 player_ballet_onmany-- } } loop redraw 1 wait 1 loop



この記事に返信する


f(冷麦中)

リンク

2009/8/19(Wed) 11:19:38|NO.27155

「配列の要素が無効」

と言われたからには、配列の要素指定の変数varがどんな値になってるか確認したか?
そしてソレが何故なのか考えてみれば良いんでね?



ぷーさん

リンク

2009/8/19(Wed) 11:28:51|NO.27156

簡単に書いてみたから参考にしてください。

x=280
y=200
max=100
speed=5
dim onscr,max
dim bx,max
dim by,max

buffer 1
gsel 0
repeat
redraw 0
color 0,0,0:boxf
gosub *draw
gosub *check
redraw 1
await 1
loop
*check
stick key,1+2+4+8
if key&1:x-speed
if key&2:y-speed
if key&4:x+speed
if key&8:y+speed
if key&16{
repeat max
if onscr(cnt)=0{
onscr(cnt)=1
bx(cnt)=x
by(cnt)=y
break
}
loop
}
return

*draw
pos x,y
gcopy 1,0,0,40,40
repeat max
if onscr(cnt)=1{
pos bx(cnt),by(cnt)
by(cnt)-speed
gcopy 1,0,0,40,40
}
if by(cnt)<=0:onscr(cnt)=0
loop
return



ぷーさん

リンク

2009/8/19(Wed) 11:33:14|NO.27157

訂正です。

if by(cnt)<=0:onscr(cnt)=0
      ↓
if by(cnt)<=-40:onscr(cnt)=0



Empeld-Crn

リンク

2009/8/19(Wed) 16:07:10|NO.27166

お二人とも返答、ありがとうございます。

>>f(冷麦中) さん
弾は番号が若い方(0)から先に出ているので、若い方から消そうと思って
このようなプログラムにしたんですが、若い方の弾を消していったときに結果(var)が
負の数値になってしまい、
結果条件式が
if player_ballet_onscr(-1) = 1
になり
エラーが出てしまう、ということがわかりました。ありがとうございます。 >>ぷーさん さん 解りやすく簡潔なサンプル、ありがとうございます。 正直、弾を出すところにrepeat使う事を思いつきませんでした。 repeatのほうが簡単ですね・・・ それでお二人の返答を見て、頑張ったらなんとかできました。 一応おいときますね。
	scr_x = 640            ; スクリーンの大きさ指定(x)
	scr_y = 480+32            ; スクリーンの大きさ指定(y)
	player_ballet_onmany = 0 ; 画面上に弾がいくつあるか
	player_state = 0 ; プレイヤーの状態
	background_R = 0 ; 背景色R
	background_G = 0 ; 背景色G
	background_B = 0 ; 背景色B
	player_ballet_max = 8
	dim player_ballet_x    ,player_ballet_max
	dim player_ballet_y    ,player_ballet_max
	dim player_ballet_x2   ,player_ballet_max
	dim player_ballet_y2   ,player_ballet_max
	dim player_ballet_onscr,player_ballet_max
	screen 0,scr_x,scr_y
	player_main_move = 4     ;動く速さ
	player_ballet_move = 8   ;球の速さ
	player_main_x = scr_x / 2 - player_main_size / 2          ; 初期位置設定(x)
	player_main_y = scr_y / 2 - player_main_size / 2          ; 初期位置設定(y)
	buffer 2,32*5,32
						//picload ".\\image\\player_main.bmp"
	player_main_size = ginfo(13) ;プレイヤーのサイズを取得する
	buffer 3,32*5,32
						//picload ".\\image\\player_ballet.bmp"
	player_ballet_size = ginfo(13) ;弾のサイズを取得する
*game_main
	gsel 0
	//完全な黒は透過する
	gmode 2
	repeat
		player_state = 0
		redraw 0
			color background_R,background_G,background_B : boxf
			//キー判定部
			stick keychk,1+2+4+8
			if keychk && 1 {
				if player_main_x > 0 {
					player_main_x = player_main_x - player_main_move
					player_state = 1
				}
				else {
					player_state = 1
				}
			}
			if keychk && 2 {
				if player_main_y > 0 {
					player_main_y = player_main_y - player_main_move
					player_state = 2
				}
				else {
					player_state = 2
				}
			}
			if keychk && 4 {
				if player_main_x + player_main_size < scr_x {
					player_main_x = player_main_x + player_main_move
					player_state = 3
				}
				else {
					player_state = 3
				}
			}
			if keychk && 8 {
				if player_main_y + player_main_size < scr_y {
					player_main_y = player_main_y + player_main_move
					player_state = 4
				}
				else {
					player_state = 4
				}
			}
			//弾を発射するかどうか
			if keychk && 16 {
				if player_ballet_onmany < player_ballet_max {
					repeat player_ballet_max
						if player_ballet_onscr(cnt) = 0 {
							player_ballet_x(cnt) = player_main_x
							player_ballet_y(cnt) = player_main_y
							player_ballet_onscr(cnt) = 1          ; 発射
							player_ballet_onmany++
							break
						}
					loop
				}
			}
			if keychk && 128 : end
			//デバッグ用
			if player_ballet_onmany = player_ballet_max {
				title "キー:"+keychk+" 状態:"+player_state+" 玉の数"+player_ballet_onmany+"(MAX)"
			}
			else {
				title "キー:"+keychk+" 状態:"+player_state+" 玉の数"+player_ballet_onmany
			}
			//主人公の描絵処理部
			pos player_main_x,player_main_y
			plmain_glphi = player_state*player_main_size
			gcopy 2,plmain_glphi,0,player_main_size,player_main_size
			//玉の描絵処理部
			repeat player_ballet_max
				if player_ballet_onscr(cnt) = 1 {
					pos player_ballet_x(cnt),player_ballet_y(cnt)
					player_ballet_y(cnt) = player_ballet_y(cnt) - player_ballet_move
					plballet_glphi = plballet_state*player_ballet_size
					gcopy 3,plballet_glphi,0,player_ballet_size,player_ballet_size
					player_ballet_y2(cnt) = player_ballet_y(cnt) + player_ballet_size
					if player_ballet_y2(cnt) < 0 {
						player_ballet_onscr(cnt) = 0
						player_ballet_onmany--
					}
				}
			loop
		redraw 1
		wait 1
	loop

お二人とも本当に、ありがとうございました。



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