使用 SpriteKit 使背景适应屏幕
Adapting background to screen with SpriteKit
我是iOS和SpriteKit开发的新手,我想做一个只有横屏模式的滚动背景的小游戏。到目前为止,我的背景已经可以滚动了,但我的问题是我不知道如何让背景图像正确地适合 view/scene。
我有一张 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)
}
}
结果是背景图像填满了屏幕,但图像的底部和顶部被截断了 - 或者更确切地说 "outside" 屏幕。背景图像底部有草,但这不可见。场景的 scaleMode
设置为 AspectFill
。如果我将它设置为 AspectFit
,图像的整个高度是可见的,但是场景的宽度会减小(以防我在这里使用了错误的术语,黑色 space 是可见的在背景图片的左侧和右侧)。
此外,在我的代码中,我添加了一个 1px 高的矩形,没有任何精灵作为地面。我添加了一个应该掉到地上的物理对象。问题是在屏幕上添加了地面矩形 "below"。物体撞击地面时停止正常;这是不可见的。我用多个坠落物体对此进行了测试,它们相互堆叠,添加一对后,它们变得可见,这意味着地面确实存在;它只是不在屏幕上。所以地面在背景图像的底部,在屏幕之外。我认为这些信息可能有助于解释这种情况。这是我添加地面节点的方法。
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
,这会使所有内容变小,但结果基本相同。我是否必须制作多份不同尺寸的背景副本?如果是这样,显示哪些尺寸以及如何选择要显示的尺寸?我更喜欢动态解决方案,但我只是希望它能正常工作。
所以基本上我只需要我的整个背景图像适合屏幕。只要垂直合适,那么如果不够宽(只要场景大小保持不变)保持纵横比就可以了,因为是滚动背景,所以我可以接下来再添加一个水平。
可能有资源可以解释这一点,但我确实搜索了好几天,但没有找到解决方案。请提供尽可能多的信息和详细信息。非常感谢您!
很简单,给场景的节点大小。
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)
我是iOS和SpriteKit开发的新手,我想做一个只有横屏模式的滚动背景的小游戏。到目前为止,我的背景已经可以滚动了,但我的问题是我不知道如何让背景图像正确地适合 view/scene。
我有一张 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)
}
}
结果是背景图像填满了屏幕,但图像的底部和顶部被截断了 - 或者更确切地说 "outside" 屏幕。背景图像底部有草,但这不可见。场景的 scaleMode
设置为 AspectFill
。如果我将它设置为 AspectFit
,图像的整个高度是可见的,但是场景的宽度会减小(以防我在这里使用了错误的术语,黑色 space 是可见的在背景图片的左侧和右侧)。
此外,在我的代码中,我添加了一个 1px 高的矩形,没有任何精灵作为地面。我添加了一个应该掉到地上的物理对象。问题是在屏幕上添加了地面矩形 "below"。物体撞击地面时停止正常;这是不可见的。我用多个坠落物体对此进行了测试,它们相互堆叠,添加一对后,它们变得可见,这意味着地面确实存在;它只是不在屏幕上。所以地面在背景图像的底部,在屏幕之外。我认为这些信息可能有助于解释这种情况。这是我添加地面节点的方法。
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
,这会使所有内容变小,但结果基本相同。我是否必须制作多份不同尺寸的背景副本?如果是这样,显示哪些尺寸以及如何选择要显示的尺寸?我更喜欢动态解决方案,但我只是希望它能正常工作。
所以基本上我只需要我的整个背景图像适合屏幕。只要垂直合适,那么如果不够宽(只要场景大小保持不变)保持纵横比就可以了,因为是滚动背景,所以我可以接下来再添加一个水平。
可能有资源可以解释这一点,但我确实搜索了好几天,但没有找到解决方案。请提供尽可能多的信息和详细信息。非常感谢您!
很简单,给场景的节点大小。
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)