強制停止ZOCの処理 

>ZOC判定の実装について
というコメントいただきました。
まあ、私の方法がベストかわかりませんが、ちょっと詳しく書いてみます。

最初に用意した変数は
 cost(x, y) 消費移動量マップ
 tmp(x, y) 移動範囲検索用マップ
の2つです。
x, yはマップのサイズ+2くらいまで取っておいて、0と最後は壁扱いにすると楽です。

さて、コードです。が、長いので格納。

まず初期化。

0.tmpを全て未探索にする
 tmp(全部) = -1
1.移動させたいキャラの位置に移動力を置く
 tmp(移動開始位置) = 移動力
2.マスごとに移動に消費する移動力を置く
 cost(x, y) = 消費コスト
3.移動できない場所のコストに非常に高い値を置く(他キャラとか壁とかマップ外とか)
 cost(進入禁止) = 100とか
4.ZOCの位置のコストをわかりやすい値にしておく
 cost(ZOC位置) = 999とか

では、移動範囲検索に入ります。
とりあえず再帰で書いて行きますが、1方向だけ説明します。
歩きながら移動力を減らして行き、-1の場所で移動終了しています。

1.移動力が尽きたら戻る
 if 移動力 < 0 : return
2.残ってる移動力を置き、探索済みにする
 tmp(今の位置) = 移動力
3.判定する方向が空いているかチェック
 if 行き先 = マップの中
 この時、マップの外側が壁だと判定がいらない
4.空いていればZOCであるかをチェック
 if cost(行き先) = ZOCの値
 ZOCであり、移動力がまだ残っていれば、移動力を0にする
 if 移動力 > 0 : tmp(行き先) = 0
5.ZOCでなければ、行き先の移動力を引いて再帰をもう一度呼び出す
 4の else
 if tmp(行き先) < 移動力
 範囲検索 移動力-cost(行き先) 行き先
*.3~5を全方向書く

これでtmp > -1の場所は移動可能と判定できました。

4の処理で移動可能範囲内かつそれ以上移動できなくしています。
この時の「移動力がまだ残っていれば」というのは結構重要でした。
0の時にも判定してしまうと、
ZOCが回り込めるようになってしまったり、ZOCに引き寄せられるようになったりします。

5の最初の判定は最短経路検索に役立ちます。
移動開始位置から移動力が綺麗に減るので、描画にも役に立つかもしれません。
ただし、ZOCの位置はtmp = 0になってるので、経路検索にちょっとだけ注意。

ZOCのフラグマップなんてものもあれば、綺麗にコードが書けたかもしれませんね。
変数減らすために割愛しましたが、
ZOCの種類によって値を変えると、様々なZOCの判定ができるかもしれません。
停止ZOC以外にも、先制反撃ZOCとか、撤退禁止ZOCとか、即死ZOCとか。
ZOC同士の干渉も書きやすくなるでしょう。
まあ、今回は移動だけなので割愛します。

こんなところでしょうか。
web拍手 by FC2

コメントの投稿

Please, write a comment in Japanese(or use web translator).














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

トラックバック

この記事のトラックバックURL
http://gridnote.blog62.fc2.com/tb.php/971-25abad98