子节点定位

时间:2014-06-18 11:08:28

标签: ios objective-c sprite-kit

我正在使用主播放器作为SKSpriteNode进行游戏。游戏有一个可以获得的通电概念,每个玩家都可以拥有一套附件。

我有一个附件协议定义为:

@protocol ESPlayerAttachment <NSObject>

@required

-(ESPlayerAttachmentType)attachmentType;

@optional

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

@end

此外,我有一个用于加电的protocl定义为:

@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的一个实例,所以我相对自信不是问题)

1 个答案:

答案 0 :(得分:0)

为了它的价值,我最终在SO上发现了这个帖子,这解决了我的问题:

SKSPriteNode position changes to 0,0 for no reason

这似乎是SpriteKit中的一个错误,但是在附加physicsBody之前定位项目确实有效,并且正确定位它。