7年前ニコニコ動画などで人工生命の動画を見て面白いと思い、DXライブラリを使って作ってみようと思ったのですが、ランダムウォークがうまくいきません。・他のキャラクターと当たったら別方向に移動(どう種族を含む)これを実装したいと思います。将来的には360度全方位に移動したいと思っているのですが、最初は4方向に絞りたいと思います。今は、壁に当たったら別方向に移動までできたのですが、キャラクターとの当たり判定ができません。7年前まず、いろんなところにある10や30といった数値や、壁のある座標を定数か何かの形で定義した方がいいと思います。GetColor(255,255,255),TRUE);キャラの当たり判定を同種族とも行うのであれば別々に考える必要はなさそうですね。基本、円形で計算すればよいかと思います。移動する角度を変えるだけでいいと思います。360°移動する場合も載せときます。計算にはsinとcosを使います。向かっている方向をangleという変数に保存し進むスピードをspdという変数に保存したとします。spd*sin(angle);で求められます。角度は度でなくラジアンなので注意です。あたった後の方向転換についてです。肉食と草食があるようですが、ここは同種族として考えています。縄張り争いや相手が天敵とか考えません。)決まった角度に毎回避けるとランダムウォークとはいえませんし会ったからといってわざわざ引き返すのも変だと思います。+35)そうすれば引き返すだけでなくすれ違うように移動することも可能となると思います。返信ありがとうございます。10とかは画像サイズで定義しようと思います。当たり判定を組むにあたって、僕の作っていたプログラムだと、1匹当たりに何回もループしなくてはいけなくてとても重いプログラムになっています。どのように判定したらいいのでしょうか?僕は毎回forでcarniとherbi[j]の当たり判定を全部繰り返していました。//草の数ぐらいで重い判定になると思えません。どの様な当たり判定をしているのでしょうか?掲載されたプログラムには見当たらないようですが。方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。描画のところにDrawBoxということは、動物の表示は(今のところ)四角ですよね?かつ移動がとりあえず4方向ということであれば当たり判定は単純に自分以外の動物の座標を見て幅、高さより近いかだけ判断すれば良いと思います。動物同士の距離を見て逃げる、追うがあるなら天紆さんの通り円でやっても、単純に上下何pix、左右何pix内に入ったら、とやってもできそうです。初期化や移動、大きさなどは共通している部分が多いのでmainでstructにせずクラス化してしまった方が良いと思います。動物の大きさはsizeとしてメンバに加えてはどうでしょう。当たり判定の回数を気にされてるようですが、当たり判定は基本的にすべてのオブジェクト同士でやると思っておいた方が良いです。形状が複雑で判定の処理が重い場合はまず距離だけで判断して判定処理までやるか否かという分岐にはできます。処理速度については他の方も仰っているように気にしない方が良いです。結局計算よりも描画のほうが重いのですから。実感がわかないのならば計測をしてみるとよいでしょう。分けて定義するのではなく、Charaに種類を表す変数を持たせてその変数にしたがって処理を分岐させたほうがすっきりすると思います。皆さん回答ありがとうございます。当たり判定について詳しくないのでどうしたらいいか分からず短形の当たり判定の式を検索して作ったやつですがコードを載せておきます。TRUE);}}これは今は同族を抜いて、肉食と草食の当たり判定だけを作ったつもりです。これから少し用事があるので夜にもう一度ソースを書き直したいと思います。自分の経験から言って、描画と計算は完全に分けたほうがいいです。キャラの座標取得関数と描画関数を別に作ったほうがいいと思います。見ていないので自分の勘違いかもしれませんが、もう一つ気になった箇所があります。毎フレーム進む方向を変更していることですね。これでは物凄い挙動不審にブルブル震えながら移動することになるかとおもいます。7年前このコードで何か問題はあるのでしょうか?CmoveとHmoveを構造体の外に出した理由は何ですか?それならばいっそキャラクタ構造体を草食肉食植物と分割したほうがいいのでは?もしくはmove変数をChara構造体に持たせて草を処理するときのみその変数を無視したほうが効率はいいと思います。狐さんのおっしゃるとおり関数分けを行ったほうが良いかと。Drawに移動という意味はありませんからね。あと気になった点はというと全体的にコメントの量がかなり少ないことですね。PI;}}}}360度回るようになりました。ランダムで360度回したかったのですが、少数の乱数が分からず今はてきとうになっています。このプログラムを実行すると当たり判定がうまくいかずよくわからないところで小刻みに震え始めます。7年前なにか生物っぽくない動きなので、相手や壁との方向転換の方法を変えたほうが良いと思います。壁に関してはとりあえず完全ランダムに方向が変換するのは右か左のターンが等条件の時だけにして、それ以外は当たった面と自分のなす角が広からいい方向を選んだほうが良いと思います。生物同士が当たったら、単に跳ね返るんじゃなくて避ける動作になるように考えてみて下さい。それと進行し続けるのはなくて止まったり、方向転換したりをランダムに取り入れてみてください。ランダムな方向転換は進行方向に+-45度程度にしておいたらそれっぽくなるのでは?こういうシミュレーションは実際の動物の動きとかのビデオをよく観察して、それっぽいルールを導き出すことです。方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。7年前DxLibであれば大抵60FPSに無理やり保たれるようになっていた記憶が・・・つまり、毎フレーム向かう方向を変更するということは1秒のうちに60回方向転換していることになります。一定カウンタ以上歩く、もしくは何かと接触するまでは向かう方向を変えない、といったことをすることで簡単に防ぐことができると思います。ラジアンについてある程度理解されているでしょうか?(自分は実際数学で勉強したわけでないのであやふやですが)まず「度*PI/180」で度の値の角度になります。ラジアンは少数の値ですので角度と違ってわかりずらいので決まった角度を与えたい場合はこちらで計算したほうが分かりやすいかもしれませんね。