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類(在update
或didMoveToView
方法),一切正常。屏蔽被正確定位。但是,如果我通過ESPlayerPowerup
方法(在與玩家發生碰撞時調用該方法)將其添加,該節點將相對於SKScene
定位,因此它會在屏幕的左下角結束。我似乎無法弄清楚有什麼區別(在遊戲中只有一個ESPlayerSpriteNode實例,所以我相對有信心,這不是問題)
[player.parent addChild:_shield] - 您將屏蔽節點添加到播放器的父節點(SKScene節點?),這是故意的嗎? – giorashc
@giorashc是的,玩家是包含在SKNode中的SKSpriteNode(父親不是SKScene)。原因是我需要附件(在這種情況下是盾牌)與玩家分享共同的父母。 –
我沒有看到你提到的一些代碼,但我只能假設這是因爲你正在處理不同的座標系,這取決於什麼樣的對象試圖定位屏蔽,以及屏蔽對象是什麼對象。 –