プロフィール

Na-7

Author:Na-7
SE(システムエンジニア)として約15年間システム系ソフト会社を勤めあげ、2008年3月退社。現在、ゲーム制作会社設立を目指して活動中。


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
回避移動05
開発中のメイン画面
後続部隊の横展開や包囲がスムーズになった。
しかし全ての課題が解消されたわけではないらしい。



◎課題

前回は回避移動を実装しましたが、幾つか気になる点があります。

・敵前で部隊は横展開するが、包囲に至らないことが多い

・侵入不可地形に侵入してしまう

・拠点付近に部隊が多数集結すると挙動不審な動きをする

・橋の位置で進行方向が逆の味方部隊と向き合うと、
 両部隊共に立ち往生してしまう



◎包囲に至らない

包囲に至らないことが多い

後続部隊は後ろの方で行ったり来たり右往左往しつつ、徐々に左右に展開します。展開速度が遅いため、包囲に至る前に敵部隊が壊滅するケースがかなり多いです。

後続部隊が行列の後方で右往左往する様子は、実際の戦場では結構ありえる(むしろ古戦場で部隊がきちんと連携する方が稀)と思うので、これはこれでアリかもしれません。

しかし、開発者が部隊移動を管理しきれていないのは問題です。特に、斜め後方に回避移動するケースがあるのは、不自然で理解できません。やはり部隊移動はきちんとコントロールする必要がありますね。



◎侵入不可地形への侵入

一方、侵入不可地形に侵入する原因を調査すると、部隊が斜めを向いた場合の回避移動に問題がありました。

部隊が上を向いた場合の回避移動経路   部隊が右上を向いた場合の回避移動経路

斜めを向いた場合の回避移動経路が、予定外のセルを指しています。そのため、中間に侵入不可地形があっても、チェックでNGにならず侵入してしまいました。

これを正すには、斜め方向の回避経路を修正する必要がありますね。



◎斜め方向の回避経路

従来は、回避経路算出後に一旦セル座標系に変換し、これをフリー座標系に戻しています。ところが、回避先に想定外の座標が算出されることがあります。

部隊方向がフリーだったので、回避移動処理では45度単位で計算するよう改修したのですが、それでも解消されません。結局原因は「回避経路をフリー座標系で算出したため」でした。

斜め方向の回避経路がおかしくなる原因

上図Aにおいて、右方向へ1.0の距離を加算すれば、右セルへの移動経路を示すことになります。これは、部隊Aがセルの左下隅や右下隅に居たとしても同様です。部隊の向きが90度単位で回転した場合も問題ありません。

しかし、部隊が斜め方向を向くと事情が変わります。右方向へ1.0の距離を加算しても、セルの左下隅に居る部隊Bと、セルの右下隅に居る部隊Cとでは、移動先のセルが異なります。これは、部隊BとCのX座標が

COS(45度)=約0.7

となるからです。実は中学生レベルの話だったわけですが、気が付くまで延々と悩んでました(>_<)


フリー座標系で算出する場合は、斜めを向いた場合に距離を調整する必要がありますが、‘右右上’などの座標を考慮すると煩わしいので、先にセル座標系に変換してから算出することとします。



◎初歩的なボケ

実装してテストすると、予定外の座標が算出されることがあります。Excel上ではバッチリなのに、XNAでは何故異なる座標が算出されるのか?

まず最初に失敗したのは、

int a = addPoint.X ^ 2;

のように記述したら、^はべき乗ではなくてxorとのこと。エラーにならないので、気付きにくくハマリやすいです(--;


また、int型にcastする際の誤差が問題になりました。
0.9999…が0になって想定外の値に。
融通がききませんね…ブツブツ。

その後、0.001加算してキャストしたら、-0.9999…のケースで失敗。マイナスのケースを考慮し、丸める関数を作った後で気が付きました。

「Math.Roundという便利な関数があるじゃないか!」

…大ボケかましちゃいました(爆)



◎修正

そんなこんなで、回避経路は予定通りの座標が算出されるようになりました。にもかかわらず、後続部隊が右往左往するケースは緩和されません。むしろ悪化したかも(ーー;

左上ではなく左下に回避移動するケースが増えたようなので、Y座標を反転したり、Math.Atan2()の引数を入れ替えたりしたのですが、なかなか上手くいきません。全コードを見直してようやく気付いたのは、X座標をsin、Y座標をcosで求めてた、ということ。…ぐはっ!><

しかしそこを直してもまだ改善に至りません。何か根本的な問題があるのかと考え直して、ようやく肝心なことに気付きました。

回避経路はXY平面で算出するので、当然のようにY座標は上方向がプラスとイメージしていたのですが、XNAは上(奥)から下(手前)にZ座標が増加します。この点に思い至らず、Y座標(Z座標)の算出に失敗してました。

・移動候補配列のY座標指定を反転する
・Math.Atan2で取得した角度を反転する
・「目標方向-部隊方向」の減算式を加算式とする
・sinで取得した値を反転する

上記のように修正したら、ようやく改善が実感できるレベルになりました。

回避移動05

静止画なのでわからないと思いますが、後方の右往左往率が低下し、横展開や包囲の部隊展開速度が向上しました。また、『移動不可地形に侵入してしまう』現象はほぼ無くなりました。

とは言え、完全に理想通りになったというわけではなく、『理想に一歩近づいた』という感じです。



◎次回予告

回避移動のコードは自作ながら不信感が強かったのですが、デバッグとテストを繰り返すことで、ようやくモノになった気がします。

しかしまだ気になる点が残っているので、次回も引き続き部隊移動を調整します。

スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック


この記事にトラックバックする(FC2ブログユーザー)



copyright © ゲーム制作の舞台裏 all rights reserved.Powered by FC2ブログ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。