プロフィール

Na-7

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


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
| BLOG TOP |
DATE: CATEGORY:三国志軍記開発
マップイメージ再取得01
開発中のメイン画面
マップの端の方に行くと、拠点や部隊の位置がズレて街道から外れていたが、ようやく修正されたようだ。



◎左右の調整

前回の続きです。

上下がピタリ一致するよう調整したのに、なぜマップ座標とテクスチャがズレるのか?

原因を調査すると、実は最初から左右もズレていたことがわかったので、左右も調整しました。

private void setProjection(int getPictureNumber)
{
  // 正射影(4×4バージョン)
  this.projection = Matrix.CreateOrthographicOffCenter(
    // -4064~1960, // 左
    ((int)(getPictureNumber % 4) - 2) * 2008 - 48, // 左
    // -2023~4001, // 右
    ((int)(getPictureNumber % 4) - 1) * 2008 - 15, // 右
    // -200~4225, // 下
    ((int)((15 - getPictureNumber) / 4) - 2) * 1475 + 2745, // 下
    // 1275~5700, // 上
    ((int)((15 - getPictureNumber) / 4) - 1) * 1475 + 2750, // 上
    1f, // 近クリップ平面
    10000.0f // 遠クリップ平面
  );
}


調整後は、上記のようになりました。何故こんな中途半端な数値がピタリ一致するのか理解できません(汗)


しかし、これで取得したテクスチャを適用しても、ズレは直りませんでした。グハッ!



◎謎はすべて解けた!

新しいテクスチャと地形種別マップを比較すると、右端と下端が少し欠けてました。

…ああ、そういうことか!

地形種別マップのテクスチャ解像度は256×256ですが、地形種別モデル(XNA生成モデル)作成時に有効な頂点は254×254(セルは253×253)だったのです。
(端の面法線算出を省くため)

そんなわけで、地形種別モデルの大きさは右端と下端が3ピクセル分欠けていたのですが、これを1024×1024×16枚のテクスチャにピタリ一致させて取得すると、メインマップモデル(メタセコモデル:256×256)に張り付けた際に、歪んでしまうわけです。

…数年前から先送りしてきた問題が、ようやく解けました!



◎修正方針検討

テクスチャと座標のズレを修正する方法を検討します。

A案:メインマップの座標系を253×253として修正する

B案:右端と下端が欠けたテクスチャを取得する

最初は、メインマップモデルの隅々まで利用できるA案の方が理想的ではないかと考えました。

でもヘイト(高さ)マップは256×256。A案は高度とテクスチャがズレてしまうので、B案とします。



◎テクスチャ再取得

最終的に、以下のように調整しました。
(相変わらず中途半端な数値が謎w)

private void setProjection(int getPictureNumber)
{
  // 正射影(4×4バージョン)
  this.projection = Matrix.CreateOrthographicOffCenter(
    // -4064~2056, // 左
    ((int)(getPictureNumber % 4) - 2) * 2040 + 16, // 左
    // -2024~4096, // 右
    ((int)(getPictureNumber % 4) - 1) * 2040 + 16, // 右
    // -276~4206, // 下
    ((int)((15 - getPictureNumber) / 4) - 2) * 1494 + 2712, // 下
    // 1218~5700, // 上
    ((int)((15 - getPictureNumber) / 4) - 1) * 1494 + 2712, // 上
    1f, // 近クリップ平面
    10000.0f // 遠クリップ平面
  );
}


MainMap015

上図は、メインマップの一番右下のテクスチャです。

右端と下端の黒い領域は(プレイヤーが意識しないよう)透明に設定してあります。



◎適用

メインマップに適用します。

マップイメージ再取得01   マップイメージ再取得02

拠点や部隊の位置ズレが直りました!

部隊が常に道の真ん中を歩くようになったので、とても気持ちいいです^^



◎次回予告

(高さ/地形種別/配置/移動など)何をやってもズレて見えるので、「本当にコレでいいのか?」と常に不安を抱えていたのですが、ようやく解決しました(笑)

