我正在iPhone 5s中构建游戏,但现在我想让它变得通用,因此它可以在所有iPhone(或至少4s)和所有iPad(或至少iPad 2)中运行。<登记/>
到目前为止,我几乎创造了这3张图片(1x,2x和3x)。所以有50x50平方(@ 1x),100x100平方(@ 2x)和150x150平方(@ 3x)。
这是我正在测试的示例项目(下载here):
import SpriteKit
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
/* Setup your scene here */
scene!.scaleMode = SKSceneScaleMode.ResizeFill //usually at GameViewController, not GameScene
let square = SKSpriteNode(imageNamed: "square")
square.anchorPoint = CGPointZero
square.position = CGPoint(x: self.frame.width / 1.095, y: self.frame.height / 1.1875) //superior right on iPhone 5/5s
addChild(square)
}
}
这些是图像:
当我在每台设备上运行时,会发生这种情况:
基本上,我的问题是:我怎样才能使这种普遍性?我的意思是,如何将方块放在上面设备的相同位置?
Michael Austin的尝试(下载here)
import SpriteKit
// MARK: Screen Dimensions
let screenWidth = CGFloat(1024)
let screenHeight = CGFloat(768)
// MARK: Node Sizes
let square = SKSpriteNode(imageNamed: "square")
let nodeConstantWidth = screenWidth/square.size.width * 0.088
let nodeConstantHeight = screenHeight/square.size.height * 0.158
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
/* Setup your scene here */
scene!.scaleMode = SKSceneScaleMode.Fill //usually at GameViewController, not GameScene
square.xScale = nodeConstantWidth
square.yScale = nodeConstantHeight
square.anchorPoint = CGPointZero
square.position = CGPoint(x: screenWidth / 1.5, y: screenHeight / 1.5)
addChild(square)
}
}
Timmy Sorensen的尝试(下载here)
import SpriteKit
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
/* Setup your scene here */
scene!.scaleMode = SKSceneScaleMode.ResizeFill //usually at GameViewController, not GameScene
let square = SKSpriteNode(imageNamed: "square")
square.anchorPoint = CGPointZero
square.position = CGPoint(x: self.frame.width / 1.095, y: self.frame.height / 1.1875) //superior right on iPhone 5/5s
addChild(square)
}
}
答案 0 :(得分:2)
尝试以数学方式设置大小。使用UIScreen.mainScreen()。bounds.width和UIScreen.mainScreen()。bounds.height查找设备大小。使用一点数学来设置.sks场景和设备大小之间的比例。然后使用node.setScale设置Sprite的比例
以下是一些示例代码。将这些声明为通用常量:
// MARK: Screen Dimensions
let screenSize = UIScreen.mainScreen().bounds
let screenWidth = screenSize.size.width
let screenHeight = screenSize.size.height
// MARK: Node Sizes
let node = SKSpriteNode(imageNamed: "image")
let nodeConstantWidth = screenWidth/node.size.width*0.3
如果要将nodeConstantWidth的声明移动到GameScene,它将在每次渲染场景时不断缩放。为了避免这种情况,我们只是普遍宣布它。在数学上,上面的等式将节点的宽度设置为任何设备上屏幕宽度的30%,并且将相应地计算高度。将“0.3”更改为任意数字以进行调整。然后在GameScene:
node.setScale(nodeConstantWidth)
答案 1 :(得分:0)
这就是我放置对象的方式
scoreLbl.position = CGPoint(x: scene!.frame.width / 2, y: scene!.frame.height / 1.3)
airDefense.positon = CGPoint(x: frame.size.width / 2, y: frame.size.height / 5
这会占用屏幕并将其分开,因此无论屏幕有多大,它都会在同一个地方。
与使用
相同CGPoint(x: self.frame.width / 2, y: self.frame.height / 2)
将某些东西放在屏幕中间。