【问题标题】:Adapting background to screen with SpriteKit使用 SpriteKit 使背景适应屏幕
【发布时间】:2015-05-05 19:10:26
【问题描述】:

我是 iOS 和 SpriteKit 开发的新手,我想制作一个仅在横向模式下具有滚动背景的小游戏。到目前为止,我已经让我的背景滚动,但我的问题是我不知道让背景图像正确适合视图/场景。

我有一个 2040x768 背景图像,但我可以将其更改为任意大小;我只是不知道要搭配哪个尺码才能让它合身。它在Images.xcassets 中为 1x。我已将其添加到我的视图中,如下所示。

class GameScene: SKScene {
    override func didMoveToView(view: SKView) {
        let backgroundTexture = SKTexture(imageNamed: "Background")
        let background = SKSpriteNode(texture: backgroundTexture)
        background.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame))
        self.addChild(background)
    }
}

结果是背景图像填满了屏幕,但图像的底部和顶部被截断 - 或者更确切地说是在屏幕“外部”。背景图像底部有草,但这不可见。场景的scaleMode 设置为AspectFill。如果我将其设置为AspectFit,则图像的整个高度都是可见的,但是场景的宽度会减小(如果我在这里使用了错误的术语,则左侧和右侧都可以看到黑色空间背景图像)。

另外,在我的代码中,我添加了一个 1px 高的矩形,没有任何精灵作为地面。我添加了一个物理对象,它应该掉到地上。问题是地面矩形被添加到屏幕“下方”。物体撞到地面时会很好地停下来;这只是不可见。我用多个坠落的物体进行了测试,它们相互堆叠,添加一对后,它们变得可见,这意味着地面确实在那里;它只是不在屏幕上。所以地面位于背景图像的底部,不在屏幕上。我认为这些信息可能有助于解释这种情况。这是我添加地面节点的方法。

var ground = SKNode()
ground.position = CGPointMake(0, 0)
ground.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(self.frame.size.width, 1))
ground.physicsBody!.dynamic = false
self.addChild(ground)

如何使整个背景图像可见并使其适应设备的屏幕尺寸?我尝试添加background.size = self.frame.size,这会使所有内容变小,但结果基本相同。我是否必须制作多个不同尺寸的背景副本?如果是这样,哪些尺寸,以及如何选择显示哪一个?我更喜欢动态解决方案,但我只想让它工作。

所以基本上我只需要我的整个背景图片来适应屏幕。只要垂直适合,那么如果不够宽(只要场景大小保持不变)通过保持纵横比就可以了,因为它是滚动背景,所以我可以在下一个添加一个水平到它。

可能有资源可以解释这一点,但我真的搜索了好几天并没有找到解决方案。请提供尽可能多的信息和细节。非常感谢您!

【问题讨论】:

    标签: ios sprite-kit


    【解决方案1】:

    很简单,给你场景的节点大小。

    background.size = CGSizeMake(self.frame.size.width, self.frame.size.height)
    

    您可以在 CGSizeMake 中更改节点大小。

    ground = CGSizeMake(self.frame.size.width, self.frame.size.height / 10)
    

    编辑:

    设置背景节点在中间

    background.position = CGPointMake(self.frame.size.width / 2, self.frame.size.height / 2)
    

    【讨论】:

    • 第一个不是和问题中的background.size = self.frame.size 一样吗?我的背景位置应该已经在问题代码的中心。无论如何,我尝试了你的变化,不幸的是结果是一样的。
    • 你需要改变这个:if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene { 对于这样的东西,在 Objective-c 中它看起来像这样:(我现在不知道 swift)MainMenuScene *scene = [MainMenuScene sceneWithSize:skView.bounds.size];
    • 非常感谢,成功了!我在 Swift 中这样做了:scene.size = skView.bounds.size 在实例化场景之后。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 2019-12-24
    • 2013-11-24
    相关资源
    最近更新 更多