個人的なメモ

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

Xamarin + Cocos Sharp で iOS, Android 対応のゲームを開発する手順 (11) タッチした場所に敵キャラを出す

今回は画面をタッチした場所に敵キャラを出します。
なお、敵キャラが出るのは画面の上部 1/4 をタッチした場合のみです。

まずは、敵キャラの画像をプロジェクトに追加します。

CocosSharpGameSample.iOS プロジェクトに敵キャラの画像を追加します。

f:id:hiro128:20160825145014p:plain

Resources/Images/Character/Enemy/Enemy001.png

f:id:hiro128:20160825145035p:plain

CocosSharpGameSample.Android プロジェクトに敵キャラの画像を追加します。

Assets/Images/Character/Enemy/Enemy001.png

f:id:hiro128:20160825145058p:plain

次にタッチした場所に敵キャラを配置します。

最初にタッチイベントのリスナーを作成し、ゲーム画面の CCLayer に追加します。
イベントハンドラはリスナーの OnTouchBegan プロパティにデリゲートとして登録します。

public GameLayer()
	: base()
{
	var listener = new CCEventListenerTouchOneByOne();
	listener.OnTouchBegan = this.CCEventListener_TouchBegan;
	this.AddEventListener(listener, this);
}

次に OnTouchBegan イベントハンドラを定義します。
OnTouchBegan イベントハンドラ内でタッチした位置を判定し、敵キャラ画面上に配置します。

OnTouchBegan イベントハンドラはラムダ式で書いても良いですが、ゲームの場合、ラムダ式の中身が大きくなってしまい可読性が下がりますので今回は別途定義しています。

OnTouchBegan の戻り値が true の場合、このイベント自体を処理し、その後の OnTouchEnded, OnTouchMoved, なども処理されます。
OnTouchBegan の戻り値が false の場合、このイベント自体が無視され、その後の OnTouchEnded, OnTouchMoved, なども無視されます。

protected bool CCEventListener_TouchBegan(CCTouch touch, CCEvent touchEvent)
{
	// タッチした場所に敵キャラ配置
	var touchedLocation = touch.Location;
	// 画面の上部25%なら敵キャラ配置
	if (touchedLocation.Y > GameSettings.ScreenHeight * 3 / 4)
	{
		var addingEnemy = new CCSprite("/Resources/Images/Character/Enemy/Enemy001.png", null);
		addingEnemy.Position = touchedLocation;
		addingEnemy.Tag = (int)NodeTag.Enemy;
		this.AddChild(addingEnemy);
		return true;
	}
	return false;
}

以上をまとめると、CocosSharpGameSample.Core プロジェクトの Layers/GameLayer.cs は以下の通りになります。

using System;
using System.Diagnostics;
using CocosSharp;

namespace CocosSharpGameSample.Core
{
	public class GameLayer : LayerBase
	{

		private CCNode player;

		public GameLayer()
			: base()
		{
			var listener = new CCEventListenerTouchOneByOne();
			listener.OnTouchBegan = this.CCEventListener_TouchBegan;
			this.AddEventListener(listener, this);
		}

		protected bool CCEventListener_TouchBegan(CCTouch touch, CCEvent touchEvent)
		{
			// タッチした場所に敵キャラ配置
			var touchedLocation = touch.Location;
			// 画面の上部25%なら敵キャラ配置
			if (touchedLocation.Y > GameSettings.ScreenHeight * 3 / 4)
			{
				var addingEnemy = new CCSprite("/Resources/Images/Character/Enemy/Enemy001.png", null);
				addingEnemy.Position = touchedLocation;
				addingEnemy.Tag = (int)NodeTag.Enemy;
				this.AddChild(addingEnemy);
				return true;
			}
			return false;
		}

		protected override void AddedToScene()
		{
			base.AddedToScene();
			// ゲーム画面の背景画像を配置
			var gameBackground = new CCSprite("/Resources/Images/Background/GameBackground.png", null);
			gameBackground.Position = new CCPoint(this.ContentSize.Center.X, this.ContentSize.Center.Y);
			AddChild(gameBackground);

			// 自機を配置
			this.AddPlayer();

			this.StartScheduling();
		}

		private void StartScheduling()
		{
			this.Schedule(t => this.UpdatePlayer(), 0.02f);
		}

		private void AddPlayer()
		{
			this.player = new CCSprite("/Resources/Images/Character/Player/Player.png", null);
			this.player.Position = new CCPoint(this.ContentSize.Center.X, this.ContentSize.Center.Y);
			this.AddChild(this.player);
		}

		private void UpdatePlayer()
		{
			this.player.PositionX = this.player.PositionX;
			this.player.PositionY = this.player.PositionY;

			// 画面からはみ出ないように、位置の値の上限、下限を設定します。
			// 左
			if (this.player.PositionX < 0 + GameSettings.PlayerWidth)
			{
				this.player.PositionX = 0 + GameSettings.PlayerWidth;
			}
			// 右
			if (this.player.PositionX > GameSettings.ScreenWidth - GameSettings.PlayerWidth)
			{
				this.player.PositionX = GameSettings.ScreenWidth - GameSettings.PlayerWidth;
			}
			// 下
			if (this.player.PositionY < 0 + GameSettings.PlayerHeight)
			{
				this.player.PositionY = 0 + GameSettings.PlayerHeight;
			}
			// 上
			if (this.player.PositionY > GameSettings.ScreenHeight - GameSettings.PlayerHeight)
			{
				this.player.PositionY = GameSettings.ScreenHeight - GameSettings.PlayerHeight;
			}
		}

	}
}

以上で、タッチした場所に敵キャラが出現するようになりました。

f:id:hiro128:20160825145217p:plain

今回は、ここまでです。

何かご質問などございましたらコメント頂ければご回答させていただきますのでお気軽にどうぞ!