数年がかりの問題がフィックスした所で、次回から戦闘処理を作成します。

スポンサーサイト

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

| BLOG TOP |
DATE: CATEGORY:三国志軍記開発
中継地点自動設定機能02
開発中のミニマップ画面
これまで遠距離の目的地は指定不可とされていたが、経路探索の高速化により、遠距離の目的地も指定可能となった。



◎概要説明

前回に引き続き、各武将が中継地点を自動的に判断する機能を実装します。
始めに、アルゴリズムの概要を説明しておきましょう。


目的地が同一エリアor隣接エリアの場合は、目的地へ直接向かいます。目的地が遠方エリアの場合は、隣接エリアの区都を移動中継地点として設定します。

1 エリア単位で部隊移動経路を探索する

2 経路数が3以上(遠方エリア)か判定する
  →trueの場合、以下の処理を行う
  →falseの場合、中継地点は不要

3 2番目の経路(=隣接エリア)の区都を
  中継地点として設定する


参考:経路数と目的地の関係

 1  :同一エリア
 2  :隣接エリア
 3以上:遠方エリア



◎移動可否判定の改修

最初に流用方式でエリア経路探索プログラムを作成し、次に各エッジのコストデータを適当に設定しました。そして、ミニマップ画面で目的地を指定した際に行う移動可否判定を、以下のように改修しました。

1 エリア経路探索を行い、指定された地点が
  遠方エリアか判定する

2 探索開始座標を以下の条件として、詳細経路探索を行う
  →非遠方エリア:対象部隊の現在座標
  →遠方エリア:指定エリアの区都座標

3 詳細経路探索が成功すれば移動可、
  失敗すれば移動不可

改修して動かすと、移動可否判定は成功したように見えました。しかし1で算出されたエリア経路を確認すると、わざわざ遠回りするケースがありました。これはどういうことでしょうか?



◎遠回りする原因

最初はプログラムを疑ったのですが、なかなか問題点が見付かりません。う~ん…ひょっとして、データが悪いのか?

エリア経路探索もエースター方式ですが、ヒューリスティク関数は、ノードとゴールを結ぶ直線の長さを返しています。これに対し、各エッジのコストデータがヒューリスティク関数を下回ることがあります。これはエースターの前提条件に反するので、これが原因と考えました。

…しかしデータを修正しても、現象は変わりませんでした。
ガーン!!


こんな感じであれこれ悩みまくったのですが、結局以下の要因でヒューリスティック関数の値がおかしいことが原因でした。

・拠点データの開始番号は(0ではなく)1としていた

・メインマップ座標をエリアマップ解像度に変換してない

・エリアデータは斜め1コストとして算出したのに、
 ヒューリスティック関数内では直線距離を算出していた
 (斜め1.4コスト)



◎目的地指定画面の改善

というわけで、ようやく正常なエリア経路が作成できました。

中継地点自動設定機能02

目的地指定画面は(遠距離を含む)全域が指定可能となり、移動可否判定のレスポンスは大幅に向上しました(概ね0~2秒)。


しかし(川に挟まれた地域など)一部の地点を指定すると、10秒ぐらい待たされることがあり、その間ゲームがフリーズしてしまうので、後日さらなる対策を考えます。

…マップデザインを変更して、移動不可地域を無くしてしまうとか(笑)



◎部隊移動処理の改修

このゲームには「発令してから伝令が到着するまで時間がかかる」というルールがあります。そのため、伝令到着までの間に部隊が移動している可能性があります。なので、発令時に移動可否判定で算出した移動経路を、部隊にそのままセットすることはできません。

そんなわけで、伝令が到着した後、目的地への移動経路を改めて探索する必要があります。

従来の詳細探索処理の前にエリア探索処理を加え、遠方エリアの場合は2番目の経路(=隣接エリア)の区都を中継地点として設定します。

中継地点自動設定機能01

実装して1つの部隊を遠方に移動させると、隣接エリア拠点への経路を瞬間的に算出し、移動を開始しました。そして隣接エリア拠点に到着すると一旦入城し、すぐに出場して次の目的地へ向かい、最後は最終目的地に到着しました。

