Позиция SKSpriteNode

Я пытаюсь (научиться, как) строить игру с помощью SpriteKit, и у меня возникла проблема, которая прослушивала меня часами. У меня есть класс с именем Tank со следующим конструктором:

+ (instancetype)tankAtPosition:(CGPoint)position {
 Tank *tank = [self spriteNodeWithImageNamed:@"tank_base_1"];
 tank.position = position;
 tank.anchorPoint = CGPointMake(0.5, 0.5);
 return tank;
}

В моей сцене у меня есть следующий конструктор:

-(id)initWithSize:(CGSize)size {
 if (self = [super initWithSize:size]) {
 SKSpriteNode *background = [SKSpriteNode spriteNodeWithImageNamed:@"level_bg_1"];
 background.xScale = 0.40f;
 background.yScale = 0.40f;
 background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
 [self addChild:background];

 Tank *tank = [Tank tankAtPosition:CGPointMake(CGRectGetMidX(self.frame), 512)];
 [self addChild:tank];
 }
 return self;
}

который скомпилировал результаты в следующем рендере:

Однако все в порядке, если я изменю y резервуара на 256:

Tank *tank = [Tank tankAtPosition:CGPointMake(CGRectGetMidX(self.frame), 256)];

Я получаю это:

Насколько я знаю, нижняя часть равна y = 0, а средняя точка y = 512, поэтому, когда я указываю ay = 256, она должна быть центрирована в нижней половине экрана. Почему это близко к краю? Тестирующее устройство представляет собой ipad retina mini и в разделе "Сведения о развертывании"> "Устройства, которые я указал iPad". Что мне не хватает? Спасибо.

1 ответ

я понял. размер фрейма был испорчен, потому что я установил, что моя игра работает только в ландшафте. Решение: инициализировать сцену в viewDidLayoutSubviews instend of viewDidLoad

- (void)viewDidLayoutSubviews
{
 [super viewDidLayoutSubviews];

 // Configure the view.
 SKView * skView = (SKView *)self.view;
 skView.showsFPS = YES;
 skView.showsNodeCount = YES;

 // Create and configure the scene.
 SKScene * scene = [Level sceneWithSize:skView.bounds.size];
 scene.scaleMode = SKSceneScaleModeAspectFill;

 // Present the scene.
 [skView presentScene:scene];
}

licensed under cc by-sa 3.0 with attribution.