イベントが発生したときに、SKNode サブクラスは親シーンにどのように通知する必要がありますか?
ゲーム ロジックに基づいて、必要に応じてノードを再描画または削除することで、タッチ イベントを処理する SKNode サブクラスがあります。イベントが発生したことを親シーン (または他の兄弟 SKNode インスタンス) に通知するための iOS のベスト プラクティスは何ですか? NSNotification センターを使用する必要がありますか? ある種の委任?密結合は避けたい。私はそれを成し遂げるためのいくつかの方法を考えることができますが、ゲーム以外の MCV iOS 設計 (モデル間の通信のための NSNotification、またはモデル -> コントローラー、および委任またはターゲット -ビューのアクション -> コントローラーなど)
概念的には、SKNode サブクラスが本質的に「ビュー」の役割を果たし、タッチ イベントを解釈し、「セマンティック」ゲーム情報を含むシーンまたは他のノードに伝達するというアイデアが気に入っています。
// SampleScene.m
#include "SampleScene.h"
#include "SampleBallNode.h"
@implementation SampleScene
- (void)didMoveToView:(SKView *)view {
if (!self.contentCreated) {
[self createSceneContents];
self.contentCreated = YES;
}
}
- (void)createSceneContents {
self.backgroundColor = [SKColor whiteColor];
self.scaleMode = SKSceneScaleModeAspectFit;
[self addBall];
}
- (void)addBall {
SampleBallNode *ball = [[SampleBallNode alloc] init];
ball.position = CGPointMake(100, 100);
[self addChild:ball];
}
@end
// SampleBallNode.m
#include "SampleBallNode.h"
- (id)init {
if ([super init]) {
self.name = @"ball";
self.userInteractionEnabled = YES;
[self drawSelf];
}
return self;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self removeFromParent];
// TELL SCENE THAT I'VE DIED HERE... TO UPDATE SCORE OR SOMETHING...
}
- (void)drawSelf {
UIBezierPath* ovalPath = [UIBezierPath bezierPathWithOvalInRect ...
SKShapeNode *tokenBall = [[SKShapeNode alloc] init];
tokenBall.path = ovalPath.CGPath;
[self addChild:tokenBall];
}
@end