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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0404
ミント「複数自機狙い」を作る方法8解決


ミント

リンク

2011/4/4(Mon) 14:22:53|NO.38119

どうもお久しぶりです。そうでない方は初めまして。
STG制作で詰まり、どうしてもわからなくなったのでお聞きしたいと思います。



「1匹の敵」が「自機狙い」を出すことは出来たのですが、
「2匹目の敵」が「自機狙い」を出すようにするとエラーが出てしまいます。
異なる形を持つ配列変数に代入しました

というエラーなので詳しく調べたつもりですが、いまいち原因が取り除けなくって困ってます。 (↓のソースの87行目) どっか勘違いを起こしているかも・・・はまっている感じがするのでまずい・・・
	TMX(0) = 0 : TMY(0) = 0	;座標
	TMX(1) = 0 : TMY(1) = 0	;座標
ちなみに「TMX(0)」「TMY(1)」と()を使っているのは後でまとめてソ−スを小さくさせるためです。
単純に「TMX」「TMX2」とかにした場合正常に動き希望通りの動作になります。


作り方自体がちっと怪しいかも。作り方が悪かったら指摘してもらえるとうれしいです。
どのようにすればエラーが無く動き、希望する動きになりますでしょうか?
アドバイス等よろしくお願いいたします。


  やりたいこと【自機狙いを2つだす】
そしてその後の事を考えて「ソースが大きく」ならないようにする。

 --ソース--

screen 0,380,450 buffer 1 // picload "自機.bmp" gsel 0,1 buffer 3 // picload "でかい妖精2.bmp" gsel 0 buffer 4 // picload "青色.bmp" gsel 0 myx = 150 : myy = 200 ;自機座標 mySpd = 4 ;自機スピード ;敵 enex(0) = 0 : eney(0) = 0 ;座標 enex(1) = 0 : eney(1) = 0 ;敵弾 TM(0) = 0 ;フラグ TMX(0) = 0 : TMY(0) = 0 ;座標 ;2 TM(1) = 0 ;フラグ TMX(1) = 0 : TMY(1) = 0 ;座標 ;****************メインループ*********** *メイン redraw 0 : color 20,20,20 : boxf ;*************************************** gosub *自機の移動 gosub *敵 ;自機 pos myx,myy : gmode 4,29,42,255 : gcopy 1,1,0 ;敵 pos enex(0),eney(0) : gmode 4,58,45,255 : gcopy 3,0,0 pos enex(1),eney(1) : gmode 4,58,45,255 : gcopy 3,0,0 redraw 1 : await 1 goto *メイン ;****************敵機処理*************** *敵 enex(0) = 15 : eney(0) = 150 ;敵座標 ;敵弾処理 if TM(0) = 0 { TMS = 4 ;敵弾速さ r = atan(myy - eney(0), myx - enex(0)) ; 自機y - 敵y , TMxv(0) = cos(r)*TMS ;敵弾x方向 TMyv(0) = sin(r)*TMS ;敵弾y方向 TMX(0) = enex(0) : TMY(0) = eney(0) ;敵弾初期座標 ;敵弾x = 敵x TM(0) = 1 ;弾フラグ } if TM(0) = 1 { TMX(0) = TMxv(0) + TMX(0) ;敵弾x TMY(0) = TMyv(0) + TMY(0) ;敵弾y ; 敵弾 = 角度 + 敵弾 ;敵弾 pos TMX(0),TMY(0) : gmode 4,15,15,255 : gcopy 4,0,0 if TMX(0)>380 : TM(0) = 0 if TMX(0)<0 : TM(0) = 0 if TMY(0)>450 : TM(0)= 0 if TMY(0)<0 : TM(0) = 0 } ;****************2弾目****************** ;敵弾処理 enex(1) = 295 : eney(1) = 150 ;敵座標 ;敵弾処理 if TM(1) = 0 { TMS = 4 ;敵弾速さ r = atan(myy - eney(1), myx - enex(1)) ; 自機y - 敵y , TMxv(1) = cos(r)*TMS ;敵弾x方向 TMyv(1) = sin(r)*TMS ;敵弾y方向 //異なる形を持つ配列変数に代入しました // TMX(1) = enex(1) : TMY(1) = eney(1) ;敵弾初期座標 ; 敵弾 = 敵x TM(1) = 1 ;弾フラグ } if TM(1) = 1 { TMX(1) = TMxv(1) + TMX(1) ;敵弾x TMY(1) = TMyv(1) + TMY(1) ;敵弾y ; 敵弾 = 角度 + 敵弾 ;敵弾 pos TMX(1),TMY(1) : gmode 4,15,15,255 : gcopy 4,0,0 if TMX(1)>380 : TM(1) = 0 if TMX(1)<0 : TM(1) = 0 if TMY(1)>450 : TM(1)= 0 if TMY(1)<0 : TM(1) = 0 } return ;**************自機の移動*************** *自機の移動 stick key,15 ;キー取得 if key & 1 : myx = myx - mySpd ;←の移動スピード if key & 2 : myy = myy - mySpd ;↑の移動スピード if key & 4 : myx = myx + mySpd ;→の移動スピード if key & 8 : myy = myy + mySpd ;↓の移動スピード return



この記事に返信する


晩御飯

リンク

2011/4/4(Mon) 14:57:11|NO.38121

「異なる形を持つ配列変数に代入しました」
TMXは実数型でenexは整数型みたいなので

TMX(1) = double(enex(1)) : TMY(1) = double(eney(1)) ;敵弾初期座標
と応急処置すればとりあえず動きます。



ひらまる

リンク

2011/4/4(Mon) 15:01:36|NO.38122

こういった、コピペするだけで動くソースは良心的でいいですね。

