2015-04-06 143 views
0

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

+1

将sprite子类化,为该类添加健康状况,改为使用您的子类。但更重要的是,我会巩固你对面向对象概念的更多理解。 –

回答

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等。

话虽如此,Stephen J对他的建议是正确的。你应该为你的敌人划分SKSpriteNode,并且把它作为一个类的属性。从长远来看,子类化工作更容易,与使用userData相比,您可以获得更大的灵活性。

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

相关问题