Ios 背景图像大小的精灵工具包游戏

Ios 背景图像大小的精灵工具包游戏,ios,iphone,sprite-kit,Ios,Iphone,Sprite Kit,我刚开始一个新的精灵工具包项目,学习如何使用它。我看了很多教程,但没有一个教程能回答我的问题 我想为我的iphone5s创建一个应用程序。因此,屏幕大小为1136x640。我为我的应用程序创建了一个1136x640背景图像。但是当我把图片添加到我的应用程序中时,它会变得越来越大!iOS模拟器只显示图像的中间部分 有人能告诉我我必须使用的屏幕尺寸和原因吗 非常感谢 下面是我从教程中复制的代码。 代码位于initWithSize方法的myScene.m文件中 SKSpriteNode

我刚开始一个新的精灵工具包项目,学习如何使用它。我看了很多教程,但没有一个教程能回答我的问题

我想为我的iphone5s创建一个应用程序。因此,屏幕大小为1136x640。我为我的应用程序创建了一个1136x640背景图像。但是当我把图片添加到我的应用程序中时,它会变得越来越大!iOS模拟器只显示图像的中间部分

有人能告诉我我必须使用的屏幕尺寸和原因吗

非常感谢

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

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

    [self addChild:background];
编辑

我在谷歌上搜索发现:

viewDidLoad方法必须更改为“viewWillLayoutSubviews”

以下是这个方法:

    - (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];

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

这行返回的是点的大小,而不是像素。这是因为不同的设备具有不同的分辨率,但点的大小相同。在非视网膜设备上,1点为1像素,在视网膜设备上,1点为2像素。这就是为什么你从我这里得到这个尺寸

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

您不想将场景的大小增加一倍,因为它只是屏幕的边界,不可见。

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

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

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];

我不能100%确定这是否能解决您的问题,但这可能值得一试。

这对我来说很有效。这样做可以吗

//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];
解决方案:

将此代码放入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时,这是在视图添加到视图层次结构之前,因此它尚未响应布局更改。因此视图边界可能还不正确,并且这可能不是启动场景的最佳时间

此答案摘自: 这归功于雷:)


我和你一样在我的SKScene中使用了相同的代码,但是如果没有UIViewController中提供的这个解决方案,它将无法工作。

我基本上按照上面的答案做,但是我继续直接设置宽度和高度,这样我就不必担心设置是否正确,当然,我还需要检查是否有使用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];
    }
}

我确实使用了和精灵作为背景

    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];

希望有帮助

我和你有同样的问题。经过几天的谷歌搜索和尝试,我终于找到了这个问题的答案。您可以尝试多次更改场景.scaleMode,直到达到您满意的大小。我昨晚才发现这个,如果你想知道更多,这里有一个链接


你眼前问题的简短答案:

background.size = self.frame.size;
长答案,以及关于其他方法的讨论…

场景以逻辑单位工作,而不是物理像素(如其他文章所述)

1个逻辑单元通常在旧套件上为1像素,在新套件/iPad上为2像素。 这可能在5年内达到4像素

在逻辑单元中工作可以保护您不受将来大小变化的影响,并且可以帮助程序员——尽管这常常会让新手感到困惑

获取图像以填充当前场景的最简单方法是以“逻辑单位”设置其大小,而不管其最初的大小如何

这比使用SKActions要好(因为用户最终可能会看到它们,并且在操作完成之前,无法依赖基于节点维度的任何计算),而且这比缩放要好,因为缩放要求您知道原始图像维度

可以通过“大小”属性执行此操作,如果确实要制作动画,也可以通过动作执行此操作

在场景中简单地

-(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


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

我认为这可能只适用于Xcode 5,但Xcode可以自动描述您使用的图像分辨率。如果您同时使用2x和标准,它通常只会选择2x作为automaticThis。另外,试着在真实的设备上,而不是模拟器上。只是想一想:如果你想为你的手机制作一个应用程序,你真的应该主要在你的手机上测试它。以我微薄的经验来看,模拟机往往是一个痛苦的来源。迈克-如果你仍然如此,你能在下面标出正确/最有用的答案吗。我有偏见,但我认为我的是;-)@Gilesey-对不起。。完全忘了这条线。当然你的答案行得通。很抱歉打扰你。。。但我很好奇。。。使用SKTexture而不是仅对图像执行类似操作有何原因/好处/优势:SKSpriteNode*bgImage=[SKSpriteNode spriteNodeWithImageNamed:@“background”];当我去年玩SpritKit时,我发现[SkSpritenodeSpritenodeWithimageNamed:@“background”];不会将图像缩放到指定的SKSprideNode大小(例如,如果我的图像是20x20,它将为n