61、62行目で

TMX(0) = TMxv(0) + TMX(0) ;敵弾x TMY(0) = TMyv(0) + TMY(0) ;敵弾y
とあり、TMxvは実数なので、ここでTMXとTMYが実数型の配列に変更されています。
実数型に変形された配列変数TMXとTMYに、
整数型配列変数であるenexとeneyを代入しようとしているのがエラーの原因です。

解決方法としては、
myx myy enex eney TMX TMYなどの座標に関する変数を全て実数型にするのが一番安全でしょう。

myx = 150.0 : myy = 200.0 ;自機座標 mySpd = 4.0 ;自機スピード myx(1) = 0.0 ;敵 enex(0) = 0.0 : eney(0) = 0.0 ;座標 enex(1) = 0.0 : eney(1) = 0.0 ;敵弾 TM(0) = 0 ;フラグ TMX(0) = 0.0 : TMY(0) = 0.0 ;座標 ;2 TM(1) = 0 ;フラグ TMX(1) = 0.0 : TMY(1) = 0.0 ;座標

注意する点としては、HSPで型を指定する場合、
dimやddimの段階ではまだ型は決定されていないので、
最初に『0.0』などの実数値を代入することで、はじめて実数型に決定されます。
また、配列の0番目に違う型の値を代入してもエラーが起きません。
エラーの起こるタイミングは以下のようになります。

ddim a a = 1 a = 1.0 a(1) = 1.0 a(0) = 1 a(1) = 1.0//ここでエラー



ミント

リンク

2011/4/4(Mon) 19:14:34|NO.38124

>>晩御飯さん
>>TMXは実数型でenexは整数型みたいなので
ぎゃあぁぁ〜〜〜

嫌な予感はしたんだよ・・・

;****************カウンター************* color 255,0,0 pos 180,50 : mes "(0)弾X " + TMX(0) pos 180,70 : mes "(0)弾Y " + TMY(0) pos 180,90 : mes "(1)弾X " + TMX(1) pos 180,110 : mes "(1)弾Y " + TMY(1) ;***************************************
でチェックした際に何故か小数点が見えることに!?
もっと疑問に思って「double」を使えばよかった・・・
ちくしょう・・・悔しいぜ。

ソースとアドバイスありがとうございます。



ミント

リンク

2011/4/4(Mon) 19:35:16|NO.38126

>>ひらまるさん
>>こういった、コピペするだけで動くソースは良心的でいいですね。
お褒めのお言葉ありがとうございます。
自分用と違い、人に見せるように作りました。


>>とあり、TMxvは実数なので、ここでTMXとTMYが実数型の配列に変更されています。
>>実数型に変形された配列変数TMXとTMYに、
>>整数型配列変数であるenexとeneyを代入しようとしているのがエラーの原因です。
うん。そうだよね。

実数型は実数型
整数型は整数型
のみ代入が出来るんでしたよね。もしそれが出来ない場合などは変換すればいいんですね。
その変換が「晩御飯」さんの
		TMX(0) = double(enex(0)) : TMY(0) = double(eney(0)) ;敵弾初期座標

ですね。 >>解決方法としては、 >>myx myy enex eney TMX TMYなどの座標に関する変数を全て実数型にするのが一番安全でしょう。
        myx = 150.0 : myy = 200.0	;自機座標
	mySpd = 4.0	;自機スピード
 〜〜略〜〜
;敵弾
	TM(0) = 0	;フラグ
	TMX(0) = 0.0 : TMY(0) = 0.0	;座標
おおー、なるほど初期化のときから指定してあげれば安全だね〜。


>>注意する点としては、HSPで型を指定する場合、
>>dimやddimの段階ではまだ型は決定されていないので、
む、そうなのか。これは初めて知りました。

>>最初に『0.0』などの実数値を代入することで、はじめて実数型に決定されます。
>>また、配列の0番目に違う型の値を代入してもエラーが起きません。
>>エラーの起こるタイミングは以下のようになります。


ddim a
a = 1 a = 1.0 a(1) = 1.0 a(0) = 1 a(1) = 1.0//ここでエラー
こ・・・これはすごい・・・
しかも配列の0番目に違う型の値を代入してもエラーが起きないとか・・・
まだまだ知らないことが沢山ありそうですね。
いや最近配列使い始めたせいもあるかもしれんが「ひらまる」さんの説明でより一層理解出来たかも。

アドバイスとソースありがとうございます。
@はこれをくっつけて正常作動させるだけ・・・とりあえずお返事だけ。



ミント

リンク

2011/4/4(Mon) 21:00:18|NO.38127

とりあえずまとめることにも成功。
これなら3個だろうが10個だろうが沢山作れそうです。
本当にありがとうございました。ていうことでかいけつゾロリ。

体験版出来ましたらこちらにもあげる予定なのでお楽しみに (当分先だけどね!)



晩御飯

リンク

2011/4/4(Mon) 21:01:08|NO.38128

あくまでも応急処置なので実際にはひらまるさんの言う通り全部実数型に揃えたほうが良いです。
それよりも弾2の挙動がおかしい気がするんですけど原因がつかめない。



晩御飯

リンク

2011/4/4(Mon) 21:01:52|NO.38129

そんなこと無かったみたいなのでスルーして下さい。



ミント

リンク

2011/4/5(Tue) 00:20:42|NO.38131

>>晩御飯さん
>>あくまでも応急処置なので実際にはひらまるさんの言う通り全部実数型に揃えたほうが良いです。
そうですねぇ。
その方が安全だし管理もしやすいかな。
最後までありがとうございます!

この勢いを維持すれば1面出来そうな希ガス。あぁ、遠いけどがんばる。



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