我目前有一個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子類化,爲該類添加健康狀況,改爲使用您的子類。但更重要的是,我會鞏固你對面向對象概念的更多理解。 –