パーツを持つ敵を狙う。
投稿者 : tava(19.201.145.122.ap.yournet.ne.jp)
- 2010/06/13(Sun) 23:30
No.12731
|
|
|
|
|
お久しぶりです。 気が向いてはSTGを作っては挫折し作っては挫折しを繰り返して全く進歩してません・・・。 妥協して少しは理想と違っていても作り続けてたりしていましたが、途中でどうしてもダレてしまっていますorz
本題ですが ttp://hoge1e3.sakura.ne.jp/tonyu/joyful/joyful.cgi?mode=res&no=12023 で質問した内容と殆ど同じことです。 質問した時はこれを理解せず使ったため分からなくなり、すぐに妥協に走ってしまいました。 なので今もう一度読み返して組み直してみました。 前よりは配列を理解したつもりではいます・・・。
これだとパーツを持つ敵が複数いる場合、一番最初に調べた敵の中のパーツをランダムで狙うという事になるようですね。 画面内の全ての敵およびそのパーツをランダムで狙うには 敵自体を配列に入れてランダムで指定して、その中のパーツをさらにランダムで狙う、ということでよろしいのでしょうか? 最終的には近い敵及びパーツを狙うようにするつもりです。
|
Re: パーツを持つ敵を狙う。
投稿者 : Triangle Ld.(softbank219014238038.bbtec.net)
- 2010/06/14(Mon) 15:49
No.12732
|
|
|
|
はじめましてtavaさん、Triangle Ld.です。
配列を敵とパーツに分けずに、一つの配列で管理すれば解決できると思います。
Script: target = null; for(e in $AllParts){ randomize(); if(rnd(10) == 0 && target == null){ target = e; } } if(target == null && $AllParts.size() > 0) target = $AllParts.get(0);
ちなみにこの方法を使うとforeachを1つしか使わないので、少しだけ軽くなります。 (foreachというのはfor(変数 in 配列)の構文のことです。)
|
Re: パーツを持つ敵を狙う。
投稿者 : tava(19.201.145.122.ap.yournet.ne.jp)
- 2010/06/15(Tue) 03:51
No.12733
|
|
|
|
はじめまして。 返信ありがとうございます。
これは敵の親クラスを$AllPartsとして敵本体、パーツのオブジェクトを配列に入れて全てをランダムで指定するという事でよろしいんでしょうか?
自分の場合は、出現させるオブジェクトを減らすためパーツの部分はオブジェクトを新しく出さずに draw系で描画させるという方法をとろうとしていました。 配列でパーツの座標や当たり判定を指定してdrawで描画といった感じです。 なのでイメージとしては敵それぞれの持つパーツの配列を狙う側で一度にまとめて調べ、指定するという感じになると思ったのですが、どうでしょうか?
もし、そうするとfor文が普段より多くなり逆に重くなってしまうのであればパーツ部分もオブジェクトを生成してやってみたいと思っています。
|
Re: パーツを持つ敵を狙う。
投稿者 : マッキー(p1028-ipbf1304sapodori.hokkaido.ocn.ne.jp)
- 2010/06/15(Tue) 22:02
No.12734
|
|
|
|
敵をランダムに狙うのと、近いパーツを狙うのとでは、処理を使い分けた方がいいです。
ランダムにするなら、tavaさんの言った通り、 敵オブジェクトの配列を作り、その中からランダムで選び、 敵パーツの配列の中から、またランダムで選ぶという方法でいいと思います。
・jikiクラス randomize(); teki_Array=new Array();//配列には既に敵オブジェクトが格納されているとする //敵のパーツ配列には、1つのパーツ情報で、x,y座標の2つがあるとする
while(1){ teki_rnd=rnd(trunc(teki_Array.size())); parts_rnd=rnd(trunc(teki_Array.get(teki_rnd).parts_Array.size()/2));
//ターゲット if(teki_Array.size!=0){ targetX=teki_Array.get(teki_rnd).parts_Array.get(parts_rnd*2); targetY=teki_Array.get(teki_rnd).parts_Array.get(parts_rnd*2+1); }
//他略 update(); }
近いパーツを狙うなら、 敵オブジェクトのパーツの近いものを、定期的に調べて(5フレームに1回とか)、 敵オブジェクト側で、あらかじめ距離を計算しておき、 グローバル変数を使って、"一番近い敵の距離"と、"その敵オブジェクト自体"との、2つの変数を使って代入しておきます。
後は自機側で、グローバル変数の指す、敵オブジェクトのパーツをターゲットにする。 これなら、二重for文よりも、処理が少なくて済みます。
・jikiクラス $tikai_kyori=9999; $tikai_teki=null; while(1){ //ターゲット if($tikai_kyori<9999){//ifを追加。敵がいない時は処理しない。実行した直後に、誰もいないと、エラーを発するから。 targetX=$tikai_teki.x+$tikai_teki.tikai_partsX; targetY=$tikai_teki.y+$tikai_teki.tikai_partsY; }
//近い距離をリセット $tikai_kyori=9999; //他略 update(); }
・tekiクラス parts=new Array();//敵のパーツ配列には、1つのパーツ情報で、x,y座標の2つがあるとする。既に格納済みとする while(1){ if($frameCount%5==0){//定期的に、近い「パーツ」を調べる。毎フレームやらないのは、パーツの場所が頻繁に入れ変わらないだろうという、ただの思い込みです。 tikai_parts_kyori=9999; for(i=0;i<parts.size();i+=2){ t_x=parts.get(i); t_y=parts.get(i+1); t_kyori=dist((x+t_x)-$jiki.x, (y+t_y)-$jiki.y); if(t_kyori<tikai_parts_kyori){ tikai_parts_kyori=t_kyori; tikai_partsX=t_x; tikai_partsY=t_y; } } }
//一番近い「敵」を調べる。これは毎フレーム処理。
tikai_parts_kyori=dist((x+tikai_partsX)-$jiki.x, (y+tikai_partsY)-$jiki.y); if(tikai_parts_kyori<$tikai_kyori){ $tikai_kyori=tikai_parts_kyori; $tikai_teki=this; } update(); }
実際に、実行したプログラムではないので、間違ってる可能性あり。(ちょこっと修正)
配列は、とても便利ですが、 Tonyuの配列処理は、以外と重いようです。 配列処理は、普通の変数処理より、2・3倍くらい負担になるらしいです。 ttp://www4.atwiki.jp/gomatarou/pages/31.html
それをforでループするので、重くなるわけです。(配列&ループには注意) なので、配列処理をできるだけ少なくすると、速くなると思います。
長くなってすみません。
|
Re: パーツを持つ敵を狙う。
投稿者 : tava(19.201.145.122.ap.yournet.ne.jp)
- 2010/06/15(Tue) 23:17
No.12735
|
|
|
|
マッキーさん返信ありがとうございます。
近い敵を狙う処理ですが、自分の考えていたものより軽く、しかも簡単にできそうです。 敵側で自機と一番近いパーツを示すやり方は思いつきませんでした。 また、1つの配列にx,yそれぞれの値を入れて参照するのも活用したいと思いました。 これならきちんと順番させ守って入れていけば、画像番号やその他の値も1つにまとめられますね。 ただ、あまりに多いとこんがらがりそうですが・・・。
機体オプションを1つのグローバル変数でケタ毎に設定していたのに、これを思いつかなかったのが悔しいです(笑)
それでは自分なりに組んでみようと思います。 ありがとうございました。
|
|