如何在所有设备中缩放到相同的距离?

时间:2016-07-07 04:39:12

标签: swift sprite-kit scale

我在不同的骰子中打开游戏时遇到问题,在6s iphone plus看起来中心的圆圈要大得多,也就是线上的小圆圈改变位置,我希望中心圆是相同的尺寸和小圆圈总是这一半在线。

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

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:2)

您可以像这样获得屏幕的宽度:

let screenSize: CGRect = UIScreen.mainScreen().bounds
let screenWidth = screenSize.width

然后将UI中的元素设置为screenWidth的一部分。例如:

let radius1:CGFloat = screenWidth/4
//this would always give you a radius that is one quarter of the screen width

我成功地使用过这种方法几次,希望它适合你。

答案 1 :(得分:0)

您的主要问题是您的场景模式设置为ResizeFill。这将导致您如此多的头痛,因为您必须自己进行所有缩放,因此圆圈在不同设备上的大小不同。使用缩放模式resizeFill还会影响物理引擎或fontSizes等您需要在每台设备上调整的内容。

我建议您使用场景比例模式.AspectFill,默认场景大小为1024 * 768(横向)或768 * 1024(纵向)。这与xCode默认游戏模板相同。

这样所有iPhone上的一切看起来都一模一样。在iPad上,顶部和底部会有更多的屏幕空间,您只需用背景覆盖。主要技巧是你从中心放置你的东西。

此外,您可以在资产目录中使用通用资产,一切看起来都很棒而且不会模糊。

您可能需要调整的唯一方法是,在iPad上,如果您需要在顶部/底部边缘上移动某些按钮,则可能需要向上/向下移动它们。

我强烈建议你考虑一下,因为我可以从使用比例模式的经验谈起ResizeFill非常糟糕。在我重写之前,我已经经历了2次游戏中的这种痛苦,因为它们在所有设备上都如此不一致,导致我在这个过程中出现如此多的错误。让我们不要谈论我浪费在所有设备上测试的时间,调整值直到感觉正确。

希望这有帮助。