背景图像大小精灵套装游戏

时间:2013-10-19 22:15:34

标签: ios iphone sprite-kit

我刚开始一个新的Sprite Kit项目,以了解如何使用它。我观看并阅读了很多教程,但没有教程可以解答我的问题/问题。

我想为我的iPhone 5S创建一个应用程序。因此屏幕尺寸为1136x640。我为我的应用程序创建了一个1136x640背景图像。但是,当我将图像添加到我的应用程序时,它可能会变大! iOS模拟器只显示图像的中间部分。

有人能说出我必须使用的屏幕尺寸以及原因吗?

非常感谢!

这是我从教程中复制的代码。 代码位于initWithSize方法的myScene.m文件中

        SKSpriteNode *background = [SKSpriteNode spriteNodeWithImageNamed:@"myBackground"];
    background.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame));

    [self addChild:background];

修改

我在谷歌搜索并发现了这个:

必须使用“viewWillLayoutSubviews”更改viewDidLoad方法。

以下是此方法:

    - (void)viewWillLayoutSubviews
    {
    [super viewWillLayoutSubviews];

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

    // Create and configure the scene.
    SKScene * scene = [MyScene sceneWithSize:CGSizeMake(skView.bounds.size.width*2,skView.bounds.size.height*2)];
    scene.scaleMode = SKSceneScaleModeAspectFill;

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

首先,scene = MySceneWithSize行是:

SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];

但它只是iPhone 5屏幕尺寸的一半(568x320)。所以我不得不加倍大小。有人知道为什么吗?

9 个答案:

答案 0 :(得分:29)

您当前问题的简短答案:

background.size = self.frame.size;

答案很长,有关其他方法的讨论......

场景以逻辑单位工作,而非物理像素(如其他帖子中所述)。

1旧版套件上的逻辑单位通常为1像素,较新套件/ iPad上为2像素。 这可能是5年内的4个像素。

在逻辑单元中工作可以保护您免受将来更改的大小的影响,并且应该帮助程序员 - 尽管这通常会让新手感到困惑。

获取图像以填充当前场景的最简单方法是将其大小设置为“逻辑单位”。不论它原来的大小。

这比使用SKActions更好(因为用户最终可能会看到它们,并且在动作完成之前不能依赖任何基于节点尺寸的计算),并且它已经完成了比缩放更好,因为缩放需要您知道原始图像尺寸。

您可以通过size属性执行此操作,或者如果您真的想制作动画,则可以执行此操作。

在场景中......

-(void)didMoveToView:(SKView *)view
{
    [super didMoveToView:view];

    SKSpriteNode* background = [SKSpriteNode spriteNodeWithImageNamed:@"myBackground"];
    background.size = self.frame.size;
    background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    [self addChild:background];
} 

或者,如果你的图像运行良好,就像在较高分辨率上一样,你可以将图像重命名为myBackground@2x.png,将其添加到你的项目中,你可能根本不需要调整大小,但是对于较低分辨率的设备,您还需要将其缩小50%,并将其保存为myBackground.png。

我总是将导入图像的大小设置为我想要的逻辑单位(或屏幕尺寸的百分比),以保持我的理智。

答案 1 :(得分:9)

我发现如果图像的大小与您要创建的节点尺寸不同,那么创建尺寸会有点滑稽(比如在非视网膜设备上使用视网膜图像或不正确的图像命名)。如果从图像创建纹理并使用以下内容设置纹理和节点大小,则可以缩放图像以进行填充:

SKTexture *backgroundTexture = [SKTexture textureWithImageNamed:@"MyImage.png"];
SKSpriteNode *background = [SKSpriteNode spriteNodeWithTexture:backgroundTexture size:self.view.frame.size];
background.position = (CGPoint) {CGRectGetMidX(self.view.frame), CGRectGetMidY(self.view.frame)};
[scene addChild:background];

如果这样可以解决您的问题,我不是百分之百确定,但这可能值得一试。

答案 2 :(得分:8)

此行以磅为单位返回大小,而不是像素。这是因为不同的设备具有不同的分辨率,但在点数上具有相同的大小。在非视网膜设备上,1个点是1个像素,在视网膜设备上,1个点是2个像素。这就是你从

获得这个尺码的原因
SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];

您不希望将场景的大小加倍,因为它只是我们屏幕的边界,看不见。

答案 3 :(得分:7)

您是否尝试在图片名称的末尾添加“@ 2x”?

答案 4 :(得分:3)

我基本上做了上面的答案但是我继续直接设置宽度和高度,这样我就不用担心它是否设置正确,当然我还需要检查一下有一个iPhone4用于完整的解决方案。

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

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

        CGSize tmpSize;
        tmpSize.width = 640;
        tmpSize.height = 1136;
        // Create and configure the scene
        SKScene * scene = [CreationScene sceneWithSize:tmpSize];

        scene.scaleMode = SKSceneScaleModeAspectFill;

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

答案 5 :(得分:2)

这对我有用。可以这样做吗?

//Set background image.
    SKSpriteNode *background = [SKSpriteNode spriteNodeWithImageNamed:@"myBackground.png"];
    background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    background.xScale = 0.5;
    background.yScale = 0.5;

    [self addChild:background];

答案 6 :(得分:2)

解决方案:

将此代码放入viewWillLayoutSubviews,而不是加载精灵的UIViewController的viewDidLoad。

  - (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

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

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

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

说明:这会创建一个大小作为视图边界的场景。但是,当调用viewDidLoad时,这是在视图添加到视图层次结构之前,因此它尚未响应布局更改。所以视图边界可能还不正确,这可能不是启动场景的最佳时间。

此答案复制自:http://www.raywenderlich.com/42699/spritekit-tutorial-for-beginners 归功于雷:)。

我在SKScene中使用了与你相同的代码,但没有这个解决方案,在UIViewController中提供了Ray,它提供了无法工作的场景。

答案 7 :(得分:2)

我确实使用了sprite作为背景。

    double escalax =        self.size.width/ sprite.size.width  ;
    double escalay =        self.size.height/ sprite.size.height  ;


    SKAction *mostrar = [SKAction scaleXTo:escalax y:escalay duration:0];

希望它有所帮助!

答案 8 :(得分:1)

我和你有同样的问题。经过几天的谷歌搜索和尝试,最后我得到了这个问题的关键。您可以尝试多次更改 scene.scaleMode ,直到达到您满意的大小。我昨晚发现了这个,所以如果你想了解更多,这里有一个链接

https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKScene_Ref/Reference/Reference.html#//apple_ref/doc/uid/TP40013024-CH1-DontLinkElementID_3