gpt4 book ai didi

ios - SKNode 子类应该如何与父场景和兄弟节点通信?

转载 作者:行者123 更新时间:2023-12-01 17:26:02 30 4
gpt4 key购买 nike

当事件发生时,SKNode 子类应该如何通知父场景?

我有一个 SKNode 子类,它根据游戏逻辑通过适本地重绘或删除节点来处理触摸事件。通知父场景(或其他同级 SKNode 实例)事件发生的 iOS 最佳实践是什么?我应该使用 NSNotification 中心吗?某种形式的委托(delegate)?我想避免紧耦合。我可以想到几种方法来完成它,但想知道是否有标准做法,因为似乎有非游戏 MCV iOS 设计(例如用于模型之间通信的 NSNotification,或模型 -> Controller ,以及委托(delegate)或目标 - View 操作 -> Controller 等)

从概念上讲,我喜欢 SKNode 子类本质上充当“ View ”角色的想法,并解释触摸事件,然后将“语义”游戏信息传达给包含场景或其他节点。

// 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

最佳答案

对于一般的触摸和输入之类的东西,我会避免在每个单独的实例中处理它们。不仅因为它效率低下,而且您也没有简单的方法来决定谁接收触摸以及触摸应该如何传播到其他节点。

简单的情况:两个重叠的节点——你只想删除最上面的节点,还是只删除任何被触摸的节点,或者全部在触摸的位置?在这种情况下,最好在中心位置接收输入,然后遍历“可触摸”节点。

除此之外:

  • 使用委托(delegate),否则您将通过直接向另一个对象发送消息来实现紧密耦合
  • 如果您有多个可能想要对事件使用react的潜在代表,并且该事件不会经常发生(即绝对不是每一帧),请使用通知
  • 当你完全懒惰并且不在乎时使用单例

  • 从概念上讲,您会在 Kobold Kit 中找到很好的示例和解决方案。通过行为,它是 game components 的一种形式.还包括一个每个节点的模型存储类 KKModel,它允许您在任何节点中存储诸如分数之类的东西,而不必仅为变量添加子类。

    例如:
    [self.scene.model setDouble:score forKey:@"score"];

    然后,您可以只使用标签类中的更新方法来获取分数:
    double score = [self.scene.model doubleForKey:@"score"];

    避免了消息传递、委托(delegate)、通知的需要,同时牺牲了(一点)效率。

    关于ios - SKNode 子类应该如何与父场景和兄弟节点通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19455241/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com