SRPG Studio ~ シミュレーションRPG作成ソフト

スクリプトの記述

今回は実際にスクリプトを記述する流れについて説明します。 まずは、どういった機能が追加しやすいかを確認するために、 configureという単語でScriptフォルダを検索することを推奨します。 すると、次のようにconfigureという文字から始まるメソッドが見つかります。

configureCommands: function(groupArray) {
	// 行動していない場合は、セーブを表示
	if (!SceneManager.getActiveScene().getMainObject().isPlayerActioned()) {
		groupArray.appendObject(MapCommand.Save);
	}
	groupArray.appendObject(MapCommand.Objective);
	groupArray.appendObject(MapCommand.ConfigMenu);
	if (root.isSwitchCommandDisplayable()) {
		groupArray.appendObject(MapCommand.Switch);
	}
	groupArray.appendObject(MapCommand.TurnEnd);
}
		

MapCommandという単語が見られますが、これはマップ上でキャンセルキーを押したときに表示されるマップコマンドのことです。 マップコマンドには、ターン終了やセーブといった項目が表示されますが、 上記コードにもTurnEndやSaveといった単語が見られます。 このことから、このメソッドの内容を変更すれば、独自の項目を追加できるように思えますが、 結論から言うとその通りです。 たとえば、開発者が「ユニット概要」という項目を表示したいとして、 MapCommand.UnitSummaryというオブジェクトを用意したとします。 そして、これを上記メソッドに追加すれば、 ユニット概要という項目がマップコマンドに表示されることになります。

それでは、具体的にどのようにスクリプトを記述していくかを見ていきましょう。 上述のMapCommand.UnitSummaryというオブジェクトは、 公式サンプルのmapcommand-unitsummary.jsに定義されていますから、 このファイルの中身を見ていきます。

(function() {

var alias1 = MapCommand.configureCommands;
MapCommand.configureCommands = function(groupArray) {
	alias1.call(this, groupArray);
	
	groupArray.insertObject(MapCommand.UnitSummary, groupArray.length - 1);
};

MapCommand.UnitSummary = defineObject(BaseListCommand,
{
	_unitSummaryWindow: null,
	
	openCommand: function() {
		this._unitSummaryWindow = createWindowObject(UnitSummaryWindow);
		this._unitSummaryWindow.setUnitSummaryData();
	},
	
	moveCommand: function() {
		return this._unitSummaryWindow.moveWindow();
	},
	
	drawCommand: function() {
		var x = LayoutControl.getCenterX(-1, this._unitSummaryWindow.getWindowWidth());
		var y = LayoutControl.getCenterY(-1, this._unitSummaryWindow.getWindowHeight());
		
		this._unitSummaryWindow.drawWindow(x, y);
	},
	
	getCommandName: function() {
		return 'ユニット概要';
	}
}
);

// 一部省略

})();
		

原則としてコードの開始には(function() {を記述し、最後には})();を記述します。 これにより、この中で定義されたオブジェクトが他のオブジェクトから参照できなくなり、 競合の問題が発生しにくくなるためです。 以下、コードを順に説明していきます。

var alias1 = MapCommand.configureCommands;
		

新たなマップコマンドを追加するには、MapCommand.configureCommandsを書き換える必要がありますが、 その前に以前のconfigureCommandsをalias1という変数で保存します。 そうすることで、以前のconfigureCommandsを呼び出すこともできるようになるからです。

MapCommand.configureCommands = function(groupArray) {
	alias1.call(this, groupArray);
	
	groupArray.insertObject(MapCommand.UnitSummary, groupArray.length - 1);
};
		

alias1.callによって、以前のconfigureCommandsが呼ばれます。 以前のconfigureCommandsとは、本ページの冒頭で示したコードであり、 groupArrayにターン終了などの項目が設定されることになります。 groupArray.insertObjectにより、MapCommand.UnitSummaryという独自のオブジェクトをマップコマンドに追加したことになります。 groupArray.appendObjectの呼び出しでは、項目が末尾に追加されるため、指定位置に追加できるinsertObjectを呼び出しています。

MapCommand.UnitSummary = defineObject(BaseListCommand,
{
...
}
);
		

MapCommand.UnitSummaryというマップコマンド内の項目を表すオブジェクトを定義しています。 defineObject(BaseListCommand,は、MapCommand.UnitSummaryがBaseListCommandを継承するという意味になります。 BaseListCommandを継承する理由は、MapCommand.TurnEndなどの他のMapCommand系オブジェクトがそのようにしているためです。

_unitSummaryWindow: null,

openCommand: function() {
	this._unitSummaryWindow = createWindowObject(UnitSummaryWindow);
	this._unitSummaryWindow.setUnitSummaryData();
},
		

_unitSummaryWindow: nullは、このオブジェクトに_unitSummaryWindowというプロパティを持たし、初期値としてnullを設定する意味になります。 openCommandでは、UnitSummaryWindowオブジェクトをcreateObjectで作成しています。 原則、オブジェクトはこのようにcreateObjectで作成することになります。 UnitSummaryWindowはユニットの概要を表示するためにスクロールバーなどを必要としてますが、 そうしたものを作成できるようにsetUnitSummaryDataを呼び出しています。 今回のようなopenから始まるメソッドは、そのオブジェクトが使用される段階になると呼ばれると考えて問題ありません。 同じ意味合いでenterから始まるメソッドも存在しますが、こちらは戻り値としてEnterResult.OKかEnterResult.NOTENTERを返します。 前者は処理を続行する(move系やdraw系メソッドを呼び出す)ことを意味し、後者は処理を続行しない意味になります。

moveCommand: function() {
	return this._unitSummaryWindow.moveWindow();
},
		

move系メソッドでは、データの更新処理やユーザー入力の検出を行います。 たとえば、上記で呼び出しているmoveWindowは、キャンセルキーが押された場合にMoveResult.ENDを返すようにし、 「ユニット概要」の項目が終了するようにしています。 move系メソッドでは描画処理は行わないようにし、 戻り値としてMoveResult.CONTINUE(処理続行)かMoveResult.END(終了)を返すことを徹底します。

drawCommand: function() {
	var x = LayoutControl.getCenterX(-1, this._unitSummaryWindow.getWindowWidth());
	var y = LayoutControl.getCenterY(-1, this._unitSummaryWindow.getWindowHeight());
	
	this._unitSummaryWindow.drawWindow(x, y);
},
		

draw系メソッドでは描画処理を行います。 drawWindowは名前の通りウインドウを描画するメソッドであり、 引数として描画位置が必要になります。 このため、事前にx座標とy座標を取得します。 draw系メソッドでは、データの更新処理や入力検出を行わず、描画処理だけに専念します。 この分別により、更新処理が正しく行われない場合はmove系メソッドが原因と分かり、 描画処理が問題な場合はdraw系メソッドが原因と分かるようになります。

getCommandName: function() {
	return 'ユニット概要';
}
		

getCommandNameは、項目の名前を返すことができます。 「ユニット概要」という文字を変更したい場合は、この部分を修正します。

目次

スクリプト・マニュアル

ヘルプ・マニュアル