當事件發生時,SKNode子類應該如何通知父級場景?SKNode子類應該如何與父級場景和兄弟節點通信?
我有一個SKNode子類,通過根據遊戲邏輯適當地重繪或移除節點來處理觸摸事件。通知父級場景的iOS最佳實踐(或其他同級SKNode實例)有哪些事件發生?我應該使用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
感謝:如果你想要一些必要的方法,你可以,如果你願意,你可以看到斯威夫特的文檔的詳細信息沒有可選
添加方法。有趣和非常有幫助。後續問題:在遍歷列表時檢測/觸摸哪個可觸摸節點的最簡單方法是什麼?這真的很有可能是計算效率更高?非常感謝 – doublea
CGRectContainsPoint將可觸點節點轉換爲世界空間。它更有效率,因爲您可以按照可能按下的順序來處理節點(如果有偏好),並且一旦找到節點就可以提前退出,否則所有節點都必須執行檢查。 – LearnCocos2D
Gotcha。謝謝。 – doublea