2015-04-06 134 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

相關問題