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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0621
pimoなぜ"配列の要素が無効です"と出るのか分かりません4解決


pimo

リンク

2019/6/21(Fri) 20:34:32|NO.87682

ある動画を参考にして というか、ほぼパクって作ったのですが、
弾幕を数値を指定して好きに打てるようにした途端に
"配列の要素が無効です"とでるようになりました。
全くいじっていない"52"や"61"行目にエラーが出るので僕にはもう対処法が思いつきません。

screen 0,800,600,0,ginfo_dispx/2-400,ginfo_dispy/2-300 buffer 2 picload "main.bmp" gsel 0 stfr=0 : atfr=0 score=0 : life=3 plx=400.0 : ply=450.0 etfr=0 et_xpos=0 : et_ypos=0 : et_speed=0 : et_freq=0 : et_spl=0 : etp=0 : meta=1000 op_xpos=400 : op_ypos=300 : op_speed=0.5 : op_freq=20 : op_spl=6 : optp=0 dim eth,meta : dimtype etx,vartype("double"),meta : dimtype ety,vartype("double"),meta : dimtype etux,vartype("double"),meta : dimtype etuy,vartype("double"),meta color 0,0,0 : boxf : title "弾幕ゲー" color 255,255,255 nnn=0 pos 0,16*nnn:mes "x座標" :input op_xpos,16*3,16,6 :nnn+=2 pos 0,16*nnn:mes "y座標" :input op_ypos,16*3,16,6 :nnn+=2 pos 0,16*nnn:mes "頻度" :input op_freq,16*3,16,6 :nnn+=2 pos 0,16*nnn:mes "速さ" :input op_speed,16*2,16,4 :nnn+=2 pos 0,16*nnn:mes "分割" :input op_spl,16*3,16,3 :nnn+=2 pos 0,16*nnn:mes "その他":input optp,16*25,16,50 :nnn+=2 pos 0,16*nnn:button goto "始める",*warosu stop *warosu color 50,50,50 boxf stick key,15 if key&1 : if plx>=0+16 :plx=plx-0.5 if key&2 : if ply>=0+16 :ply=ply-0.5 if key&4 : if plx<=800-16 :plx=plx+0.5 if key&8 : if ply<=600-16 :ply=ply+0.5 pos plx-16,ply-16:color 255,0,255:gmode 4,32,32,255:gcopy 2,0,0 et_xpos=op_xpos : et_ypos=op_ypos : et_freq=op_freq : et_speed=op_speed : et_spl=op_spl : etp=optp if etfr\et_freq=0 { repeat et_spl edm=m_pi*2*cnt/et_spl+etp etid = -1 repeat meta if eth(cnt) != 1 : etid = cnt : break loop if etid != -1 { eth(etid)=1 etx(etid)=et_xpos ety(etid)=et_ypos etux(etid)=cos(edm) * et_speed etuy(etid)=sin(edm) * et_speed } loop } repeat meta if eth(cnt)=1 { if (et_pt=0) : eth(cnt)=0 pos etx(cnt)-8,ety(cnt)-8 gmode 4,16,16,255 gcopy 2,32,32 etx(cnt)=etx(cnt)+etux(cnt) : ety(cnt)=ety(cnt)+etuy(cnt) } if (etx(cnt)<-8)|(ety(cnt)<-8)|(etx(cnt)>808)|(ety(cnt)>608) : eth(cnt)=0 : score+=1 patx=plx-etx(cnt) : paty=ply-ety(cnt) patx*=patx:paty*=paty if eth(cnt)=1&et_pt!=0 { if patx+paty<=64.0{ if score<=100 : score=0 : else : score -=100 eth(cnt)=0 }else{ if (patx+paty<=512.0)&(etfr\120=0) : score+=20 } } ettime(cnt)+=1 loop redraw 1:await 1:redraw 0 etfr+=1 : if atfr=0 : else : atfr-=1 goto *warosu end

変える前はこんなのです。


