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