如何缩放以在所有设备中保持相同的距离?
How to scale to be at the same distance in all devices?
我在不同的设备上打开我的游戏时遇到问题,在 6s iphone 加上中心的圆圈看起来更大,而且在线上的小圆圈改变了位置,我想要那个中心圆是一样大的,小圆总是这一半在一条线上。
import SpriteKit
struct Circle {
var position:CGPoint
var radius:CGFloat
}
class GameScene: SKScene {
let node = SKNode()
let sprite = SKShapeNode(circleOfRadius: 6)
var rotation:CGFloat = CGFloat(M_PI)
var circles:[Circle] = []
var circuloFondo = SKSpriteNode()
var orbita = SKSpriteNode()
let padding2:CGFloat = 26.0
let padding3:CGFloat = 33.5
let padding5:CGFloat = 285.5
var circulo = SKSpriteNode()
override func didMoveToView(view: SKView) {
scaleMode = .ResizeFill
backgroundColor = UIColor(red: 0.3, green: 0.65, blue: 0.9, alpha: 1)
orbita = SKSpriteNode(imageNamed: "orbita2")
orbita.size = CGSize(width:view.frame.size.width - padding2 , height: view.frame.size.width - padding2)
orbita.color = UIColor.whiteColor()
orbita.colorBlendFactor = 1
orbita.alpha = 1
orbita.position = view.center
self.addChild(orbita)
orbita.zPosition = 3
circuloFondo = SKSpriteNode(imageNamed: "circuloFondo")
circuloFondo.size = CGSize(width:view.frame.size.width - padding5 , height: view.frame.size.width - padding5)
circuloFondo.color = UIColor.whiteColor()
circuloFondo.alpha = 1
circuloFondo.position = view.center
self.addChild(circuloFondo)
circuloFondo.zPosition = 0
let radius1:CGFloat = (view.frame.size.width - padding3)/2 - 1
let radius2:CGFloat = (view.frame.size.width - padding5)/2 + 6.5
circles.append(Circle(position: view.center, radius: radius1))
circles.append(Circle(position: view.center, radius: radius2))
addChild(node)
node.addChild(sprite)
if let circle = nextCircle() {
node.position = circle.position
sprite.fillColor = SKColor.whiteColor()
sprite.zPosition = 4.0
sprite.position = CGPoint(x:circle.radius, y:0)
rotate()
}
你可以这样获取屏幕的宽度:
let screenSize: CGRect = UIScreen.mainScreen().bounds
let screenWidth = screenSize.width
然后将 UI 中的元素设置为屏幕宽度的一部分。例如:
let radius1:CGFloat = screenWidth/4
//this would always give you a radius that is one quarter of the screen width
这个方法我用过几次都成功了,希望对你有用。
您的主要问题是您的场景模式设置为 ResizeFill。这会让您非常头疼,因为您必须自己进行所有缩放,因此圆圈在不同设备上的大小不同。使用缩放模式 resizeFill 也会影响诸如物理引擎或 fontSizes 之类的东西,您需要在每个设备上进行调整。
我建议您使用场景缩放模式 .AspectFill,默认场景大小为 1024*768(横向)或 768*1024(纵向)。这与 xCode 默认游戏模板相同。
这样一来,所有 iPhone 上的一切看起来都完全一样。在 iPad 上,顶部和底部的屏幕 space 会略多一些,您只需用背景覆盖即可。主要技巧是你从中心定位你的东西。
此外,您可以使用资源目录中的通用资源,一切看起来都很棒,不会模糊。
您可能需要为此调整的唯一一件事是,在 iPad 上,如果您希望它们位于 top/bottom 边缘,您可能需要移动一些按钮 up/down。
我强烈建议您考虑这一点,因为根据我的经验,使用缩放模式 ResizeFill 非常糟糕。在我重写它们之前,我已经经历了 2 款游戏的痛苦,因为它们在所有设备上都非常不一致,导致我在这个过程中出现了很多错误。更不用说我浪费在所有设备上的测试时间,调整值直到感觉合适。
希望对您有所帮助。
我在不同的设备上打开我的游戏时遇到问题,在 6s iphone 加上中心的圆圈看起来更大,而且在线上的小圆圈改变了位置,我想要那个中心圆是一样大的,小圆总是这一半在一条线上。
import SpriteKit
struct Circle {
var position:CGPoint
var radius:CGFloat
}
class GameScene: SKScene {
let node = SKNode()
let sprite = SKShapeNode(circleOfRadius: 6)
var rotation:CGFloat = CGFloat(M_PI)
var circles:[Circle] = []
var circuloFondo = SKSpriteNode()
var orbita = SKSpriteNode()
let padding2:CGFloat = 26.0
let padding3:CGFloat = 33.5
let padding5:CGFloat = 285.5
var circulo = SKSpriteNode()
override func didMoveToView(view: SKView) {
scaleMode = .ResizeFill
backgroundColor = UIColor(red: 0.3, green: 0.65, blue: 0.9, alpha: 1)
orbita = SKSpriteNode(imageNamed: "orbita2")
orbita.size = CGSize(width:view.frame.size.width - padding2 , height: view.frame.size.width - padding2)
orbita.color = UIColor.whiteColor()
orbita.colorBlendFactor = 1
orbita.alpha = 1
orbita.position = view.center
self.addChild(orbita)
orbita.zPosition = 3
circuloFondo = SKSpriteNode(imageNamed: "circuloFondo")
circuloFondo.size = CGSize(width:view.frame.size.width - padding5 , height: view.frame.size.width - padding5)
circuloFondo.color = UIColor.whiteColor()
circuloFondo.alpha = 1
circuloFondo.position = view.center
self.addChild(circuloFondo)
circuloFondo.zPosition = 0
let radius1:CGFloat = (view.frame.size.width - padding3)/2 - 1
let radius2:CGFloat = (view.frame.size.width - padding5)/2 + 6.5
circles.append(Circle(position: view.center, radius: radius1))
circles.append(Circle(position: view.center, radius: radius2))
addChild(node)
node.addChild(sprite)
if let circle = nextCircle() {
node.position = circle.position
sprite.fillColor = SKColor.whiteColor()
sprite.zPosition = 4.0
sprite.position = CGPoint(x:circle.radius, y:0)
rotate()
}
你可以这样获取屏幕的宽度:
let screenSize: CGRect = UIScreen.mainScreen().bounds
let screenWidth = screenSize.width
然后将 UI 中的元素设置为屏幕宽度的一部分。例如:
let radius1:CGFloat = screenWidth/4
//this would always give you a radius that is one quarter of the screen width
这个方法我用过几次都成功了,希望对你有用。
您的主要问题是您的场景模式设置为 ResizeFill。这会让您非常头疼,因为您必须自己进行所有缩放,因此圆圈在不同设备上的大小不同。使用缩放模式 resizeFill 也会影响诸如物理引擎或 fontSizes 之类的东西,您需要在每个设备上进行调整。
我建议您使用场景缩放模式 .AspectFill,默认场景大小为 1024*768(横向)或 768*1024(纵向)。这与 xCode 默认游戏模板相同。
这样一来,所有 iPhone 上的一切看起来都完全一样。在 iPad 上,顶部和底部的屏幕 space 会略多一些,您只需用背景覆盖即可。主要技巧是你从中心定位你的东西。
此外,您可以使用资源目录中的通用资源,一切看起来都很棒,不会模糊。
您可能需要为此调整的唯一一件事是,在 iPad 上,如果您希望它们位于 top/bottom 边缘,您可能需要移动一些按钮 up/down。
我强烈建议您考虑这一点,因为根据我的经验,使用缩放模式 ResizeFill 非常糟糕。在我重写它们之前,我已经经历了 2 款游戏的痛苦,因为它们在所有设备上都非常不一致,导致我在这个过程中出现了很多错误。更不用说我浪费在所有设备上的测试时间,调整值直到感觉合适。
希望对您有所帮助。