個人的なメモ

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

Cocos Sharp での基本的なゲームの制御の方法(5) フェードイン、フェードアウト。

今回はフェードイン、フェードアウトする方法についてご説明します。
フェードイン、フェードアウトすること自体は非常に簡単ですが、それぞれ1つずつ注意点があります。

フェードイン、フェードアウトには以下のクラスを使用します。

public CCFadeIn(float durataion);
public CCFadeOut(float durtaion);

それぞれの使用方法ですが、

フェードインを実行する。

public CCFadeIn(float durataion);

durataion で指定された所要時間でフェードインします。

注意点:CCFadeIn を実行する前に CCNodeOpacity を 0 に設定しないと、今からフェードインする CCNode が画面上に表示されてしまいます。
CCFadeInCCNodeOpacitydurataion で指定された所要時間で 0 から 255 にリニアに変化させるためです。

(例)スプライトを3秒の所要時間でフェードイン

var sprite = new CCSprite("Image.png", null);
//  Opacity を 0 に設定するのを忘れずに!
sprite.Opacity = 0;
this.AddChild(sprite);

// 3秒の所要時間でフェードイン
var fadeIn = new CCFadeIn(3f);
sprite.RunAction(fadeIn);

フェードアウトを実行する。

public CCFadeOut(float durtaion);

durataion で指定された所要時間でフェードアウトします。

注意点:CCFadeOut で画面上から見えなくなっても、Opacity = 0 で画面上にオブジェクトは残ったままですので、きちんと Remove する必要があります。


(例)スプライトを3秒の所要時間でフェードアウトし、2秒待って、スプライトを消去する

var sprite = new CCSprite("Image.png", null);

var fadeOut = new CCFadeOut(3f);
var delayTime = new CCDelayTime(2f);
var removeSelf = new CCRemoveSelf(true);

// 逐次実行アクション作成
var sequence = new CCSequence(fadeOut, delayTime, removeSelf);

sprite.RunAction(sequence);

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

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 を使いこなせればほぼ思い通りの動作ができると思います。

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

Cocos Sharp での基本的なゲームの制御の方法(3) 連続したアクションを実行する。

はじめに

こんにちは、@hiro128_777です。

今回は連続したアクションの作成方法についてご説明します。

連続したアクションの実行

連続したアクションを実行するには、アクションを複数作成した上で、そのアクションを CCSequence に登録し、CCNodeRunAction メソッドで実行します。

public CCSequence(params CCFiniteTimeAction[] actions);

連続したアクション間に「待ち」を入れたい場合には、 CCDelayTime で待ち時間を設定します。

例として
移動 -> 1秒待ち -> 拡大 -> 2秒待ち -> 回転
の連続したアクションを作成しましょう。

// 連続して実行したいアクションをそれぞれ作成
var moveByAction = new CCMoveTo(3f, new CCPoint(50f, 100f));
var scaleByAction = new CCScaleBy(3f, 2f);
var rotateByAction = new CCRotateBy(3f, 45f);

// アクション間の待ち時間
var delayTime0 = new CCDelayTime(1f);
var delayTime1 = new CCDelayTime(2f);

// 連続アクション作成
var sequence = new CCSequence(moveByAction, delayTime0, scaleByAction, delayTime1, rotateByAction);

// アクション実行
node.RunAction(sequence);

これだけで連続したアクションを作成できます。

次回は、アクションにひも付けてメソッドを実行する方法をご紹介します。

今回はここまでです。

Cocos Sharp での基本的なゲームの制御の方法(2) 代表的なアクションの種類

はじめに

こんにちは、@hiro128_777です。

今回も、Cocos Sharp での基本的なゲームの制御の方法をご説明します。

前回の繰り返しになりますが、Cocos Sharp での基本的なゲームの制御の方法を理解するには以下の2つの概念を理解すれば大丈夫です。

① スケジューラ 一定間隔で繰り返し何らかの処理を行なう。
② アクション  画面上のオブジェクトに対して何らかの動きを指示する。また、オブジェクトにひも付けて何らかの処理を行なう。

今回は、②のアクションについてご説明します。

アクション

アクションとは、画面上のオブジェクトに対して何らかの動きを指示したり、オブジェクトにひも付けて何らかの処理を行なうものです。
例えば、画面上のキャラクターの移動、回転、拡大縮小、色の変更などが該当します。

Cocos Sharp のアクションの基本クラスは、CCActionであり、
すべてのアクションは CCAction の派生クラスになります。

以下に、代表的なアクションをご紹介します。

public CCMoveTo(float duration, CCPoint position);
public CCMoveBy(float duration, CCPoint position);
public CCScaleTo(float duration, float scale);
public CCScaleBy(float duration, float scale);
public CCRotateTo(float duration, float deltaAngle);
public CCRotateBy(float duration, float deltaAngle);

To と By の違いですが、
To はアクション完了時の絶対値、By は現在からの相対値になります。

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

CCMoveTo : 絶対位置指定の移動

public CCMoveTo(float duration, CCPoint position);

position で指定された画面上の座標に duration の所要時間で移動します。