しかし複数の部隊を動かすと、最初に指示した部隊は最初の中継地点まで移動し、その後停止。他の部隊は全く動きません。うーむ…(ー_ー;



◎デバッグ

部隊が中継拠点に一旦入城→再出場する際に、部隊のZ座標を加算して南側に出していたのですが、再出場先が川になる拠点がありました。これが原因で1つの部隊が移動不可になると、他の部隊も連鎖的に移動不可となりました。

そんなわけで、出場時の座標修正はやめて、部隊経路定期探索処理に移動不可チェックを追加し、移動不可時は座標等をコンソール出力するよう改修しました。


その後も動作テストを繰り返すと、特定の拠点に駐留できず部隊が停止するケースがありました。

メインマップのテクスチャは微妙に歪んでいるので、見た目に合わせて拠点の配置場所をずらしました(昔の処置)。それをすっかり忘れていたので、目的の拠点がメインマップ座標では移動不可となるケースが発生したのに、気付けませんでした(汗)



◎テクスチャ再取得

昔のツールを修正しながら、テクスチャの再取得を試みました。しかしテクスチャの上下左右が(隙間や歪みなく)ピタリ一致する正射影行列を作成することが難しく、1日がかりでようやく隙間の無いテクスチャが完成しました。

MainMap000_OLD   MainMap000_New

これはメインマップの一番左上のテクスチャです。
従来は上端に隙間がありました(左図)。
新版は隙間が無くなりました(右図)。

これを適用して動かすと…あれ?まだズレてるような…??



◎次回予告

以前は(遠距離の経路探索が遅すぎて)ゲームとしてまともに遊べないレベルだったのですが、エリア経路探索/詳細経路探索の2段階に分けたことで、何とか遊べるレベルになりましたw

それにしても、問題やバグが次々と出て来るのは勘弁して欲しいです。…いや、悪いのは自分なんですけどね(汗)

次回は、テクスチャと座標のズレを修正し、中継地点自動設定機能がきちんと動くか確認します。

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

| BLOG TOP |
DATE: CATEGORY:三国志軍記開発
AreaMap01_ブログ用
南陽郡エリアマップ
地形や街道に配慮しながら設計されたエリアマップ。今回は内部処理に利用されるが、軍団の権限や占領時の連鎖など、ゲーム性にも影響するらしい。



◎作業計画

今回は、遠方の目的地を目指す際に、各武将が中継地点を自動的に判断し設定する機能を実装します。

具体的に説明すると、メインマップを複数のエリアに分割し、隣接外の遠方エリアへ移動する際は、隣接エリアのエリア拠点を経由するようにします。

作業手順は以下の通り。

1 拠点座標の調整
2 エリアマップの作成
3 エリア経路データの作成
4 パイプラインの作成
5 目的地設定処理の改修
6 目的地到着処理の改修



◎拠点座標の調整

拠点座標はこれまで緯度経度情報をそのまま利用してきましたが、今回は街道を考慮して大胆に移動し、下記効果を図ります。

・中継地点の候補とする
・経路探索時間の短縮
・戦略拠点としての重要性向上

拠点座標の調整

宛、新野、博望、樊城を街道の交差点に配置し、その他の拠点も街道沿いに多く配置しました。



◎エリアマップの作成

当時の中国は郡県制なので、県境でエリアを区切るとリアルな雰囲気になりそうです。
(ちなみに、このマップは荊州南陽郡です)

しかし、リアルさに拘りすぎると、ゲーム性が損なわれる可能性があります。ここはあえて県堺を無視して、地形や街道に配慮しながら(ゲーム展開が盛り上がりやすいように)境界を設定します。

AreaMap01_半透明図   AreaMap01_ブログ用

左図はエリアマップを半透明とし、地形種別マップと重ねたもので、右図は完成したエリアマップです。

尚、地区毎に区都(=移動中継拠点)を想定済です。



◎パイプラインの作成

エリアマップ画像を読み込んで、特定の座標 → 色 → エリア情報を取得するパイプラインを作成します。

色情報を取得する所まで地形種別用プログラムと同じですが、XNAコンテンツパイプラインを下手にいじるとハマる危険があるので、流用方式とします(コピーし別物として作成する)。

拠点情報画面01   部隊情報画面01

拠点情報画面と部隊情報画面に、地区名を追加しました。部隊が移動すると、所在欄の地区名も変わります。

エリアマップによる地区判定は成功です!^^



◎次回予告

ここまでは短期間で出来たのですが、次の「目的地設定処理の改修」で延々とハマってしまいました。先にここまでの記事をUPしておけば良かったなぁ…。

次回はこの続きで、中継地点自動設定機能を作成します。ようやくハマリを突破したので、多分一両日中にUPできると思います。

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

| BLOG TOP |
DATE: CATEGORY:三国志軍記開発
三国群英伝ONLINE2
三国群英伝Online2
MMORPGの続編。シリーズの特徴である兵士育成システムに加え、ビジュアルの3D化、海上戦闘、攻城兵器、やりこみ要素等が追加された。



◎8月の目標達成度

・活動時間月140時間以上

実績:95h(達成率:68%)


・指揮系統の反映(8h)

実績:19h(達成率:100%)


・中継地点指定機能の作成(24h)

実績:24h(達成率:100%)


・中継地点の自動設定(16h)
・連隊の隊列制御(24h)
・戦闘処理の実装(28h)

実績:未着手(達成率:0%)


・ブログ更新/HP更新(40h)

実績:30h(達成率:100%)


・電気使用量:200kWh以下

実績:156kWh(達成率:100%)


・予定外作業

実績:20hでミニマップ改修


8月は活動時間少なく、進捗悪いです。
戦闘処理も着手してないし…(ーー;



◎作業時間分析

作業時間集計2011年8月(PDF形式)


○良かった点
・バグ修正や課題を納得できるレベルまで仕上げた

○悪かった点
・中盤休みすぎ
・1日あたりの目標時間を達成した日が6日だけ
・未着手作業が多い
・ブログ更新数少ない

猛暑/節電/工事騒音等で根気や集中力が低下する中、経路探索バグ修正やミニマップ座標変換などの課題に直面し、なかなかやる気を出せずサボりまくってしまいました。

それにしても、6連休はヒドイ。
後半は涼しい日もあったのに…>_<



◎騒音と暑さと節電の関係

8月は、工事でうるさい日が7月より多かったです。

丸1日静かな日もわりとありましたが、朝8時から夜7時までガンガンやる日もあり、生活リズムが崩れる要因となりました。(昼寝れないと夜型ペースを維持できない)

窓を完全に閉めきれば少しマシになりますが、節電で空調控えているので、部屋の中が蒸し風呂状態になります。暑さと騒音、どちらを我慢するか…これって究極の2択?w

ちなみに、8月は空調を一度も使わずに耐えたので、電気使用量は目標を大幅に下回りました。胸を張って報告できるのは節電だけ(笑)



◎進捗状況チェック

現在、3カ月近く遅延しています。

「サボってて進まない」というのもありますが、「少し進むと新たな課題が生じるので、なかなか進まない」というのもあります。年内リリースは絶望的だなぁ…。

ともかく、9月に少しでも先に進めて、10月にスケジュールを見直します。



◎9月の目標

・活動時間月160時間以上

・中継地点の自動設定(16h)

・戦闘処理の実装(32h)

・連隊の隊列制御(24h)

・戦闘モーションの作成(40)

・ブログ更新/HP更新(48h)

・電気使用量:150kWh以下
 →空調使用禁止

今月の重点目標:戦闘処理の中核部分を実装すること!



◎次回予告

次回は、中継地点の自動設定機能を作成します。

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

| BLOG TOP |
DATE: CATEGORY:三国志軍記開発
ミニマップ改修02
開発中のミニマップ画面
ミニマップに部隊アイコンが追加された。リアルタイムに移動するので、いわゆるレーダーマップのように見える。オレンジ色は自部隊。



◎ミニマップの座標変換式

現在、ミニマップとメイン画面の座標変換式は、3Dを考慮してません。そのため、ミニマップで選択した場所とメイン画面の場所がズレてしまいます。そこで、ミニマップの画像を再取得し、3Dを考慮した座標変換式に修正します。

MiniMap02_ブログ用_
上図:画像イメージ(解像度は640×512))

赤枠:XNAで描画する領域
黄枠:メインマップの領域

メタセコイアの「視点>ズーム」機能で、黄枠の最小幅が512(2のべき乗)になるよう調整し、画像を再取得しました。
赤枠の左右余白は削除し、512×512で保存します。

赤枠と黄枠の共有領域が、座標変換対象領域です。各4隅の頂点座標をチェックし、ミニマップ座標からメインマップ座標へ変換する計算式を作成します。


ミニマップ→メインマップ座標変換関連データ表(PDF)


最初は座標系が3種類あることに気付かず、悩みまくりでした。

・取得元画像系
・ミニマップ描画座標系
・メインマップ座標系

イメージ図に枠線を描いてイメージを把握し、関連データを1つ1つ算出して、ようやく導き出したのが、資料最下部の変換式です。式の内容は…自分でもよくわからないので解説できません!(爆)



◎逆方向の座標変換

実装しようとしたら(ミニマップのイメージを再取得したので)城アイコンの表示位置がずれていることに気付きました。

城アイコンの表示位置は、メインマップ座標系→ミニマップ座標系に変換する必要があります。今後部隊をミニマップに表示するためにも、双方向の座標変換を実現しましょう。


メインマップ→ミニマップ座標変換関連データ表(PDF)


最初の変換式は複雑で逆式にできそうもなく、1から作り直したのですが、2度目ということもあって、最初の変換式ほどハマらずに作成できました。

ちなみに、従来は拠点クラスにわざわざミニマップ表示用座標を持たせて調整してきましたが、この座標変換が成功すれば、こういった調整作業が不要となります。



◎実装

双方向の座標変換を実装します。

ミニマップ改修01

城アイコンがきちんと配置されました。また、マウスで適当にクリックすると、目的地の座標が表示されます。

双方向共にOKっぽいです。



◎部隊アイコンの表示

ミニマップに部隊アイコンを追加します。また、拠点アイコンを四角形とし、部隊アイコンを山形とします。

…実際にやってみると、方向転換する時に、ガクガク揺れる感じです。これは、アイコンの画像イメージと、描画時の原点座標指定の問題っぽいですね。

アイコンのイメージ画像を(中央が重心になるように)修正し、spriteBatch.Draw()の原点座標を画像の中央に指定したら、解決しました。



駐留任務で駐留先を指定する際は、部隊は表示されず、拠点のみ表示されます。
攻撃任務では敵味方の部隊も表示され、拠点/部隊/地点のいずれも攻撃目標に選択可能です。

ミニマップの部隊アイコンが移動する様子は、レーダーマップを見ているようでちょっと楽しいです^^



◎今後の検討課題

まず第一に、部隊が重なると見辛い&選択困難状態となる問題があります。

これはメイン画面で部隊衝突&回避処置を実装すると多少改善されるでしょうが、ミニマップにおける部隊アイコンの大きさを考慮すると、他にも工夫が必要かもしれません。


次に気になるのは、‘リアルタイムに動く小さなアイコン’をマウスで選択する操作は、プレイヤーが不快に感じないか?という懸念です。

ダイアログを開く際にゲーム時間を強制停止すれば回避できますが、そうなると複数プレイは不可能ですね。…まぁ今の所は大丈夫っぽいので、しばらく様子を見ましょう。


また、今後の課題としては、ミニマップへの履歴表示があります。視界内の部隊と色分けするなどして、わかりやすくする必要がありそうです。



◎次回予告

計算式を導き出すまで悩みまくりでしたが、部隊表示はわりといい感じだったので、少し安堵しました。

9月になったので、次回は「8月の総括と9月の目標」です。

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

| BLOG TOP |

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