有几种方法可以解决这个问题。我更喜欢一种隐藏尽可能多的底层实现的方法。理想情况下,我实际上会创建一个代表分数 HUD 的类。从“应用程序代码的其余部分”的角度来看,其他游戏代码与 HUD 的合同是通过反映分数的分数属性。
有些人会争辩说这是一个标签,看起来很麻烦。但是如果你改变它的实现方式(例如,说它变成一个带有填充条的乐谱,或者你可能有伴随乐谱变化的特殊效果),你会发现它非常容易处理。或者如果你突然有一个 2 人游戏并且两个玩家都跟踪分数怎么办?您可以通过添加分数类的新实例来轻松添加新分数。
这是我的意思的一个简单例子。
ScoreHUD.h
@interface ScoreHUD : NSObject
@property (nonatomic, assign) NSInteger score;
- (instancetype)initWithScene:(SKScene *)scene x:(CGFloat)x y:(CGFloat)y;
@end
ScoreHUD.m
@interface ScoreHUD()
@property (nonatomic, strong) SKLabelNode *scoreLabel;
@end
@implementation ScoreHUD
- (instancetype)initWithScene:(SKScene *)scene x:(CGFloat)x y:(CGFloat)y
{
self = [super init];
if (self) {
_scoreLabel = [SKLabelNode initWithFontNamed:@"chalkduster"];
_scoreLabel.fontSize = 45;
_scoreLabel.fontColor = [SKColor whiteColor];
_scoreLabel.position = CGPointMake(x, y);
[scene addChild:_scoreLabel];
// Setting initial label value to the default value of the score
_scoreLabel.text = [@(_score) stringValue];
}
return self;
}
- (void)setScore:(NSInteger)score
{
if (_score != score) {
_score = score;
self.scoreLabel.text = [@(score) stringValue];
}
}
@end
请注意,我没有测试代码或检查它是否可以编译。
因此,要使用它,您可以在场景中创建一个 this 的实例,例如:
// Property in the scene
@property (nonatomic, strong) ScoreHUD *score;
// Initialize where you need to
self.score = [[ScoreHUD alloc] initWithScene:self x:CGRectGetMidX(self.frame) + 175 y:CGRectGetMidY(self.frame) + 350];
您可以在场景的initWithSize 中执行此操作。
当分数发生变化时,您只需执行以下操作:
self.score.score += 1;
如果你觉得它很讨厌,你总是可以用另一种方法包装它。
这种方法有一个缺点。假设你的分数在一帧内更新了很多。这意味着您的文本将在每帧中设置多次。根据您拥有的游戏类型,这可能是也可能不是问题。有一些方法可以保持这个基本设置并解决它。但对于绝大多数游戏来说,这不是问题。