当事件发生时,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