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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0502
初心者シューティング5解決


初心者

リンク

2010/5/2(Sun) 15:26:47|NO.32426

縦シューティングゲームを作ろうとしているのですが、
自機が弾を発射しながらウインドウの端にあたると
「異なる型を持つ配列変数に代入しました」
ウインドウの端で弾を発射すると
「配列の要素が無効です」
となってしまうのですがなぜなんでしょうか

弾の発射は
if(key & 16){
 if(frame\10==1){
  gosub *search
   if(number!=-1){
    a(number)=1
    x(number)=x
    y(number)=y
    vx(number)=0.0
    vy(number)=-5.0
   }
 }
}
〜〜〜〜〜〜〜
*search
 number=-1
 repeat maxbullet
  if( a(cnt)!=1 ) : number=cnt : break
 loop
 return
のようにしていますが他に方法があったら教えてください



この記事に返信する


あり

リンク

2010/5/2(Sun) 16:20:39|NO.32427

>自機が弾を発射しながらウインドウの端にあたると
>「異なる型を持つ配列変数に代入しました」
弾が端に到達した時に配列に代入される数値の型が最初に入力した型と
異なっている為に起こると思われます。

;【例】 dim a, 10 a(0) = 10 a(1) = 10.0 ; エラーになる
最初に整数を代入した配列には整数、実数を代入した配列には実数しか代入できません
エラーの起こった行を元に異なった型の数値を代入していないか確認してみてください。

>ウインドウの端で弾を発射すると
>「配列の要素が無効です」
主に作成した配列変数の要素数が存在していない時に発生するエラーです。

;【例】 dim a, 10 ; a(x)はa(0)〜a(9)まで mes a(10) ; 存在しないのでエラーになる
どこかで要素数より大きい値の配列要素を取得しようとしているので
配列要素を多く作成するか取得する配列要素が要素の最大数を
上回らないように調整してください。



テック

リンク

2010/5/2(Sun) 17:28:15|NO.32429

>弾が端に到達した時に配列に代入される数値の型が最初に入力した型と
>異なっている為に起こると思われます。
これは、盲点でしたね〜。
私は、最初vx・vyがddimではなくdimで宣言されているのに、
実数を代入しているからなのだと思いましたが、
最初に代入した型によって決まるとは・・・。

初心者さん、ありさんの言うとおり、
実数型の配列は、最初に実数形式で代入すること。
またその逆のパターンもあり、
最初に実数形式で代入し、次に整数形式で代入すると
エラーになるということを理解しておいたほうがいいかもしれません。

以下確認スクリプト

// 定数を宣言する #const maxbullet 10 #const KEY_ARROW_LEFT 1 // カーソルキーの左(←) #const KEY_ARROW_RIGHT 4 // カーソルキーの右(→) #const KEY_ARROW_UP 2 // カーソルキーの上(↑) #const KEY_ARROW_DOWN 8 // カーソルキーの下(↓) #const KEY_SPACE 16 // スペースキー #const KEY_ENTER 32 // Enterキー #const KEY_ESC 128 // Escキー // 配列を宣言する dim a, maxbullet dim x, maxbullet dim y, maxbullet dim vx, maxbullet dim vy, maxbullet // ddim vx, maxbullet // ddim vy, maxbullet // グローバル変数 key = 0 number = 0 // エントリーポインタ // 引数 //  なし // 戻り値 //  なし *HspMain vy(0) = 5.0 // エラーにならない vy(1) = 5 // エラーになる // ゲームループ while(1) wait 30 cls 0 // キー入力情報を取得する stick key, 0 // スペースキーが押下された場合 if(key & KEY_SPACE) { // 弾を発射する処理を行う gosub *search if(number != -1) { a(number) = 1 x(number) = x y(number) = y vx(number) = 0.0 vy(number) = 5.0 } } // Escキーが押下された場合 if(key & KEY_ESC) { // ゲームループを抜ける _break } wend // HSPを終了する end stop // 弾を発射する処理を行う // 引数 //  なし // 戻り値 //  なし *search number = -1 repeat maxbullet if(a(cnt) != 1) { number = cnt break } loop return



N

リンク

2010/5/3(Mon) 00:11:39|NO.32435

HSPが基本的に変数の宣言を省略していることで、逆に混乱を招いているような気がするな。
すべての変数の型宣言を強制にした方が結局わかりやすくなるとおもうんだが。
変数のタイプミスもエラーになるし。



ANTARES

リンク

2010/5/3(Mon) 01:22:03|NO.32436

>私は、最初vx・vyがddimではなくdimで宣言されているのに、
>実数を代入しているからなのだと思いましたが、
 ddimで宣言しても整数を代入した途端に整数型に
なってしまうのでは、ddimの存在意義がありませんね。



初心者

リンク

2010/5/5(Wed) 12:07:23|NO.32456

みなさん本当にありがとうございます。解決しました
ありさんすげー。超すげー
テックさん、確認スクリプトありがとうございます



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