(例)画面上の 50, 100 の座標に3秒の所要時間で移動します。

var moveToAction = new CCMoveTo(3f, new CCPoint(50f, 100f));
node.RunAction(moveToAction);

CCMoveBy : 相対位置指定の移動

public CCMoveBy(float duration, CCPoint position);

現在の座標から position で指定された座標分だけ duration の所要時間で移動します。

(例)現在位置より画面上の座標で、 X軸方向に 50、 Y軸方向に100の座標に3秒の所要時間で移動します。

var moveByAction = new CCMoveBy(3f, new CCPoint(50f, 100f));
node.RunAction(moveByAction);

CCScaleTo : 絶対倍率指定の拡大縮小

public CCScaleTo(float duration, float scale);

オブジェクトの当初のサイズを基準として scale で指定された倍率に duration の所要時間で拡大縮小します。

(例)オブジェクトを3秒の所要時間で当初のサイズより2倍に拡大(場合によっては縮小)します。

var scaleToAction = new CCScaleTo(3f, 2f);
node.RunAction(scaleToAction);

CCScaleBy : 相対倍率指定の拡大縮小

public CCScaleBy(float duration, float scale);

現在のサイズから scale で指定された倍率に duration の所要時間で拡大縮小します。

(例)オブジェクトを3秒の所要時間で現在のサイズより2倍に拡大します。

var scaleByAction = new CCScaleBy(3f, 2f);
node.RunAction(scaleByAction);

CCRotateTo : 絶対角度指定の回転

public CCRotateTo(float duration, float deltaAngle);

オブジェクトの0度を基準として deltaAngle で指定された角度に duration の所要時間で回転します。

(例)オブジェクトを3秒の所要時間で45度の角度に回転させます。

var rotateToAction = new CCRotateTo(3f, 45f);
node.RunAction(rotateToAction);

CCRotateBy : 相対角度指定の回転

public CCRotateBy(float duration, float deltaAngle);

オブジェクトの現在の角度を基準として deltaAngle で指定された角度分だけ duration の所要時間で回転します。

(例)オブジェクトを3秒の所要時間で当初の角度を基準として45度回転させます。
※現在の角度が45度なら当初の角度から90度の回転となります。

var rotateByAction = new CCRotateBy(3f, 45f);
node.RunAction(rotateByAction);

このほかにもたくさんのアクションが用意されていますので、ぜひ一度確認してみてください。

次回は連続したアクションの作成方法についてご説明します。

今回はここまでです。

Cocos Sharp での基本的なゲームの制御の方法(1) スケジューラ

はじめに

こんにちは、@hiro128_777です。

今回は、Cocos Sharp での基本的なゲームの制御の方法をご説明します。

スケジューラとアクション

結論から言いますと、Cocos Sharp での基本的なゲームの制御の方法をマスターするには以下の2つの概念を理解すれば十分です。

① スケジューラ 一定間隔で繰り返し何らかの処理を行なう。
② アクション  画面上のオブジェクトに対して何らかの動きを指示する。また、オブジェクトにひも付けて何らかの処理を行なう。

基本的にこれだけです。

ですが、この2つは処理の方向性がまったく違うのでそれぞれの特性をよく理解し使用しましょう。

今回は、①のスケジューラについてご説明します。

スケジューラ

スケジューラとは一定間隔で繰り返し何らかの処理を行なう機能です。
ゲームの中ではゲームを進行する上で必要な様々な処理に使用します。
例えば、自機の移動、当たり判定、スコアなどの各種表示項目の制御などです。

Cocos Sharp のスケジューラとは具体的には、CCNode クラスの Schedule メソッドです。
いくつかオーバーロードがありますが、まずは以下の2つだけを覚えれば十分です。

public void Schedule(Action<float> selector, float interval);
public void ScheduleOnce(Action<float> selector, float delay);

次にそれぞれの使用方法をご説明します。

Schedule メソッド

public void Schedule(Action<float> selector, float interval);

interval で指定された間隔ごとに selector で指定されたデリゲートを実行します。
※デリゲートはラムダ式で書くので、要はラムダ式内で指定したメソッドを実行するということになります。

例えば、以下のような場合、0.1秒ごとに、DetectCollisions メソッドを実行します。

this.Schedule(t => DetectCollisions(), 0.1f);

private void DetectCollisions()
{
	// 当たり判定の処理
}

この場合、0.1秒ごとに当たり判定が実行されます。

ScheduleOnce メソッド

public void ScheduleOnce(Action<float> selector, float delay);

selector で指定されたデリゲートを delay で指定された時間遅延させて実行します。

例えば、以下のような場合、1秒後に、PerformGameOver メソッドを実行します。

this.ScheduleOnce(t => PerformGameOver(), 1f);

private void PerformGameOver()
{
	// ゲームオーバーの処理
}

この場合、1秒後にゲームオーバーの処理が実行されます。

スケジューラは、Cocos Sharp でゲームを作成する場合最も重要な機能です。
Cocos Sharp ではスケジューラによってゲームが管理されます。

今回はここまでです。