screen 0,800,600,0,ginfo_dispx/2-400,ginfo_dispy/2-300 buffer 2 picload "main.bmp" gsel 0 stfr=0 : atfr=0 score=0 : life=3 plx=400.0 : ply=450.0 etfr=0 et_xpos=400.0 : et_ypos=300.0 : et_speed=0.8 : et_freq=40 : et_spl=6 : et_pt=0 : meta=1000 dim eth,meta : dimtype etx,vartype("double"),meta : dimtype ety,vartype("double"),meta : dimtype etux,vartype("double"),meta : dimtype etuy,vartype("double"),meta color 0,0,0 : boxf : title "弾幕ゲー" *start color 0,0,0 : boxf color 255,255,100 : pos 350,300 :font msgothic,16,0:mes "上でスタート。\n右でせつめい。\n下でせんたく。" : if mode=0 : mes "\n時間制限制" : else : mes "\n生命制限制" redraw 1:await 1:redraw 0 stick key,15:if key = 2 : goto *warosu : else : if key = 4 : goto *setumei if stfr=0&key=8 : stfr=100 : if mode=0 : mode=1 : else : mode=0 if stfr=0 : else : stfr-=1 goto *start *setumei color 0,0,0 : boxf color 150,255,0 : pos 0,0 :font msgothic,16,0:mes "左で戻る。":color 255,255,200:font msgothic,28,1:mes "〜初見の方はキャラクターを想像しつつ、お読みください〜\n" color 255,100,100:font msgothic,32,0 mes "・時間制限制:\n 60秒間、20秒ごとに変わる弾幕を避けてもらいます。\n\n 生命制限性:\n 3ライフでなるべく長く避けてもらいます。\n\n・プレイヤーの真ん中の青いコアに弾が\n 当たらないようにしてください。\n\n・周りの四角に弾が当たれば、scoreに加点されます。" redraw 1:await 1:redraw 0 stick key,15 if key = 1 : goto *start goto *setumei *warosu color 50,50,50 boxf stick key,15 if key&1 : if plx>=0+16 :plx=plx-0.5 if key&2 : if ply>=0+16 :ply=ply-0.5 if key&4 : if plx<=800-16 :plx=plx+0.5 if key&8 : if ply<=600-16 :ply=ply+0.5 pos plx-16,ply-16:color 255,0,255:gmode 4,32,32,255:gcopy 2,0,0 if et_pt=3 : et_xpos=400.0 : et_ypos=0.0 : et_freq=100: et_speed=0.5 : et_spl=70 : etp=0.001*rnd(3142) if et_pt=2 : et_xpos=400.0 : et_ypos=300.0 : et_freq=40 : et_speed=0.8 : et_spl=6 : etp=atan(ply-et_ypos,plx-et_xpos) if et_pt=1 : et_xpos=400.0 : et_ypos=300.0 : et_freq=20 : et_speed=0.3 : et_spl=3 : etp=etfr*etfr if etfr\et_freq=0 { repeat et_spl edm=m_pi*2*cnt/et_spl+etp etid = -1 repeat meta if eth(cnt) != 1 : etid = cnt : break loop if etid != -1 { eth(etid)=1 etx(etid)=et_xpos ety(etid)=et_ypos etux(etid)=cos(edm) * et_speed etuy(etid)=sin(edm) * et_speed } loop } repeat meta if eth(cnt)=1 { if (et_pt=0) : eth(cnt)=0 pos etx(cnt)-8,ety(cnt)-8 gmode 4,16,16,255 gcopy 2,32,32 etx(cnt)=etx(cnt)+etux(cnt) : ety(cnt)=ety(cnt)+etuy(cnt) } if (etx(cnt)<-8) | (ety(cnt)<-8) | (etx(cnt)>808) | (ety(cnt)>608) : eth(cnt)=0 : if mode=0 : score+=1 patx=plx-etx(cnt) : paty=ply-ety(cnt) patx*=patx:paty*=paty if eth(cnt)=1&et_pt!=0 { if patx+paty<=64.0{ if mode = 0 { if score<=100 : score=0 : else : score -=100 eth(cnt)=0 }else{ if atfr=0 : life -= 1 : atfr = 100 eth(cnt)=0 } }else{ if (patx+paty<=512.0)&(etfr\120=0) : if mode=0 : score+=20 : else : score += 1 } } ettime(cnt)+=1 loop if etfr\350 = 0 : time+=1 : if mode=0 { if time>=40 : et_pt=3 : else : if time>=20 : et_pt=2 : else : et_pt=1 }else{ if time\20=1.0 : randomize : et_pt=rnd(3)+1 } if (time\20>=0.0)&(time\20<=0.5) : et_pt=0 color 255,100,100:pos 0,0:font "MS ゴシック",32 : if mode=0 : mes time+"経過" : mes "score:"+score : else : mes "残り:"+life : mes "経過時間:"+time : mes "+time:"+score redraw 1:await 1:redraw 0 etfr+=1 : if atfr=0 : else : atfr-=1 if (((mode=0)&(time<60)) | ((mode=1)&(life>0))) : goto *warosu redraw 1:wait 200 color 0,0,0:boxf:color 255,255,50:font "MS ゴシック",150 : if mode=0 : mes "スコアは...\n "+score : else : mes "タイムは...\n "+(time+score) wait 1000 end



この記事に返信する


あり

リンク

2019/6/21(Fri) 22:13:56|NO.87686

配列etxとetyを実数型で作成したのに数値の代入が整数で行われているので
配列が整数型に再定義された際に配列が規定数確保されないためにエラーになるようです。

とりあえず11行目の
op_xpos=400 : op_ypos=300

op_xpos=400.0 : op_ypos=300.0
に戻せばエラーは起こりませんが
プログラムをしていく上で変数のエラーは避けては通れないので、今後のためにも
変数の確認やデバッグのやり方を身に着けていきましょう。



pimo

リンク

2019/6/22(Sat) 07:09:19|NO.87688

ありさん
ありがとうございます!
これからはちゃんと変数の型に気を付けるよう
意識したいと思います



Ponyo

リンク

2019/6/22(Sat) 08:04:08|NO.87689

配列変数の場合は最初に定義した変数の型を基準にして下さい。
整数型に変数を宣言したら、加算したり減算したりなどは整数で扱い
実数(簡単に言えば少数)型に変数を宣言したら、加算したり減算したりなどは実数で扱って下さい。

余談になりますが、上記の内容は(多分)通常の変数の時はエラーは起きませんが、
仮に最初に整数型の変数を宣言し実数の計算(0.5や0.01など)を行う時に
実数は四捨五入されて強制的に整数型での計算になります。

詳しい説明は勝手ながら割愛させて頂きますが、int や double などの関数も理解した方がいいとお勧めします。
下手な説明で分かりにくいと思いますが、少しでも理解いただけたら幸いです😄



pimo

リンク

2019/6/22(Sat) 14:19:53|NO.87694

ponyoさん
整数で宣言して実数を使ったら四捨五入されるんですね
知りませんでした!
ありがとうございます!
関数も勉強しておきます!



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