C言語で3Dを勉強 -15 | 2010.03.09 23:40 |
▲ あちらが撃ってきたんだ。俺は悪くない (意味不明
だいぶ出来が良くなってきました。
本当は既にアルファ版(試作品の試作品)として公開しても、それはそれで面白いのですが
やはり初お披露目にしてはちょっと恥ずかしいので、もう少し作り込みます。
2D描画を頑張ってみました。
実は右下の装備武器がグルグル回る処理、DirectX的には意外と難しいです。
地味に難航してます。
まぁこんな表示は(武器名さえ出れば)なくても開発には影響ないので、後回しです。
当たり判定はしばらく置いといて、今度は2番目の山場「AI制御」を作り込みます。
既にちょっと作ってみたのですが、やはりその場で書ける物ではありませんでした。
感度が悪いし、見つかると瞬殺されるし、ソースがスパゲティ状態です。
よって中途半端なAI処理は全て捨てて、最初から計画を練って作り直します。
XOPSのAIは一般的な3DゲームのAIとしては単純に見えますが、実は裏ではかなり
複雑です。
各処理を言葉に良い表すと簡単ですが、計算量は意外と多いんです。
〜また長文です。宜しくお願いします。
AI制御には「モード分け」の概念を取り入れます。このモードはプレイヤー以外の
各人に割り当てます。
・・分かり易く言うと、歩き移動モード、攻撃モード、って事です。
ざっと考えて以下のように割り振ります。
AI_DEAD
死亡している人
原則として、描画以外は計算に関与しない。
AI_ACTION
戦闘中の人
AI_CAUTION
警戒中の人
(周囲を激しく見回している)
AI_WALK
移動パスによって歩いている人
AI_RUN
移動パスによって走っている人
AI_NORMAL
パスによって待機している人
(周囲をほどほどに見回している)
AI_WAIT
パスによって動かない人
(一定方向を向き続ける)
・時間待ち
・パスが無い
AI_TRACKING
特定の人を追尾する
分類分けすると、各モードは以下のように分けられます。
ただし、AI_DEAD(死亡)は特殊状態なので省きます。
■通常状態
・AI_WALK (歩き)
・AI_RUN (走り)
・AI_NORMAL (待機)
・AI_WAIT (停止)
・AI_TRACKING (追尾)
■興奮状態 (笑
・AI_ACTION (戦闘)
・AI_CAUTION (警戒)
「通常状態」は特定の時間もしくは場所で必ず行います。
一方「興奮状態」はいつでも臨機応変に処理する必要があります。
各モードへの移動推移として・・
AI_ACTION(戦闘) ⇒ AI_DEAD(死亡)
↑ ↓
AI_CAUTION(警戒) ⇒ AI_DEAD(死亡)
↑ ↓
通常状態 ⇒ AI_DEAD(死亡)
注意しなければならない点があります。
・モードに関係なく、常にAI_DEADになる場合がある。
(いつ死亡してもおかしくないという当たり前のこと)
・突然、通常状態からAI_ACTIONになる事は無く、
必ず一度はAI_CAUTIONになる。
前者についてはそのままの()内の意味です。考えなくても分かります。
後者は、なぜ一度AI_ACTION(警戒)に入れる必要があるのでしょうか。
答えは単純です。
いきなりAI_ACTION(戦闘)に入ると、視界に入った瞬間に瞬殺されます。
瞬殺するAIもそれはそれで面白いですが、場合によってはゲームにならないので、
一度AI_ACTION(警戒)に入り様子をうかがう動作を入れます。
「うかがう」といっても0.2〜0.5秒ですが、それでも結構差が出ます。
通常状態中には必然的にAI_ACTION(警戒)への割り込み処理に近い処理が必要になります。
・近くに弾が着弾した(敵の弾・味方の弾 区別せず)
・敵が近くで走っている
・敵の姿が見えた
・味方の死体を見つけた(時々)
通常状態中に上記の非常事態を検出したら、即座にAI_ACTION(警戒)になります。
自分の考えたAI動作は以上です。
こればっかりはXOPSの処理の中身は読めません。外から自分で予想するしかないのです。
逆を言えば、上記の処理はすべて独自設計です。
今回も、誰の得にならない、完全に自己満足の記事になりました。
なぜ、毎回こんな気持ち悪いことを書くのか?
それは「何か 無駄に頑張ってるなぁ〜」っと見てもらうためです(笑
それで良いのです・・。
各人に割り当てます。
・・分かり易く言うと、歩き移動モード、攻撃モード、って事です。
ざっと考えて以下のように割り振ります。
AI_DEAD
死亡している人
原則として、描画以外は計算に関与しない。
AI_ACTION
戦闘中の人
AI_CAUTION
警戒中の人
(周囲を激しく見回している)
AI_WALK
移動パスによって歩いている人
AI_RUN
移動パスによって走っている人
AI_NORMAL
パスによって待機している人
(周囲をほどほどに見回している)
AI_WAIT
パスによって動かない人
(一定方向を向き続ける)
・時間待ち
・パスが無い
AI_TRACKING
特定の人を追尾する
分類分けすると、各モードは以下のように分けられます。
ただし、AI_DEAD(死亡)は特殊状態なので省きます。
■通常状態
・AI_WALK (歩き)
・AI_RUN (走り)
・AI_NORMAL (待機)
・AI_WAIT (停止)
・AI_TRACKING (追尾)
■興奮状態 (笑
・AI_ACTION (戦闘)
・AI_CAUTION (警戒)
「通常状態」は特定の時間もしくは場所で必ず行います。
一方「興奮状態」はいつでも臨機応変に処理する必要があります。
各モードへの移動推移として・・
AI_ACTION(戦闘) ⇒ AI_DEAD(死亡)
↑ ↓
AI_CAUTION(警戒) ⇒ AI_DEAD(死亡)
↑ ↓
通常状態 ⇒ AI_DEAD(死亡)
注意しなければならない点があります。
・モードに関係なく、常にAI_DEADになる場合がある。
(いつ死亡してもおかしくないという当たり前のこと)
・突然、通常状態からAI_ACTIONになる事は無く、
必ず一度はAI_CAUTIONになる。
前者についてはそのままの()内の意味です。考えなくても分かります。
後者は、なぜ一度AI_ACTION(警戒)に入れる必要があるのでしょうか。
答えは単純です。
いきなりAI_ACTION(戦闘)に入ると、視界に入った瞬間に瞬殺されます。
瞬殺するAIもそれはそれで面白いですが、場合によってはゲームにならないので、
一度AI_ACTION(警戒)に入り様子をうかがう動作を入れます。
「うかがう」といっても0.2〜0.5秒ですが、それでも結構差が出ます。
通常状態中には必然的にAI_ACTION(警戒)への割り込み処理に近い処理が必要になります。
・近くに弾が着弾した(敵の弾・味方の弾 区別せず)
・敵が近くで走っている
・敵の姿が見えた
・味方の死体を見つけた(時々)
通常状態中に上記の非常事態を検出したら、即座にAI_ACTION(警戒)になります。
自分の考えたAI動作は以上です。
こればっかりはXOPSの処理の中身は読めません。外から自分で予想するしかないのです。
逆を言えば、上記の処理はすべて独自設計です。
今回も、誰の得にならない、完全に自己満足の記事になりました。
なぜ、毎回こんな気持ち悪いことを書くのか?
それは「何か 無駄に頑張ってるなぁ〜」っと見てもらうためです(笑
それで良いのです・・。
category : ソフト・ツール開発 | comment [0] trackback [] |