【问题标题】:Where is 0,0 in a GameScene using SpriteKit?使用 SpriteKit 的 GameScene 中的 0,0 在哪里?
【发布时间】:2015-05-25 19:18:00
【问题描述】:

我在将精灵定位到游戏场景中的正确点时遇到问题。据我阅读position and anchorpointspritekit programming guide 应该很清楚,0,0 在左下角。 我只使用横向模式。

但是当我使用我的代码时:

import SpriteKit

class GameScene: SKScene {

    override func didMoveToView(view: SKView) {
        var ground = createGround()
        self.addChild(ground)        
    }

    func createGround()->SKSpriteNode {
        var ground = SKSpriteNode(imageNamed: "ground.png")
        ground.name = "ground"
        ground.anchorPoint = CGPointMake(0, 0)
        ground.position = CGPointMake(0, 0)

        return ground
    }
}

而且我实现了相当标准的场景:

override func viewDidLoad() {
    super.viewDidLoad()

    if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
        // Configure the view.
        let skView = self.view as! SKView
        skView.showsFPS = true
        skView.showsNodeCount = true

        /* Sprite Kit applies additional optimizations to improve rendering performance */
        skView.ignoresSiblingOrder = true

        /* Set the scale mode to scale to fit the window */
        scene.scaleMode = .AspectFill

        skView.presentScene(scene)
    }
}

这是结果:

我的“ground.png”大小为 120x120。我仔细检查了场景锚点,它位于 (0,0),即使我在 didMoveToView 中将其设置为 (0,0),我仍然遇到同样的问题。

不知何故,Y 因子搞砸了。当我将地面位置设置为 (0,156) 时,它直接位于左下角。所以看起来游戏场景 y-anchor-point 是 -36 并且地面的锚点在左上角而不是左下角。任何线索为什么?

我找到了almost same problem,但框架看起来不错(0.0, 0.0, 1024.0, 768.0)。

【问题讨论】:

  • 我发现几乎相同的问题,但不知道这是否是一个好的解决方案,或者这是否对我有帮助。也许你应该试试这个解决方案,看看它是否对你有帮助。 ..
  • 它不会改变任何东西。我检查了 self.frame 及其 (0.0, 0.0, 1024.0, 768.0)。问题一定出在其他地方。
  • @Jurik 您发布的那个链接的答案几乎是正确的。如果在初始化场景之前检查 if(!skView.scene),使用 viewWillLayoutSubviews 是一个好方法,因为这个方法可以被多次调用(即在旋转设备时)。在 viewDidLoad 中,view 的最终大小还不知道,这也是很多开发者使用 viewWillLayoutSubviews 来初始化场景的原因。你能用你当前如何在视图控制器中初始化场景来更新你的问题吗?
  • @Whirlwind 完成!但是你对 viewWillLayoutSubviews 是什么意思?因为override func viewWillLayoutSubviews() 不起作用......对不起,我对这些东西真的很陌生。
  • “不工作”是什么意思?如果您向我提供您的代码示例,也许我可以告诉您那里是否一切正常...

标签: ios swift sprite-kit landscape


【解决方案1】:

(.5,.5) 的精灵锚点表示放置时它将通过其中心定位。因此,如果将其放在屏幕左下角,您将只能看到图像的上半部分和右半部分。

如果您希望图像完全适合左下角而不需要额外的数学运算,请将其锚点设置为:

sprite.anchorPoint = CGPointMake(0, 1)

【讨论】:

    【解决方案2】:

    这应该会有所帮助。

    func createGround()->SKSpriteNode {
        var ground = SKSpriteNode(imageNamed: "ground.png")
        ground.name = "ground"
    //  ground.anchorPoint = CGPointMake(0, 0) leave this at .5,.5
        ground.position = CGPointMake(ground.size.width/2, ground.size.height/2)
    
        return ground
    }
    

    然后改变你的场景比例。

    scene.scaleMode = .AspectFit
    

    如果您的场景是 1024 x 768 并设置为 AspectFill,则某些场景会被截断,这会使事情变得复杂。为获得最佳效果,请将您的场景大小设置为适合 iPhone 的大小,但在短期内,Aspect fit 将使整个场景都出现在屏幕上。无论哪种方式,在您将场景大小更改为 736 x 414(iPhone 6+)之前,您都会将其中的一部分截断或出现黑条

    因为地面的原点默认在中心,场景的原点在左下角,所以你需要将位置移动到地面宽度和高度的一半。

    希望这会有所帮助且有意义。

    【讨论】:

    • 当我从 viewDidLoad 切换到 viewWillLayoutSubviews 时,一切都按预期进行。我的问题是viewDidLoad 中的测量值以某种方式搞砸了。就像 Whirlwind 写的“在 viewDidLoad 中,视图的最终大小还不知道”
    猜你喜欢
    • 2015-09-14
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多