忍者ブログ
カレンダー
04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
プロフィール
HN:
[-_-;] (みかん)
性別:
男性
趣味:
プログラミング、XOPS
自己紹介:
中部地方在住です。
最新コメント
[11/30 NONAME]
[11/22 NONAME]
[09/24 NONAME]
[06/10 NONAME]
[01/29 NONAME]
XOPS関連サイト「みかん箱」の運営や、OpenXOPSの開発などを行う[-_-;](みかん)のブログ。近状報告や独り言などを書きます。
Prev Month12345678910111213141516171819202122232425262728293031Next Month
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

category :
PR
OpenXOPSのAIパスをネットワーク型にしてみる
私生活は、数ヶ月前に比べればまぁまぁいい感じです (いきなり何
メインPCの電源が逝ったため急きょ交換しましたが、それ以外は特に
どうってことないです。

どの程度の方々(人数)見て頂いているのか分かりませんが、ブログ
を放置してしまい、すいませんでした。
言い訳を述べると、何かまとまった文章を入力する作業が面倒くさ
かったからです。


ツイッター上で断片的な情報を載せていますが、
OpenXOPSのAIパスをネットワーク型にしようと試みています。

XOPSのアドオンを作ったことがある人なら分かると思いますが、XOPS
のAIパスは、指定されたポイント間を決められた通りに動いているだけ
に過ぎません。
移動系パスはランダムパスは追尾パスもあるものの、基本的にはポイント
同士を一方通行で移動しているだけです。

ネットワーク型パスというのは、マップ上にAIパスをネットワークのよう
に複雑に張り巡らせ、移動方向や移動順序はAI自ら意思決定をして移動
する方式です。

UNDERGROUNDでネットワーク型AIパスを張ると、こうなります。
 ※イメージ

(クリックで拡大)

ネットワークの作り方も単純で、新規に用意したポイントをマップ上に
多数配置するだけです。
認識番号を調べながら手動で一個づつ設定する必要もありません。
ゲーム実行時に、障害物の無い移動可能なポイント同士を自動接続します。

ゲーム内でAIは、向かうべき場所さえ決まれば自律的に経路(移動ルート)
を検索して、ほぼ最短ルートで移動します。


AIをネットワーク型パスにすることで、AIはある程度自立してマップ内
を動き回れるようになります。

オンライン版のように、AIがある程度戦場を判断して移動するように
したりとか。
マップ内でプレイヤーが逃げても逃げても、ロボットやゾンビが(単なる
追尾と異なり)障害物を避けながら追いかけてくるとか。
アイディア次第で、色々できますね。

とりあえず、現在はマップの指定したエリアに自動的に移動できるよう
にするべく、経路探索を開発しています。
電車やバスの路線案内と異なり、処理時間が重要になります。全てのAI
処理を30ミリ秒(0.03秒)以内に完了する必要があるのです。
口頭で理屈を説明したり脳内で想像する限りは単純で簡単そうですが、
実際にプログラムを書くと結構複雑・面倒で、思い通りに行きません。

なお勘違いされないように言っておきますが、OpenXOPSの正規版に
追加する独自機能ではありません。
正規のOpenXOPSとは別に、派生プロジェクトか改造サンプルか何かに
なる予定です。
category : ソフト・ツール開発 comment [0]
デバック用のログ出力機能
色々慣れては来ましたが、今後が不安で不安で・・・(独り言


OpenXOPSの開発は、少しづつ進めています。

ほぼ事前予告なしになってしまいましたが、開発・デバック用に
ログの出力機能を付けました。(コミット済み)

単純なテキスト形式にしようかとも思ったのですが、HTMLで綺麗
な表示を目指しました。
デザインは改善の余地もありますが、それなりに合格点ではない
でしょうか。

コミット時のコメントにも書いた通り、exeのコマンド引数に"log"を
付けて起動することで、同ディレクトリにOpenXOPS_log.htmlと
して出力します。(ファイル名を指定することはできません。)

気が付いた方もいるかもしれませんが、二重起動は考慮して
いません。
本当はログのファイル名を毎回ランダム(あるいは日時による文字)
に変えても良かったのですが、起動するたびにファイルが溜まって
いくのは気持ちが悪いのでやめました。
ログの出力モードが指定された時だけ、二重起動を防止しても
良いですね。ってかそうしようかな。

現時点で大きな不具合も副作用も見つかっていないので、多分
正規リリースされる次期バージョンでも正式に搭載されます。
低レイヤー周りのクラスの中身が滅茶苦茶になってしまったのが、
まぁ許してください。


ツイッターやってるとブログに書くネタが無くなってきますね。
こりゃ済み分けを考えなきゃダメだな。。
category : ソフト・ツール開発 comment [0]
そろそろ限界か
・・・「やり残した」というより「時間が無かった」って感じだなぁ
 (意味深?


OpenXOPSの開発ですが、とりあえずやれるところはやったようで、
最近は落ち着いてきています。
ピークはいつだったのかと聞かれると難しいですが、超ハイペースで
作業できていた時と比べて、開発ペースが落ちていることは認めざる
負えません。

残るは、OpenGLコアを載せて、人と弾の当たり判定を作り直したら
ひと段落かな。
それと、血などの描画サイズが違うとか、一部効果音の再生音量が
異なるとの報告も頂いてるいるので、その辺も修正したりとか。

本来は相違点ゼロを目指すべきですが、さらなる改良(相違点の改善)
が難しいレベルに達しつつあります。
これ以上本家XOPSを再現するのは、技術的に不可能だったり、ある
いは手間と時間が掛かり過ぎるため現実的ではなかったり。
最も分かりやすいのは、人とマップの当たり判定とか、他多数。

そろそろ開発から次のステップに進む時なのかもしれません。
OpenXOPSを、いかにして世の中に広めていくかを真面目に考え
ないといけないですね。ユーザーコミュニティ(掲示板?)の用意は
必須だろうなぁ。


OpenXOPSのニコ動向けの動画について、実は既に3本目の動画も
ある程度ネタを思い付いているのですが、やはりネタ仕込みをする
時間がありませんorz
(1本目・2本目にコメントを残して頂いた方々、ありがとうございます。)

4月1日のエイプリルフールも色々考えていたのですが、やはり実行
する時間がなさそうです。
category : ソフト・ツール開発 comment [0]
OpenXOPSの1.011「手榴弾投げ」にバグ
突然ですが、4月から名古屋に住むことになりました。
各所で公言している通り今は東京に住んでいますが、諸事情により
3月中に名古屋に引っ越さなければなりません。
「荷物」という名のガラクタを全部捨てて、物を減らさないとorz


2月22日に公開したOpenXOPS 1.011ですが、バグがあるようです。

AIの「手榴弾投げ」パスに対する処理について、正しい高さに投げない
ようです。
一部標準ミッションのプレイにも支障が出るレベルで、場合によっては
上手く動作しないaddonもあるかもしれません。

不具合自体は初歩的なミスだったので解決は容易だったのですが、
修正したバイナリ版の公開は、次回バージョンアップ時に合わせたい
と思います。


全く関係ないですが、色々な経緯で去年12月から務めさせて頂いている
Invisible Alpaca(IA)のアドバイザーについて、自分は少々勘違いを
していたようです。
就任当時の記事では、務めさせて頂くからにはそれ相当の責任がある
と考えていましたが、実際にはかなり緩い雰囲気でした。
あまり細かいことは考えずに、楽しむことを最優先でやっていこうと
心を改めることにしました。
category : ソフト・ツール開発 comment [2]
GLUTなしでglGenTextures()関数を使う
このブログ初のOpenGLネタです。
OpenXOPSの件で試しに使ってみると、ハマった点があったのでメモメモ。


OpenGL 1.1でテクスチャをGPUに転送する場合、glTexImage2D()関数が使えます。
複数のテクスチャを使う場合も、その都度glTexImage2D()関数で転送することも
不可能ではないですが、枚数・種類や切り替えタイミングが増えるとパフォーマンス
に影響します。

そこで、OpenGL独自の「テクスチャオブジェクト」と呼ばれるものを作成し、予め必要
なテクスチャを転送しておくことで、(毎フレーム大量のテクスチャ情報を転送する必要
がなくなり)パフォーマンスが向上します。
glGenTextures()関数でテクスチャオブジェクトを作成、glBindTexture()関数を用いて
バウンド(指定)します。後はglTexImage2D()関数で転送します。
毎フレーム描画する際に、必要に応じて再度glBindTexture()関数を呼び出せば、
予め設定したテクスチャを指定できるっといった感じです。
テクスチャオブジェクトは、不要になった時点でglDeleteTextures()関数で解放します。
 (OpenGLの詳しい使い方は、他の文献を参考にしてください。)

何も知らずに、逐一glTexImage2D()関数でテクスチャを転送する設計で作ってしまい
ました (汗
描画の高速化を試みるため、テクスチャオブジェクトを活用することにしたのですが、
うまくテクスチャが読み込めません。
VC++のデバック機能を活用して色々調べた結果、テクスチャオブジェクトを作成する
glGenTextures()関数の動作がおかしそうだと気が付いたものの、サンプル通りの
関数呼び出し手順や引数でも動かず困っていました。

各参考文献と明らかに異なる点は、GLUT(OpenGL Utility Toolkit)を使う前提の
サンプルが多い中、自分は使っていない点です。
まさかと思いGLUTとの関係性を調べてみると、どうやらGLUTを正しく初期化しない
と動作しないとの解説を発見。
あぁこりゃダメだ っと諦めかけたその時、デバイスコンテキストを正しく用意してあげ
れば動作するとの報告が。

そんなこんなで、GLUTを一切使用しなくてもWinAPIで動作させることに無事成功
したので書いておきます。
--------------------------------------------------------------------------------
    //デバイスコンテキストのハンドルを取得
    HDC hDC = GetDC(hWnd);

    //カレントコンテキストに設定
    wglMakeCurrent(hDC, hGLRC);

    //テクスチャオブジェクトを生成
    glGenTextures(1 , &textureobj);

    //デバイスコンテキストのハンドルを解放
    ReleaseDC(hWnd, hDC);
--------------------------------------------------------------------------------
(全角スペースがいっぱい入っているのでお気を付けあれ~)

とりあえずこれで動きました。
経験豊富な方からすれば、もっと効率的で良いやり方があるかもしれません。


注意:
使用環境は、Windows7 VC++2008 OpenGL 1.1です。
OpenGLを始めたばかりで良く分かっていません。
よって、記述の正当性や効率・動作速度などは、自信も保証も一切ありません。
category : ソフト・ツール開発 comment [0]
[5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15]

※過去のブログ記事は 原則として編集・修正していません。
 各記事の内容は投稿時のものであり、現在では異なる場合があります。
 最新の情報は、関係する内容について書かれた 最新の記事をご覧ください。

TOP