我目前有一个SpriteKit游戏,目标是击落敌人。我已经为它实现了碰撞检测,它工作得很好。但我需要为敌人实施健康。敌人不断产生并继续移动,所以你永远不知道应该是什么节点,因此我尝试在didBeginContact方法中声明自定义类节点,然后将其分配给bodyA,然后更改它的健康值,但这看起来没用,因为我只是创建了一个新节点(同样显示NSLog)。我试图强调声明,但仍然没有运气。对这个主题做了一些研究,但没有找到适合我的任何东西。目前我无法提供我所做的源代码,但希望我所要求的可以解释。请把我推向正确的方向。访问节点的属性
Q
访问节点的属性
0
A
回答
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。
相关问题
- 1. 基于属性值的访问节点
- 2. 访问循环中节点的属性
- 3. 厨师 - ServerSpec - 访问节点属性
- 4. 访问networkx节点和属性
- 5. vis.js - 仅通过节点ID访问整个节点属性
- 6. 点击复选框后如何访问jsTree节点属性?
- 7. CQ从当前节点(当前组件)访问深层子节点的属性
- 8. 具有名称空间的节点上的访问属性
- 9. 如何通过linq访问XML节点上的属性?
- 10. 如何在jsTree中访问当前节点的html属性?
- 11. NetworkX如何访问对象的属性作为节点
- 12. 如何访问Twig(Symfony)中特定节点的XML属性?
- 13. 如何在强制布局中访问节点的weight属性?
- 14. xslt - 不能访问带属性选择器的curent节点
- 15. 如何访问ruby_block中的节点属性和配方变量
- 16. Boost :: ptree - 访问包含在列表中的属性树节点
- 17. 如何访问节点对象中的特定属性值?
- 18. 在JavaScript中,如何访问子节点的属性?
- 19. 在Drupal 7的html.tpl.php中访问节点属性
- 20. 访问Neo4j的节点属性使用暗号在python
- 21. 如何访问JavaScript DOM节点元素上的属性值?
- 22. 如何访问Sankey图表的节点属性
- 23. PHP:访问属性优点/缺点
- 24. 搜索节点和节点的属性
- 25. 在XSLT中,如何一次访问两个兄弟节点的属性值(在访问节点a时,我需要访问节点b)?
- 26. 如何在视觉上访问父节点属性?
- 27. 节点和MySQL - connection.query里面connection.query - 对象属性不可访问
- 28. 从根节点访问AngularJs控制器属性ng-if
- 29. 我如何通过属性访问儿童节点?
- 30. 直接访问和编辑到XML节点,使用属性
将sprite子类化,为该类添加健康状况,改为使用您的子类。但更重要的是,我会巩固你对面向对象概念的更多理解。 –