访问节点的属性

时间:2015-04-06 20:19:37

标签: objective-c sprite-kit

我目前有一个SpriteKit游戏,目标是击落敌人。我已经为它实现了碰撞检测,它运行得很好。但我需要为敌人实施健康。敌人不断生成并继续移动,所以你永远不知道应该是什么节点我尝试在didBeginContact方法中声明我的自定义类节点,然后将其分配给bodyA,然后改变它的健康值,但这似乎没用了我只是创建一个新节点(同样显示NSLog)。我试着对声明进行类型转换,但仍然没有运气。做了一些关于这个主题的研究,但没有找到适合我的东西。目前我无法提供我所做的源代码,但我希望我所要求的内容是可以解释的。请把我推向正确的方向。

2 个答案:

答案 0 :(得分:1)

每个SKSpriteNode都有一个userData NSMutableDictionary,可用于存储数据(对象)。

您首先要像这样初始化字典:

myNode.userData = [NSMutableDictionary dictionary];

然后您可以像这样分配数据:

float myHealth = 100.0;
NSString *myX = [NSString stringWithFormat:@"%f",myHealth];
[myNode.userData setValue:myX forKey:@"health"];

要读取数据,请执行以下操作:

float myHealth = [[myNode.userData objectForKey:@"health"] floatValue];

我在我的例子中使用了float,但你可以使用你想要的任何东西。请记住,你不能直接存储像float,int,long等原语。那些需要转换为NSNumber,NSString等。

话虽如此,斯蒂芬J对他的建议是正确的。你应该为你的敌人继承SKSpriteNode,并将健康作为一个类属性。从长远来看,子类化更容易使用,与使用userData相比,它具有更大的灵活性。

答案 1 :(得分:0)

为了说明Stephen J和sangony所指的一些面向对象的概念,我为你添加了一些代码。

子类化SKNode将定义一个新的对象类,它继承SKNode的所有功能。这里的主要优点是您可以实现自定义属性(例如运行状况)和自定义逻辑(例如降低运行状况)。

@interface EnemyNode : SKSpriteNode

- (void)getHit;
- (BOOL)isDead;
@property (nonatomic) CGFloat health;

@end

@implementation EnemyNode

- (instancetype)initWithColor:(UIColor *)color size:(CGSize)size {
  self = [super initWithColor:color size:size];
  if (self) {
    self.health = 100.f;
  }
}

- (void)getHit {
  self.health -= 25.f;
}

- (BOOL)isDead {
  return self.health <= 0;
}

@end

在你的场景中,你会这样使用它:

EnemyNode *newEnemy = [[EnemyNode alloc] initWithColor:[UIColor blueColor] size:CGSizeMake(50,50)];
[self addChild:newEnemy];

...

[newEnemy getHit]; 
if ([newEnemy isDead]) {
  [newEnemy removeFromParent];
}

如需进一步说明,您可以查看my answer to a similar question