初めまして。新卒1年目のプログラマーのHKです。トイロジックでは、毎年新入社員の研修として企画からストア提出まで行うiPhone用ゲーム開発研修が実施されます。私たちの代が作成した『色違いのトルとポル』は、iPhoneの縦と横を切り替えることで操作キャラクターやマップを変化させるパズルアクションゲームとなっております。

本記事では、このゲームのメインシステムにあたるiPhoneの縦横切替を検知する実装方法について紹介させていただきます。

iPhone端末の向きの取得について

さっそく本題のコードをご覧ください。

UIDeviceOrientation direct = [[UIDevice currentDevice] orientation];

UIDeviceは、デバイスのモデル名やOSのバージョン、バッテリー残量など様々な情報の取得及び設定が可能なクラスで、こちらにあるorientationプロパティにアクセスしてデバイスの物理的な向きを取得しています。UIDeviceOrientation列挙型には、UIDeviceOrientationPortrait(デバイスが縦向きでホームボタンが下部にある)、UIDeviceOrientationPortraitUpsideDown(デバイスが横向きで、ホームボタンが上部にある)などの7つの状態が定義されていて、デバイスの傾きの実数値を気にすることなく実装することが可能です。

縦横切り替えの通知について

本アプリでは、iPhoneデバイスが縦から横に、横から縦に切り替わるタイミングでプレイヤーなど多くのクラスが処理を実行する必要があります。そのため、1対多で通知する仕組みであるオブザーバーパターンを導入しました。


// 観察する側
class Observer
{
public:
	// 通知後の処理を行う
	virtual void Notice() = 0;
};

// 通知する側
class Subject
{
public:
	// 追加
	void AddObserver(const std::shared_ptr observer)
	{
		if (observer)
			this->observers_.emplace_back(observer);
	}
	// 通知
	void NofifyAll()
	{
		for (auto& observer : observers_)
		{
			if (!observer.expired())
				observer.lock()->Notice();
		}
	}

protected:
	std::vector> observers_;
};

このゲームでは毎フレームごとにデバイスの向きを取得しており、それを前フレームの向きと比較することで縦横の切り替えを検知しています。そのタイミングでSubjectクラスがプレイヤーなどのObserverクラスに通知して、操作プレイヤーの変更、重力の向きを切り替えるなど通知された側はそれぞれの処理を実行しています。

最後に

いかがでしたでしょうか?本記事では、『色違いのトルとポル』の縦横切替の実装について紹介させていただきました。今回は、UIDeviceOrientation列挙型を使用しましたがCMMotionManagerを使用すればiPhoneデバイスのXYZ軸の値を取得することも可能です。機会があれば、ぜひそちらの方法も試してみたいと思います。

最後までお読みいただき、ありがとうございました。

著者紹介 HK
2022年にトイロジックに新卒入社。『色違いのトルとポル』ではインゲーム周りを主に担当。最近は、同期をボドゲの沼に嵌めるように画策中。

トイロジックでは現在、一緒に働くプログラマーを募集しています。

不明点などもお気軽にお問い合わせくださいフルリモート採用も行っております、ご応募お待ちしております!