我正在使用主播放器作为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课程中的播放器(使用update
或didMoveToView
方法),一切正常。屏蔽正确定位。但是,如果我通过ESPlayerPowerup
方法(在与玩家碰撞时调用)添加它,则节点相对于SKScene
定位,因此它最终位于屏幕的左下角。我似乎无法弄清楚差异是什么(游戏中只有ESPlayerSpriteNode的一个实例,所以我相对自信不是问题)
答案 0 :(得分:0)
为了它的价值,我最终在SO上发现了这个帖子,这解决了我的问题:
SKSPriteNode position changes to 0,0 for no reason
这似乎是SpriteKit中的一个错误,但是在附加physicsBody之前定位项目确实有效,并且正确定位它。