2014-06-18 38 views
0

我正在研究一個主玩家作爲SKSpriteNode的遊戲。遊戲中有一個可以獲得的通電概念,每個玩家可以擁有一組附件。子節點定位

我有定義爲附件的協議:

@protocol ESPlayerAttachment <NSObject> 

@required 

-(ESPlayerAttachmentType)attachmentType; 

@optional 

-(void)willAttachToPlayer:(ESPlayerSpriteNode *)player; 
-(void)didDetachFromPlayer:(ESPlayerSpriteNode *)player; 
-(void)player:(ESPlayerSpriteNode *)player willUseAttachmentInParent:(SKNode *)parent; 

@end 

此外,我有定義爲通電一通訊協定:

@protocol ESPlayerPowerup <NSObject> 

-(void)acquiredByPlayer:(ESPlayerSpriteNode *)player; 

@end 

最後,我有一個物理體上加電框,還有一個在播放器上,以便我可以檢測到碰撞並附加上電。舉個例子,我有一個盾牌執行上電爲:

-(void)willAttachToPlayer:(ESPlayerSpriteNode *)player 
{ 
    [player detachAttachmentsOfType:ESPlayerAttachmentTypeShield]; 
    __weak ESPlayerShipSpriteNode *weakPlayer = player; 
    [player.parent addChild:_shield]; 
    _shield.position = CGPointMake(player.position.x, player.position.y + 0.1f * _shield.size.height); 
    [self performSelector:@selector(detachFromPlayer:) withObject:weakPlayer afterDelay:15.0f]; 
} 

什麼困擾我的是,如果我將屏蔽通電的球員在我SKScene類(在updatedidMoveToView方法),一切正常。屏蔽被正確定位。但是,如果我通過ESPlayerPowerup方法(在與玩家發生碰撞時調用該方法)將其添加,該節點將相對於SKScene定位,因此它會在屏幕的左下角結束。我似乎無法弄清楚有什麼區別(在遊戲中只有一個ESPlayerSpriteNode實例,所以我相對有信心,這不是問題)

+0

[player.parent addChild:_shield] - 您將屏蔽節點添加到播放器的父節點(SKScene節點?),這是故意的嗎? – giorashc

+0

@giorashc是的,玩家是包含在SKNode中的SKSpriteNode(父親不是SKScene)。原因是我需要附件(在這種情況下是盾牌)與玩家分享共同的父母。 –

+0

我沒有看到你提到的一些代碼,但我只能假設這是因爲你正在處理不同的座標系,這取決於什麼樣的對象試圖定位屏蔽,以及屏蔽對象是什麼對象。 –

回答

0

對於什麼是值得的,我最終找到了這個張貼在SO,解決了困擾我的問題:

SKSPriteNode position changes to 0,0 for no reason

這似乎是在SpriteKit一個錯誤,但附加的physicsBody做工作,並正確定位之前定位的項目。