【问题标题】:Universal game position通用游戏位置
【发布时间】:2016-05-14 02:18:03
【问题描述】:

说明

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

这些是图片:




测试

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

  • iPhone 4s - 位置错误
  • iPhone 5/5s - 右侧位置(此处已设置)
  • iPhone 6/6s - 位置错误
  • iPhone 6+/6s+ - 位置错误
  • iPad 2 - 位置错误
  • iPad Air/iPad Air 2 - 位置错误
  • iPad Pro - 位置错误
  • iPad 视网膜 - 位置错误


通过单击下面的图像,您可以更好地了解发生了什么。


问题

基本上,我的问题是:我怎样才能使这个通用?我的意思是,我怎样才能使正方形定位在上面设备上的相同相对位置?


尝试


迈克尔·奥斯汀的尝试(下载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)
    }
}


蒂米·索伦森的尝试(下载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)
    }
}

方块不会在每台设备上定位在同一个位置,仅在设置了位置的设备上。下面我做了一个小对比。

【问题讨论】:

  • 仅供参考 - 您的 3x 图像需要为 150x150,而不是 200x200。请记住,3x 图像的宽度和高度是 1x 图像的 3 倍。
  • 对不起,我写得很快。实际上是 150x150
  • 每台设备上的同一个地方是什么意思?考虑到屏幕尺寸不同并且具有不同的纵横比,目前尚不清楚您希望定位如何工作。也许缺乏定义是问题的一部分?
  • 对不起,其实是同一个相对位置。我不知道,但让我们以 Flappy Bird 的鸟为例。鸟应该处于相同的相对位置,并且对于每个设备具有相同的相对大小。通过为每个节点使用这 3 个图像来解决这个大小“问题”(至少我认为它在我的测试项目中有效)。

标签: ios swift sprite-kit


【解决方案1】:

尝试以数学方式设置大小。使用 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)

【讨论】:

  • 我刚刚更新了我的帖子,对 self.bounds.width 和 self.bounds.height 进行了一些更改。我还看到我的 .sks 场景设置为 1024x768,但没有找到要更改的内容。如果设备的尺寸在每台设备上发生变化,我不能(至少我认为)设置比例。
  • 我从我的一个项目中添加了一些示例代码供您参考
  • 我尝试过这样做,但是当我在另一台设备上运行时它仍然在改变位置。我用这个尝试更新了代码。
  • 尺寸标准吗?
  • 标准是什么意思? 1x 为 50x50,2x 为 100x100,3x 为 150x150。
【解决方案2】:

这就是我放置对象的方式

 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)

在屏幕中间放置一些东西。

【讨论】:

  • 这也是我认为应该发生的事情,但我不知道为什么我的节点在与 iPhone 5/5s 不同的设备上运行时不在同一个地方(在哪里设置)。顺便说一句,我用一些可能有帮助的比较图像更新了我的问题=)
  • 它会移动一点,但因为 iPhone 屏幕的 1/4 与 iPad Pro 的 1/4 不同。
  • 但它应该在所有设备上处于相同的相对位置才能通用
  • 如果您希望它在每台设备上完全相同的位置,那么您需要为每台设备创建 cgpoints,然后检查用户正在使用的设备。那么它会是这样的if ipadPro == true { //use cgpoint for ipadpro }
  • 我就是这么想的。没有其他更简单的方法吗?否则我应该为所有节点(很多)和一些标签做它=(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多