通用游戏位置

时间:2016-05-14 02:18:03

标签: ios swift sprite-kit

说明

我正在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)
    }
}

这些是图像:

enter image description here enter image description here enter image description here

测试

当我在每台设备上运行时,会发生这种情况:

  • iPhone 4s - 错误的位置
  • iPhone 5 / 5s - 正确位置(此处已设置)
  • iPhone 6 / 6s - 错误的位置
  • iPhone 6 + / 6s + - 位置错误
  • iPad 2 - 错误的位置
  • iPad Air / iPad Air 2 - 位置错误
  • iPad Pro - 错误的位置
  • iPad Retina - 错误的位置


点击下面的图片,您可以更好地了解会发生什么。 enter image description here

问题

基本上,我的问题是:我怎样才能使这种普遍性?我的意思是,如何将方块放在上面设备的相同位置?

尝试


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

广场并非位于每台设备的同一位置,只能放置在设置位置的设备上。我在下面做了一点比较。 enter image description here

2 个答案:

答案 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)

将某些东西放在屏幕中间。