戦術シミュレーションゲーム制作②

~索敵アルゴリズム篇~

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;
}

●虎視眈々型(フィールド型)の実装コード

  • 自分の「移動範囲+攻撃範囲」内に目標が侵入しているかを判定し、真の場合その座標を返す

索敵アルゴリズム⑤

●猪突猛進型(フロア型)の実装コード

今後について

●cocos2d-x

  • 言語はC++等
  • ゲーム開発ライブラリとしてはそこそこ有名な模様
  • 環境構築しようとして頓挫中

●Unity

  • ゲーム開発ライブラリとしては最も有名?
  • 公式サイトに丁寧なチュートリアルもあり開発し易そう

●Rubyを使ったゲーム開発

  • ライブラリとしてはDXRuby, Star Ruby, Gosu等、たくさんある模様
  • いろいろ試し模索する予定

戦術シミュレーションゲーム制作②

By Jane Doe

戦術シミュレーションゲーム制作②

  • 1,321