Ios 根据屏幕大小改变节点位置Swift/Sprite套件

Ios 根据屏幕大小改变节点位置Swift/Sprite套件,ios,xcode,swift,sprite-kit,swift2,Ios,Xcode,Swift,Sprite Kit,Swift2,我想根据屏幕大小更改节点的位置。例如,当我在iPhone4S上运行我的应用程序时,并不是所有的节点都能显示在屏幕上,因为我在开发应用程序时考虑到了iPhone6的尺寸。如何使节点根据其运行的设备重新定位?我知道我通常可以通过约束实现这一点,但我不知道如何在Sprite工具包中实现这一点。我在下面附上了一个屏幕截图 lblRocketCount.position = CGPoint(x: 100, y: 150) lblRocketCount.text = "Bullets: 30

我想根据屏幕大小更改节点的位置。例如,当我在iPhone4S上运行我的应用程序时,并不是所有的节点都能显示在屏幕上,因为我在开发应用程序时考虑到了iPhone6的尺寸。如何使节点根据其运行的设备重新定位?我知道我通常可以通过约束实现这一点,但我不知道如何在Sprite工具包中实现这一点。我在下面附上了一个屏幕截图

    lblRocketCount.position = CGPoint(x: 100, y: 150)
    lblRocketCount.text = "Bullets: 30"
    self.addChild(lblRocketCount)

    lblMissileCount.position = CGPoint(x: -100, y: 150)
    lblMissileCount.text = "Missiles: 5"
    self.addChild(lblMissileCount)


    leftBorder.position = CGPoint(x: -333, y: 0)
    self.addChild(leftBorder)

    rightBorder.position = CGPoint(x: 333, y: 0)
    self.addChild(rightBorder)

    topBorder.position = CGPoint(x: 0, y: 187)
    self.addChild(topBorder)

    bottomBorder.position = CGPoint(x: 0, y: -187)
    self.addChild(bottomBorder)

    buttonDirUp.position = CGPoint(x: -200, y: -50)
    buttonDirUp.setScale(2.0)
    self.addChild(buttonDirUp)

    ship.setScale(0.33)
    shootButton.setScale(0.7)
    missileButton.setScale(0.5)


    buttonDirLeft.position = CGPoint(x: -250, y: -100)
    buttonDirLeft.setScale(2.0)
    self.addChild(buttonDirLeft)

    buttonDirDown.position = CGPoint(x: -200, y: -150)
    buttonDirDown.setScale(2.0)
    self.addChild(buttonDirDown)

    buttonDirRight.position = CGPoint(x: -150, y: -100)
    buttonDirRight.setScale(2.0)
    self.addChild(buttonDirRight)

    self.view?.multipleTouchEnabled = true

    self.backgroundColor = SKColor.blackColor()

    self.anchorPoint = CGPointMake(0.5, 0.5)

    self.addChild(base)
    base.position = CGPointMake(200, -100)

    self.addChild(ball)
    ball.position = base.position

    self.addChild(ship)
    ship.position = CGPoint(x: self.frame.midX, y: self.frame.midY)

    self.addChild(shootButton)
    shootButton.position = CGPoint(x: self.frame.midX, y: -100)

    self.addChild(missileButton)
    missileButton.position = CGPoint(x: -200, y: 50)

我发现这是一种处理多分辨率的有效方法。您需要在
GameViewController
中创建两个反映当前视图大小的全局变量:

import SpriteKit


// global variables
var SKViewSize: CGSize?
var SKViewSizeRect: CGRect?


class GameViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let skView = self.view as! SKView
        SKViewSize = skView.bounds.size
        let scene = GameScene(size: SKViewSize!)

        scene.scaleMode = .AspectFill
        skView.presentScene(scene)
        SKViewSizeRect = getViewSizeRect()
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        SKViewSize = self.view.bounds.size
        SKViewSizeRect = getViewSizeRect()

        let skView = self.view as! SKView
        if let scene = skView.scene {
            if scene.size != self.view.bounds.size {
                scene.size = self.view.bounds.size
            }
        }
    }

    func getViewSizeRect() -> CGRect {
        return CGRect(x: ((SKViewSize!.width  * 0.5) * -1.0), y: ((SKViewSize!.height * 0.5) * -1.0), width: SKViewSize!.width, height: SKViewSize!.height)
    }
}
然后为所有
SKNode
类型创建一个扩展,允许您使用当前屏幕大小的百分比来定位它们:

public extension SKNode {

    public func posByScreen(x: CGFloat, y: CGFloat) {
        self.position = CGPoint(x: CGFloat((SKViewSizeRect!.width * x) + SKViewSizeRect!.origin.x), y: CGFloat((SKViewSizeRect!.height * y) + SKViewSizeRect!.origin.y))
    }
}
例如,要创建一个精灵节点并使其在任何屏幕大小上居中,您可以在
游戏场景中使用它:

let sprite = SKSpriteNode(color: SKColor.whiteColor(), size: CGSizeMake(32, 32))
addChild(sprite)
sprite.posByScreen(0.5, y: 0.5)

我发现这是一种处理多重分辨率的有效方法。您需要在
GameViewController
中创建两个反映当前视图大小的全局变量:

import SpriteKit


// global variables
var SKViewSize: CGSize?
var SKViewSizeRect: CGRect?


class GameViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let skView = self.view as! SKView
        SKViewSize = skView.bounds.size
        let scene = GameScene(size: SKViewSize!)

        scene.scaleMode = .AspectFill
        skView.presentScene(scene)
        SKViewSizeRect = getViewSizeRect()
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        SKViewSize = self.view.bounds.size
        SKViewSizeRect = getViewSizeRect()

        let skView = self.view as! SKView
        if let scene = skView.scene {
            if scene.size != self.view.bounds.size {
                scene.size = self.view.bounds.size
            }
        }
    }

    func getViewSizeRect() -> CGRect {
        return CGRect(x: ((SKViewSize!.width  * 0.5) * -1.0), y: ((SKViewSize!.height * 0.5) * -1.0), width: SKViewSize!.width, height: SKViewSize!.height)
    }
}
然后为所有
SKNode
类型创建一个扩展,允许您使用当前屏幕大小的百分比来定位它们:

public extension SKNode {

    public func posByScreen(x: CGFloat, y: CGFloat) {
        self.position = CGPoint(x: CGFloat((SKViewSizeRect!.width * x) + SKViewSizeRect!.origin.x), y: CGFloat((SKViewSizeRect!.height * y) + SKViewSizeRect!.origin.y))
    }
}
例如,要创建一个精灵节点并使其在任何屏幕大小上居中,您可以在
游戏场景中使用它:

let sprite = SKSpriteNode(color: SKColor.whiteColor(), size: CGSizeMake(32, 32))
addChild(sprite)
sprite.posByScreen(0.5, y: 0.5)

对于你所寻找的东西,没有简单的答案,你首先需要决定你的游戏在不同的纵横比下应该是什么样子,并围绕这一点制定计划。在很多情况下,你只想给16:9的手机更多的视野(他们可以看到更多的游戏世界)。为此,请使用两层设计游戏:游戏层和hud覆盖层

游戏层将利用.AspectFill使您的游戏在不同设备上保持相同的“大小”,iPhone 4s玩家将无法看到其上方和下方的部分屏幕(您可以通过移动游戏层节点位置来调整他们丢失部分屏幕的位置)

HUD覆盖层将处理需要保持在屏幕上固定位置的东西,如按钮和生活条。现在,你可以像一些人提到的那样使用基于%的坐标,或者你可以保留绝对坐标,如果你的游戏检测到3:2(或者如果你想要iPad的话,4:3)的比例,只需从覆盖节点中添加/减去像素差

基本原则:(不要照搬废话)

假设我们创建一个160x284点的游戏场景

