Spritekitの物理空間で衝突を発生させる為の必須処理と衝突判定とすり抜け

アップル社がiPhoneアプリ開発に提供する2Dゲーム用フレームワーク SpriteKit を開発アプリに適用すればゲーム画面内に物理空間を生じせしめ 内部でオブジェクト同士の衝突の検出を可能にします。

Spritekitの物理空間で衝突を発生させる為の必須処理と衝突判定とすり抜け

処でアップル社が提供する統合開発環境、 IDE(Integrated Development Environment) たるXcodeでは補完機能が随分重宝します。 特にスティーブ・ジョブズに依って齎された NEXTSTEP を継承するアップル社の開発環境では長くなり勝ちなメソッド名や変数名などを扱うには 補完機能がないとなると実に不便に感じるものです。

さてSpritekitを利用して開発するゲームに於けるコーディングでは 利用するクラスファイルのヘッダファイル冒頭に以下記述が必要になるのは周知でしょう。 先ずはSpritekitをインポートしなければならないのは言わずもがなです。

スポンサーリンク
日付:2014年4月13日
開発機:MacBook Air(11-inch, Mid 2013)
MacOSバージョン:OS X 10.9.2
Xcodeバージョン:5.1
言語:Objective-C
主関連アプリ:Balloons Occupy(邦題:バルーンズ・オキュパイ、バルオキュ)
#import <SpriteKit/SpriteKit.h>

- (void)viewDidLoad {
	[super viewDidLoad];
	// 背景色をグラデーションに
	CAGradientLayer *gradient = [CAGradientLayer layer];
	gradient.frame = self.view.bounds;
	gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor darkGrayColor] CGColor], nil];
	[self.view.layer insertSublayer:gradient atIndex:0];
}

而してコーディングを進めるに SpriteKitを用いて生成したインスタンスノードには物理特性のプロパティば付加されるに依って 以下の如き記述が補完に助けられながら可能となります。 此処では hanamaru がSpriteNodeを適用したキャラクター はなまる のインスタンスとなって画面中を縦横無尽に動き回る想定となっています。

hanamaru.physicsBody.categoryBitMask = categoryHanamaru;
hanamaru.physicsBody.contactTestBitMask = categoryBallonOccupy;
hanamaru.physicsBody.collisionBitMask = categoryBallonOccupy;
はなまるインスタンス
はなまるインスタンス

此れ等などは補完の効いて例えば hanamaru.phy… あたり迄手入力すれば physicsBody が候補に上がりますので実にコーディング時の手間が省け効率化に繋がります。 処があろうことか此の儘設定出来て画面上で排斥し合うので 其れは想定通りの動きであって従って全体が首尾良く運んでいる様に見えてしまうので注意が必要です。

真に物理空間全体を首尾良く運ばせるに必要となるのは Spritekitの物理空間で衝突を発生させる為の必須記述事項を盛ることです。 其れは以下のようになるでしょう。

@interface BLOMyScene : SKScene

そもそもが上記をSpriteKitをインポートしたクラスであるヘッダファイル 例えば上記サンプルコードでは手元のファイルではBLOMyScene.hとしてありますが、 当該ファイルに記述しないとタッチイベントさえ補完されません。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

加えて physicsWorld.contactDelegate を設定しないと上の touchesBegan メソッドが呼び出されない状況が出来します。 例えばBLOMyScene.mの初期化部分には以下の如く記述されるべきでしょう。

-(id)initWithSize:(CGSize)size {
	if (self = [super initWithSize:size]) {
		self.physicsWorld.contactDelegate = self;
	}
}

さて此処迄準備が整えば後は物理空間と各インスタンスの関係を記述していくだけです。 衝突は無論のこと、 ゲームではしばしばキャラクター同士が重なり合っても衝突せしめない、 即ち互いに影響なくすれ違う処理も必要となってきます。 例えば手元の開発ゲームの主人公足るhanamaruが 他の物体と衝突はせず、敵、enemyとのみの衝突を感知する設定は 以下の様に記述して得られます。

hanamaru.physicsBody.categoryBitMask = hanamaruCategory;
hanamaru.physicsBody.contactTestBitMask = enemyCategory;
hanamaru.physicsBody.collisionBitMask = 0;
Balloons Occupy
無料:カテゴリ: ゲーム: 4+ 評価
バージョン: 3.0
リリース: 2015年1月29日
更新: 2020年9月1日
サイズ : 13 MB
互換性: iOS 8.0 以降のiPhone、iPod touch に対応。および、macOS 11.0以降とApple M1 チップを搭載したMac に対応。