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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0909
火狐なんか配列の要素が無効ですってでます3未解決


火狐

リンク

2013/9/9(Mon) 14:37:25|NO.57031

プログラムを実行すると
130行目の配列の要素が無効です
的なエラーがでます。どうすればいいでしょうか?

cls 4 color 255,255,255 ;///画像読み込み/// *start color 0,0,0 boxf 0,0,2000,2000 color 255,255,255 buffer 1 :mes "自キャラ" ;自キャラ画像読み込み buffer 3 :mes "爆発" buffer 2 :mes "地形地形地形地形" buffer 6 color 0,0,0 boxf 0,0,1000,1000 color 255,255,255 pos 0,0 :mes "敵1" pos 100,0 :mes "敵2" pos 200,0 :mes "敵3" pos 300,0 :mes "敵4" pos 400,0 :mes "敵5" screen 0,1350,800 SC=0 :STAGE=1 *GAMESTART screen 0,1350,800 mes "読み込み中・・・" TEKIKAZU=99 gosub *SETPATSTR gosub *SETMAP mmplay 1 MX=80 :MY=160 :MYLIVE=1 dim SX,3 :dim SY,3 :dim SHOT,3 dim EX,TEKIKAZU :dim EY,TEKIKAZU :dim ELIVE,TEKIKAZU dim EDX,TEKIKAZU :dim EDY,TEKIKAZU dim POINTER,TEKIKAZU :dim ELOOP,TEKIKAZU dim ESYURUI,TEKIKAZU ;敵の種類 BAKULIVE=0: BAKUX=0: BAKUY=0 WORLDX=-320 ;スクロール座標 gmode 2 ;/■/■/■メインループ/■/■/■ *hazime redraw 0 color 0,0,0 boxf 0,0,2000,2000 MPSHIFT=WORLDX\16 MPSTART=WORLDX/16 gosub *DRAWMAP ;地形描画呼びだし if MPSHIFT=0 :gosub *SETRETU ;敵配置呼びだし stick KY,31 if (KY&1)=1 :MX=MX-12 :if MX<0 :MX=0 ;自キャラの左移動判定 if (KY&4)=4 :MX=MX+12 :if MX>1280 :MX=1280 ;自キャラの右移動判定 if (KY&2)=2 :MY=MY-12 :if MY<0 :MY=0 ;自キャラの上移動判定 if (KY&8)=8 :MY=MY+12 :if MY>799 :MY=799 ;自キャラの下移動判定 repeat 3 gosub *GOSHOT ;弾処理 loop repeat TEKIKAZU ;敵キャラ処理 if ELIVE(cnt)!0 :gosub *GOENEMY loop repeat TEKIKAZU ;当たり判定 if ELIVE(cnt)!0 :gosub *ATARI loop MPX0=(MPSHIFT+MX+12)/16 :MPY0=(MY+12)/16 ;地形との当たり判定 MPX1=(MPSHIFT+MX+20)/16 :MPY1=(MY+20)/16 C=peek(MAPS,MPY0*MAPLENG+MPSTART-30+MPX0) if (C>'0')and(C<'A') :MYLIVE=0 C=peek(MAPS,MPY1*MAPLENG+MPSTART-30+MPX1) if (C>'0')and(C<'A') :MYLIVE=0 pos MX,MY ;自キャラ表示 gcopy 1,0,0,88,80 if BAKULIVE>0{ ;爆発表示 BAKULIVE=BAKULIVE-1 pos BAKUX,BAKUY gcopy 1,96,0,32,32 } font "MS ゴシック",18,1 ;スコア表示 pos 0,0 :color 255,255,255 :mes "SCORE:"+sc redraw 1 await 30 ;ステージクリアー、ゲームオーバー条件 if MYLIVE=0 :goto *GAMEOVER if MAPLENG-2=MPSTART :goto *CLEARSTAGE ;スクロール WORLDX=WORLDX+4 goto *hazime ;/■/■/■弾の移動ルーチン/■/■/■ *GOSHOT if (KY&16)=16 and SHOT(cnt)=0 and RENSYA=0 { SHOT(cnt)=1 ;弾発射チェック SX(cnt)=MX+40 SY(cnt)=MY+12 RENSYA=20 } if SHOT(cnt)=1 { ;弾移動 SX(cnt)=SX(cnt)+30 color 255,255,80 boxf SX(cnt),SY(cnt),SX(cnt)+20,SY(cnt)+4 if SX(cnt)>1351 :SHOT(cnt)=0 MPX0=(MPSHIFT+SX(cnt)+6)/16 :MPY0=(SY(cnt)+2)/16 ;地形との当たり判定 C=peek(MAPS,MPY0*MAPLENG+MPSTART-30+MPX0) if (C>'0')and(C<'A') :SHOT(cnt)=0 } if RENSYA>0 :RENSYA=RENSYA-1 return ;/■/■/■敵の移動ルーチン/■/■/■ *GOENEMY if ELOOP(cnt)>0 { ELOOP(cnt)=ELOOP(cnt)-1 } else { COM=PATSTR(POINTER(cnt),ESYURUI(cnt)) SP=int(PATSTR(POINTER(cnt)+1,ESYURUI(cnt))) ELOOP(cnt)=int(PATSTR(POINTER(cnt)+2,ESYURUI(cnt))) POINTER(cnt)=POINTER(cnt)+3 SP2=int(0.7*SP) if COM="D1" { ;命令解釈 EDX(cnt)=-SP :EDY(cnt)=0 } if COM="D2" { EDX(cnt)=-SP2:EDY(cnt)=-SP2 } if COM="D3" { EDX(cnt)=0:EDY(cnt)=-SP } if COM="D4" { EDX(cnt)=SP2:EDY(cnt)=-SP2 } if COM="D5" { EDX(cnt)=SP:EDY(cnt)=0 } if COM="D6" { EDX(cnt)=SP2:EDY(cnt)=SP2 } if COM="D7" { EDX(cnt)=0:EDY(cnt)=SP } if COM="D8" { EDX(cnt)=-SP2:EDY(cnt)=SP2 } if COM="S" { D=sqrt( (MX-EX(cnt))*(MX-EX(cnt)) + (MY-EY(cnt))*(MY-EY(cnt)) ) if D!0.0{ EDX(cnt)=int(double(MX-EX(cnt))/D * SP)-2 ;スクロール補正 EDY(cnt)=int(double(MY-EY(cnt))/D * SP) } } if COM="R" :POINTER(cnt)=0 } EX(cnt)=EX(cnt)+EDX(cnt) EY(cnt)=EY(cnt)+EDY(cnt) pos EX(cnt),EY(cnt) gcopy 6,ESYURUI(cnt)*100,0,100,100 if (EX(cnt)<0) or (EX(cnt)>1350) or (EY(cnt)<0) or (EY(cnt)>800) { ELIVE(cnt)=0 ;画面外に出たら消滅 } return ;/■/■/■敵パターン設定/■/■/■ *SETPATSTR sdim PATSTR,3,35,4 PATSTR(0,0)="D1","4","30","D8","6","15","D1","12","70","R","0","0" PATSTR(0,1)="D8","6","10","D1","6","10","D2","6","10","D1","6","10","R","0","0" PATSTR(0,2)="D8","10","30","D2","10","30","R","0","0" PATSTR(0,3)="D1","4","30","D8","6","15","D5","8","70","R","0","0" return ;/■/■/■当たり判定/■/■/■ *ATARI TEV=ELIVE(cnt) :TEX=EX(cnt) :TEY=EY(cnt) if TEV=1 & (TEX+24)>(MX+8) & (MX+24)>(TEX+8) & (TEY+24)>(MY+8) & (MY+24)>(TEY+8) { MYLIVE=0 ;自キャラと敵の当たり判定 } repeat 3 ;敵と弾の当たり判定 if SHOT(cnt)=1 & TEV=1 & (TEX+32)>SX(cnt) & (SX(cnt)+12)>TEX & (TEY+32)>SY(cnt) & (SY(cnt)+12)>TEY { TEV=0 SHOT(cnt)=0 SC=SC+10 mmplay 0 } loop ELIVE(cnt)=TEV return ;/■/■/■マップ読み込み/■/■/■ *SETMAP MAPLENG=512 sdim MAPS,MAPLENG*88 bload "yokomap.txt",MAPS,MAPLENG*20 return ;/■/■/■マップ表示/■/■/■ *DRAWMAP repeat 80 RCNT=cnt repeat 100 if MPSTART-30+cnt<0 :continue C=peek(MAPS,RCNT*MAPLENG+MPSTART-30+cnt) if (C>'0') and (C<'A'){ pos cnt*16-MPSHIFT,RCNT*16 gcopy 2,(C-'1')*16,0,16,16 } loop loop return ;/■/■/■敵配置/■/■/■ *SETRETU if MPSTART<0 :return repeat 80 RCNT=cnt C=peek(MAPS,RCNT*MAPLENG+MPSTART) if C>='A' { repeat TEKIKAZU if ELIVE(cnt)=0 { ELIVE(cnt)=1 EX(cnt)=480 EY(cnt)=RCNT*16 POINTER(cnt)=0 ELOOP(cnt)=0 ESYURUI(cnt)=C-'A' break } loop } loop return ;/■/■/■ステージクリア処理/■/■/■ *CLEARSTAGE color 255,0,0 :font "MS ゴシック",30,1 pos 160,100 :mes "STAGECLEAR" wait 300 STAGE=STAGE+1 SC=SC+100 ;goto *GAMESTART ;次の面がないのでおしまい end ;/■/■/■ゲームオーバー処理/■/■/■ *GAMEOVER mmplay 2 repeat 10 redraw 0 boxf 0,0,2000,2000 XX=cnt+1 pos MX,MY gcopy 3,0+(192*cnt),0,192,192 wait 10 redraw 1 loop SC=0 dialog "ゲームオーバー",1,"GAMEOVER" if stat=6 : goto *hazime end
がプログラムソースです
あと
yokomap.txtという名前のテキストファイルを作っていただくとありがたいです

