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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
1004
Watasukeエラーの原因がわからない2解決


Watasuke

リンク

2017/10/4(Wed) 21:21:11|NO.81561

初めて質問をさせていただきます。
HSP3.5Betaシューティングゲームを製作中なのですが、球を打った瞬間に当たり判定のラベルででエラー7(配列の要素が無効です)と出てしまいます。
確認しても、エラーの原因になりそうな場所は見当たりませんでした。
見落としているだけかもしれませんし、コードも見にくいとは思いますが、回答お願いします。
当たり判定はこちらのページを参考にしました。
http://www.geocities.jp/hspgame2/
(Windows7Pro,8.1Homeでエラー確認)
○ラベルの使用状況
・dan:スペースキーが押されているかを確認し、押されていれば球発射のフラグを立てる
・teki:ランダムで敵を発生させ、動かす
・ata:球と敵の当たり判定(ここの103行目でエラー)

//ここから下スクリプト screen 0,800,600 kx=20 ky=521 dim tm,50 dim dx,50 dim dy,50 dim tk,50 dim tx,50 dim txy,50 dim ty,50 dim tyy,50 dim st,30 dim sx,30 dim sy,30 dim sk,30 dim sp,30 dim si,30 mmplay repeat redraw 0 getkey keyx,88 getkey keyz,90 getkey sft,16 getkey hi,37 getkey ue,38 getkey mi,39 getkey si,40 getkey sft,16 if hi=1:if sft=0:kx-4:else:kx-1 if ue=1:if sft=0:ky-4:else:ky-1 if mi=1:if sft=0:kx+4:else:kx+1 if si=1:if sft=0:ky+4:else:ky+1 if kx<=20:kx=20 if ky<=31:ky=31 if kx>=460:kx=460 if ky>=550:ky=550 color 0,0,0 boxf color 50,50,50 boxf 20,30,500,590 gosub*dan gosub*teki gosub*ata font"",25 color 0,0,0 pos kx,ky mes"自" color 0,0,0 boxf 0,0,20,590 boxf 0,0,500,30 boxf 0,590,500,620 redraw 1 wait 2 loop *dan if keyz=1{ repeat 50 if tm(cnt)=0{ tm(cnt)=1 tmh(cnt)=1 dx(cnt)=(kx+10) dy(cnt)=ky-5 break } loop } color 0,0,0 repeat 50 if tm(cnt)=1{ dy(cnt)-12 pos dx(cnt),dy(cnt) if dy(cnt)>=25:pset dx(cnt) , dy(cnt) if dy(cnt)<=30:tm(cnt)=0 } loop  return *teki randomize if rnd(20)=0{ repeat 50 if tk(cnt)=0{ tk(cnt)=1 tx(cnt)=rnd(30-500) ty(cnt)=-20 break } loop } repeat 50 if tk(cnt)=1{ if ty(cnt)>=350:tx(cnt)-3 ty(cnt)+3 pos tx(cnt),ty(cnt) if (tx(cnt)<=-20)|(ty(cnt)>=640):tk(cnt)=0:else:mes"敵" } loop return *ata repeat 50 if tm(cnt)=1{ repeat 50 if tk(cn)=1:if(abs(dx(xyz)-tx(cn))<40)&(abs(dy(xyz)-ty(cn))<40)&(abs(dx(xyz)-tx(cn))>0)&(abs(dy(xyz)-ty(cn))>0){ tk(cn)=0 tm(xyz)=0 score+200 if score>hscore:hscore=score break } cn+1 loop } xyz+1 loop return //---Program End---//
お願いします。



この記事に返信する


MillkeyStars

リンク

2017/10/4(Wed) 21:50:10|NO.81562

cn と xyz が初期化(初期値)されていない。
なので、2回目の *ata が実行されると、前回の続きから cn と xyz が加算されてしまう。



Watasuke

リンク

2017/10/5(Thu) 05:59:42|NO.81567

MillkeyStars さん
回答ありがとうございます。
指摘通りに変数を0に初期化してみたところ、うまくいきました。
初期化していないせいで宣言していない配列が参照されるのですね。見落としていました。


*ata cn=0 xyz=0 repeat 50 cn=0 if tm(cnt)=1{ repeat 50 if tk(cn)=1:if(abs(dx(xyz)-tx(cn))<40)&(abs(dy(xyz)-ty(cn))<40)&(abs(dx(xyz)-tx(cn))>0)&(abs(dy(xyz)-ty(cn))>0){ tk(cn)=0 tm(xyz)=0 score+200 if score>hscore:hscore=score break } cn+1 loop } xyz+1 loop return



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