戦術シミュレーションゲーム制作②
~索敵アルゴリズム篇~
Kotaro Sakai
2014.11.05
目次
- 成果物の紹介
- リファクタリング①②③④
- 索敵アルゴリズム①②③④⑤
- 今後について
成果物の紹介
エフェクト処理などの細かい演出を導入しました。また、前回のコードレビュー結果を受けて、ソースコードの修正(リファクタリング)を行いました。
今回行ったソースコードの修正(リファクタリング)の内容について、次のページから簡単に説明していきます。
リファクタリング①
●定数
あるプログラムにおいて、その開始から終了まで内容が一定であることを保証する変数。
var PIECE = 32;
var SQUARE = 32;
var Player = Class.create(Sprite, {
initialize: function(x, y) {
Sprite.call(this, PIECE, PIECE);
this.x = x * SQUARE;
this.y = y * SQUARE;
}
});
- 定数はすべて大文字で宣言(全言語共通のルール)
- 宣言時に定数であることを明示的に書く言語もある(C#におけるconst等)
リファクタリング②
●連想配列①(宣言)
添字にスカラー数値以外のデータ型(文字列型等)が使用できる配列。
var AROUND = {
TOP: { X: 0, Y:-32 },
LEFT: { X:-32, Y: 0 },
RIGHT: { X: 32, Y: 0 },
BOTTOM: { X: 0, Y: 32 }
};
- AROUND定数は上下左右のX,Y相対座標を格納
- 通常の配列のように多次元配列も使用可能
リファクタリング③
●連想配列②(参照)
function SetMoveScope(rx, ry, steps, direction) {
var x = rx + AROUND[direction].X;
var y = ry + AROUND[direction].Y;
}
- 通常の配列のように大括弧([ ])内に添字を指定して値を参照できる。また、ピリオド(.)の後に直接添字を指定して値を参照することも可能
- ただし、添字に変数を使いたい場合は必ず大括弧を使用する
リファクタリング④
●再帰呼出し
ある手続き中で再びその手続き自身を呼び出すこと。
// 移動範囲を伸ばす(再帰呼び出し)
if (direction != "BOTTOM") arguments.callee(x, y, steps - 1, "TOP");
if (direction != "RIGHT") arguments.callee(x, y, steps - 1, "LEFT");
if (direction != "LEFT") arguments.callee(x, y, steps - 1, "RIGHT");
if (direction != "TOP") arguments.callee(x, y, steps - 1, "BOTTOM");
- JavaScriptの再帰呼出しは「arguments.callee()」を使用することが可能
索敵アルゴリズム①
●前回までのアルゴリズム
- 目標との座標比較を行い移動先を決定(詳細省略)
- 目標との間に障害物がある場合、近付こうともしない
- 最適なアルゴリズムとは到底いえない
そもそも索敵アルゴリズムとは何かについて考えた。
その結果、索敵アルゴリズムは以下の2パターンに大別できるという結論に至った。
- 猪突猛進型(フロア型)
- 虎視眈々型(フィールド型)
索敵アルゴリズム②
●猪突猛進型(フロア型)
- ひたすら目標に向かって突き進む型
- フロアのような比較的狭い空間ならば常に目標を視認でき、従ってひたすら近付くことが可能
- 目標との間に障害物(木や岩)がある場合、迂回して可能な限り近付こうとする。目標との間を完全に隔てる障害物(川や山脈)の場合も同様
「アークザラッドシリーズ」等で顕著に見られる
索敵アルゴリズム③
●虎視眈々型(フィールド型)
- 対象が一定のラインを超えたときのみ目標に近付く型
- フィールドのような広い空間の場合、自分が視認できる範囲に対象が侵入しなければ近付こうとしない
- 視認可能≒目標との間に障害物が存在しないと考えることができる
「ファイアーエムブレムシリーズ」等で顕著に見られる
索敵アルゴリズム④
function ScoutingSearch() {
for (var i = 0; i < MOVE_SCOPE.length; i++) {
for (var direction in AROUND) {
// 移動範囲+攻撃範囲
var x = MOVE_SCOPE[i].x + AROUND[direction].X;
var y = MOVE_SCOPE[i].y + AROUND[direction].Y;
if (x == player.x && y == player.y) {
return { X:MOVE_SCOPE[i].x, Y:MOVE_SCOPE[i].y };
}
}
}
return null;
}
●虎視眈々型(フィールド型)の実装コード
- 自分の「移動範囲+攻撃範囲」内に目標が侵入しているかを判定し、真の場合その座標を返す
索敵アルゴリズム⑤
●猪突猛進型(フロア型)の実装コード
- まだ実装できてませんが、「A*(エースター)」という有名(らしい)な経路探索アルゴリズムを理解すれば実装できそう
- 参考になりそうなページ
今後について
●cocos2d-x
- 言語はC++等
- ゲーム開発ライブラリとしてはそこそこ有名な模様
- 環境構築しようとして頓挫中
●Unity
- ゲーム開発ライブラリとしては最も有名?
- 公式サイトに丁寧なチュートリアルもあり開発し易そう
●Rubyを使ったゲーム開発
- ライブラリとしてはDXRuby, Star Ruby, Gosu等、たくさんある模様
- いろいろ試し模索する予定
戦術シミュレーションゲーム制作②
By Jane Doe
戦術シミュレーションゲーム制作②
- 1,321