这意味着在iPhone4S上,我们的分辨率是320x480,纵横比填充将取上/下或左/右之间的最小距离,并缩放到该距离。在我们的例子中,160将扩展到320,284将扩展到568。哦,iphone只有480,所以你损失了88像素,这意味着在游戏世界中我们损失了44分

//这意味着顶部和底部将各损失22分,所以让我们来看看我们的iphone4s

class GameScene
{
  let gameNode = SKNode();
  let overlayNode = SKNode();
  let iPhone4sPadding = 22;
  func init()
  {
     //add all of the games nodes that you would add to the scene to gameNode instead
      self.addChild(gameNode);

     //add all of your overlay nodes (buttons, lifebars, etc) to the overlayNode

     //do a check on uiscreen to see if the height is 480, if it is
     //  all nodes on the bottom add iphone4spadding to the y
     //  all nodes on the top subtract iphone4spadding from the y
     self.addChild(overlayNode);

  }
}

对于你所寻找的东西,没有简单的答案,你首先需要决定你的游戏在不同的纵横比下应该是什么样子,并围绕这一点制定计划。在很多情况下,你只想给16:9的手机更多的视野(他们可以看到更多的游戏世界)。为此,请使用两层设计游戏:游戏层和hud覆盖层

游戏层将利用.AspectFill使您的游戏在不同设备上保持相同的“大小”,iPhone 4s玩家将无法看到其上方和下方的部分屏幕(您可以通过移动游戏层节点位置来调整他们丢失部分屏幕的位置)

HUD覆盖层将处理需要保持在屏幕上固定位置的东西,如按钮和生活条。现在,你可以像一些人提到的那样使用基于%的坐标,或者你可以保留绝对坐标,如果你的游戏检测到3:2(或者如果你想要iPad的话,4:3)的比例,只需从覆盖节点中添加/减去像素差

基本原则:(不要照搬废话)

假设我们创建一个160x284点的游戏场景

这意味着在iPhone4S上,我们的分辨率是320x480,纵横比填充将取上/下或左/右之间的最小距离,并缩放到该距离。在我们的例子中,160将扩展到320,284将扩展到568。哦,iphone只有480,所以你损失了88像素,这意味着在游戏世界中我们损失了44分

//这意味着顶部和底部将各损失22分,所以让我们来看看我们的iphone4s

class GameScene
{
  let gameNode = SKNode();
  let overlayNode = SKNode();
  let iPhone4sPadding = 22;
  func init()
  {
     //add all of the games nodes that you would add to the scene to gameNode instead
      self.addChild(gameNode);

     //add all of your overlay nodes (buttons, lifebars, etc) to the overlayNode

     //do a check on uiscreen to see if the height is 480, if it is
     //  all nodes on the bottom add iphone4spadding to the y
     //  all nodes on the top subtract iphone4spadding from the y
     self.addChild(overlayNode);

  }
}

只需将硬编码的绝对值更改为以屏幕宽度或高度百分比表示的相对值。看起来你可以表达一些相对于其他人而不是屏幕的关系。@Alfiehansen你能给我举个例子吗?我不确定我是否理解你的意思@AlfieHanssen@AlfieHanssen你能解释一下你的意思吗?把你的硬编码绝对值改成相对值,表示为屏幕宽度或高度的百分比。看起来你可以表达一些相对于其他人而不是屏幕的关系。@Alfiehansen你能给我举个例子吗?我不确定我是否理解你的意思@AlfieHanssen@AlfieHanssen你能解释一下你的意思吗。你能用我的一个维度给我举个例子吗?这实际上改变了4s和5~之间的游戏玩法,因为两台设备之间的精灵大小相同,碰撞在4s上比在5上发生的更多,因为4sHow上的空间更少。我知道改变它的百分比吗?有趣。你能用我的一个维度给我举个例子吗?这实际上改变了4s和5~之间的游戏,因为两台设备之间的精灵大小相同,所以4s比5更容易发生碰撞,因为4sHow的空间更小