個人的なメモ

Tomohiro Suzuki @hiro128_777 のブログです。Microsoft MVP for Developer Technologies 2017- 本ブログと所属組織の公式見解は関係ございません。

Cocos Sharp での基本的なゲームの制御の方法(4) アクションにひも付けてメソッドを実行する。

はじめに

こんにちは、@hiro128_777です。

今回はアクションにひも付けてメソッドを実行する方法についてご説明します。

アクションにひも付けてメソッドを実行

アクションにひも付けてメソッドを実行するというのは具体的には、
・オブジェクトのアクションに合わせて効果音を鳴らす。
・オブジェクトのアクションにひも付けて何らかのフラグを立てる。
・オブジェクトが弾を発射するなどの、CCMoveTo CCScaleBy CCRotateBy 等では表現できない複合的なアクション。
というような場合に使います。

このような場合、以下の4つのうちいずれかを利用します。

public CCCallFunc(Action selector);
public CCCallFuncN(Action<CCNode> selector);
public CCCallFuncND(Action<CCNode, object> selector, object d);
public CCCallFuncO(Action<object> selector, object pObject);

では、それぞれの使い方を見ていきましょう。

CCCallFunc … 引数なしの callback を実行する。

public CCCallFunc(Action selector);

(例)ステージ1クリアのフラグを立てる

var isFirstStageClearToTrue = new CCCallFunc(() =>
{
	this.IsFirstStageClear = true;
}

これは結構使います。特に前回の CCSequence と組み合わせて使うことが多いです。

CCCallFuncN … アクションが実行される CCNode を引数とした callback を実行する。

public CCCallFuncN(Action<CCNode> selector);

(例)ボスを倒したアクションを発動し、BGMを停止し、ボスを倒したSEを鳴らす。

var bossDefeated = new CCCallFuncN(node =>
{
	CCMoveTo bossDefeatedAction = new CCMoveTo(3f, new CCPoint(node.PositionX, node.PositionY - 1000f));
	CCSimpleAudioEngine.SharedEngine.StopBackgroundMusic();
	CCSimpleAudioEngine.SharedEngine.PlayEffect("Audio/SE/BossDefeated.xnb");
	node.RunAction(bossDefeatedAction);
});

これも結構使います。同様に前回の CCSequence と組み合わせて使うことが多いです。

CCCallFuncND … アクションが実行される CCNode および、任意のオブジェクトを引数とした callback を実行する。

public CCCallFuncND(Action<CCNode, object> selector, object d);

(例)ボスを倒したアクションを発動し、BGMを停止し、bossDefeatedSeFile で指定されたSEを鳴らす。

var bossDefeated = new CCCallFuncND((node, fileName) =>
{
	CCMoveTo bossDefeatedAction = new CCMoveTo(3f, new CCPoint(node.PositionX, node.PositionY - 1000f));
	CCSimpleAudioEngine.SharedEngine.StopBackgroundMusic();
	CCSimpleAudioEngine.SharedEngine.PlayEffect((string)fileName);
	node.RunAction(bossDefeatedAction);
},
bossDefeatedSeFile
);

実際にはこれは使ったことがないですね(笑)

CCCallFuncO… 指定した pObject を引数とする callback を実行する。

var CCCallFuncO(Action<object> selector, object pObject);

(例)う~ん、CCCallFuncO を効果的に使用できる状況が思いつきません!

正直 CCCallFuncO は、使わないですね…

CCCallFuncCCCallFuncN を使いこなせればほぼ思い通りの動作ができると思います。

というわけで、今回はここまでです。