yokomap.txt

00000000000000000000011111611111111111111811119111111171111111111111111111111111 000000000000000000000000000000000000000000000AD00000000000000000000AD00000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000AD000000000000000000000000000000AD0000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000A000000000000000000000000000000 00000000000000000000B0B0B0B0B0B0B0B000000000000000000001100000001130000000000000 00000000000000000000000000000000000000000000000000000000000B0B0B0B0B0B0B0B000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000333333300333333333333333003333333333333333333333333333333 00000000000000000001111111111167111111111111111661111111111111111111111111111110 00000000000000001111111111111111111811111911111111111111111111111111111111111111



この記事に返信する


KA

リンク

2013/9/9(Mon) 15:27:57|NO.57032

>>どうすればいいでしょうか?

その時の、要素を参照した値を調べましょう。
自力でデバッグする方法も考えないと、あとあと大変ですよ。



123

リンク

2013/9/9(Mon) 15:53:29|NO.57033

そこにあるcntが配列の要素数を超えてるんだろうからえらーがでる。



さか

リンク

2013/9/11(Wed) 23:13:37|NO.57094

ちょっと動かしてみてみましたがエラー出ませんでしたよ。
123さんの言ってる通りですが、単純なループ内以外でcntを使わないほうがいいです。
ちゃんとtekiCntなどそれぞれの変数に代入して使ってみたらどうでしょう。



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