for〜文を使わずに
投稿者 : 秋水(i58-93-177-179.s05.a001.ap.plala.or.jp)
- 2006/08/31(Thu) 21:11
No.10293
|
|
|
|
|
…取り敢えず「kkk」では問題が起こりかねないので以後名前を「秋水」と改めさせて頂きます。
それでご質問なのですが、基本的に敵の方を向くと言う命令や接触判定にはforを使う事になるのですが、これを各オブジェクトごとにやらせるのでは無く一つのオブジェクドにforを使わせ、別のオブジェクトがそれを参照して角度計算や接触判定を行う事は可能でしょうか?(ただしこれで各オブジェクトにfor計算をさせるよりも重くなるのでしたらそう言って頂けると有り難いです
|
Re: for〜文を使わずに
投稿者 : 大月(240.229.192.61.east.flets.alpha-net.ne.jp)
- 2006/09/02(Sat) 03:36
No.10297
|
|
|
|
画面内の全てのオブジェクトの座標を一旦専用のオブジェクトに集積しておいて、それを接触判定などに使うということですよね。 なかなか面白そうなアイデアだと思います。
for(a in $chars)を一斉に行うと、オブジェクト数に対して指数敵に(?)工程数が増えるため重くなってしまいますんで、うまく最適化できればかなり軽くすることが出来ると思います。 上手いやり方が見つかったら教えて下さい(笑
#先日話題に上った「マップ座標系でのオブジェクトの位置をあらかじめ求めておく」話とかも参考にできそうですね
|
Re: for〜文を使わずに
投稿者 : 秋水(i58-93-177-179.s05.a001.ap.plala.or.jp)
- 2006/09/02(Sat) 12:54
No.10298
|
|
|
|
一応思いついたものに、各種情報を配列に格納しておいて各オブジェクトがそれを取り出す…と言うのも考えて見たのですが、可能でしょうか?
|
Re: for〜文を使わずに
投稿者 : アカシン(210.230.239.64)
- 2006/09/02(Sat) 15:23
No.10299
|
|
|
|
面白いアイデアだと思います。 一つ実現案を思いついたので、書かせてもらいます。 方針は、「ある程度近いキャラとのみ接触判定を行う」というものです。
以下、処理の流れ。 1.画面座標と対応付けた2次元配列を用意する (例えば、座標0〜9は配列の0番,座標10〜19は配列の1番に対応するものとする) 2.各オブジェクトを配列の対応する位置に入れる 3.各オブジェクトは自分が格納されている位置のオブジェクトとのみ接触判定を行う 1,2だけ専用のオブジェクトで行い、3は通常の処理と同様に各オブジェクトで行います。 大体こんな感じです。
ただ、実現するには、上記のアルゴリズムのプログラム化と 正しく動作させるための調整が必要で、かなり難易度が高いです。
これをサポートするライブラリの需要、あるでしょうか。 作れそうな気がするのですが。
あと、この話題とは直接の関係はありませんが一つ。 角度計算や接触判定は、よほど精密な処理を行うゲームでなければ 毎フレーム行う必要はなく、数フレームに1回で十分です。 これをするだけで処理の重さが劇的に改善される場合があります。 お試しを。
|
Re: for〜文を使わずに
投稿者 : 秋水(i58-93-177-179.s05.a001.ap.plala.or.jp)
- 2006/09/02(Sat) 22:02
No.10300
|
|
|
|
>アカシンさん ふむふむ…私は余りプログラムが得意では無いので実現出来るかどうかは解りませんが…存外と面白いアイデアだったのですね。 じっくり腰を据えて進めて行きたい所です。
>毎フレーム行う必要はなく、数フレームに1回で十分です。 そ、そうだったのですか…確かに、考えてみればそうでしたね、早速導入させて頂きます、有難う御座いました。
|
Re: for〜文を使わずに
投稿者 : 大月(231.178.192.61.east.flets.alpha-net.ne.jp)
- 2006/09/04(Mon) 13:29
No.10303
|
|
|
|
>アカシンさん tonyuでライブラリをどう扱うのか分かりませんが、手軽に導入できるなら需要はあるんじゃないでしょうか。 せっかくのオブジェクトプログラミングをスピードアップの為に手続き型っぽく書かなきゃなんないとか、勿体ないですしね(笑
そして毎フレーム判定を行わない方法、目から鱗です(^^; 既にプログラムは大半書き上がってるうちのゲームにも、今から導入できるかどうか検討してみます。 2フレームに1回でも半減するわけですから、効果覿面なんじゃないかと予想!
|
Re: for〜文を使わずに
投稿者 : 大月(121.145.192.61.east.flets.alpha-net.ne.jp)
- 2006/09/11(Mon) 23:35
No.10343
|
|
|
|
接触判定を2フレームに1回にしてみました。 予想通りかなり軽くなりまして、諦めていた「全方向弾を吐く敵」を作れるようになりました。
今回私が採った方法はざっと以下のような感じになります。
time = 0; //自分の生存時間(フレーム数 while(1){ if( time%2 ){ //生存時間が2で割り切れないときだけ for( a in $chars ){ //この中に接触判定 } } time++; //生存時間をインクリメント update(); //描画して次のフレームへ }
これが使えないのは、2フレームの間にオブジェクト同士がすれ違って違うほど速いスピードで移動してるとき、 あるいは1フレーム毎にテレポートしてる場合などでしょうね。 アカシンさんの仰るとおり通常のゲームならこれで充分取りこぼしなく接触判定ができるでしょうから これはかなり有用な手段として使っていけるかと思いますよ! (気付いてなかったの私だけですか?(笑 )
ともかくありがとうございました。感謝感謝です。
|
Re: for〜文を使わずに
投稿者 : ラディ(ZH182013.ppp.dion.ne.jp)
- 2006/09/12(Tue) 00:28
No.10344
|
|
|
|
ちなみに全く関係ない上にかなりどうでもいい事ですが、ただ単に毎フレーム増えていくだけのタイマーならグローバル変数の$frameCountで代用できたりします。
|
Re: for〜文を使わずに
投稿者 : アカシン(210.230.239.64)
- 2006/09/12(Tue) 16:35
No.10346
|
|
|
|
>大月さん 例の方法がお役に立てた様で何よりです。 実際、自分が作ったライブラリよりその方法の方が、 手軽で、汎用性も高く、軽量化も優れています。
自分の作ったライブラリの存在意義が危ぶまれます。
|
|