今回は、画面外に出た弾を消すときに起こる問題について質問させて頂きます。
それは、弾が勝手に消えてしまうということです。
弾が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