SpriteKit支持多种设备方向

chr*_*hrs 4 device-orientation ios sprite-kit

我有一个SpriteKit游戏,我想支持所有方向.现在当我改变方向时,节点不会保持其位置.我使用SKSceneScaleModeResizeFill缩放,因为它将保持正确的精灵大小.

当我开始游戏时,游戏玩家就像这样定位在中间屏幕:

在此输入图像描述

然后当我旋转设备时,位置变为如下:

在此输入图像描述

这是我的视图控制器代码:

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    // Configure the view.
    SKView * skView = (SKView *)self.view;
    if (!skView.scene) {

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

        // Present the scene.
        [skView presentScene:scene];
    }
}
Run Code Online (Sandbox Code Playgroud)

我的场景代码:

-(id)initWithSize:(CGSize)size {    
    if (self = [super initWithSize:size]) {

        self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];

        //Add spaceship in the center of the view
        SKSpriteNode *spaceship = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship.png"];
        spaceship.position = CGPointMake(size.width/2, size.height/2);
        [spaceship setScale:.3];
        [self addChild:spaceship];

    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

ric*_*ter 10

在场景调整大小后,您的精灵保持其位置 - 您可以从屏幕截图中看到它与场景左下角保持相同的水平和垂直距离.问题是,在场景调整大小后,该绝对偏移表示场景中的不同相对位置.

Sprite Kit可以自动调整场景大小,但是场景调整大小后节点的相对位置不是它可以为你做的事情.对于如何以不同大小重新排列场景内容没有"正确答案",因为场景内容的排列是您的应用定义的内容.

didChangeSize:在你的SKScene子类中实现,并在那里放置你想要的任何逻辑来移动你的节点.

例如,您可以使用它来使节点将其位置保持为场景大小的相对比例,使用如下所示:

- (void)didChangeSize:(CGSize)oldSize {
    for (SKNode *node in self.children) {
        CGPoint newPosition;
        newPosition.x = node.position.x / oldSize.width * self.frame.size.width;
        newPosition.y = node.position.y / oldSize.height * self.frame.size.height;
        node.position = newPosition;
    }
}
Run Code Online (Sandbox Code Playgroud)

根据您场景中的内容以及您的安排,您可能不希望这样.例如,如果游戏场景的每个角落都有HUD元素,则可能需要它们与角落的固定偏移量,而不是场景大小的一部分.

  • 就我而言,方向更改不会触发 didChangeSize:。可能是操作系统更新吗?在 iOS 8.1 上执行此操作。 (2认同)