SpriteKit convertPointToView / convertPoint

时间:2016-07-07 23:15:01

标签: swift sprite-kit

问题无论相机位置如何,如何让紫色方块保持固定在屏幕的左下角?

详细信息我有一个名为colorScene的SKScene,它有一个摄像机节点和两个形状节点 - 一个蓝色和一个紫色方块。相机被限制在蓝色方块,位于0,0:

enter image description here

现在,我想把紫色方块放在屏幕的左下角。无论相机在哪里,我都希望它能留在那里。首先,我会将紫色方块作为相机节点的子项。但那又怎样?如果我将紫色方块定位在0,0,奇怪的是,它位于屏幕中间。 (相机节点不应该是整个屏幕区域吗?)如果我尝试使用convertPoint从摄像机节点转到场景坐标:

purpleNode?.position = convertPoint(CGPoint(x: 0, y: 0), toNode: cameraNode!) 

......事情变得更加神秘:

enter image description here

1 个答案:

答案 0 :(得分:0)

来自Apple文档:

  

渲染场景,使相机节点的原点位于场景的中间。

这应该解释你的经历

  

如果我将紫色方块定位在0,0,奇怪的是,它位于屏幕中间。 (不应该将摄像机节点作为整个屏幕区域吗?)

解决方案

由于我们要将purple放在屏幕的左下方,我们应该从与视图相关的坐标开始

let bottomLeftOfView = CGPoint(x: 0, y: view.frame.height)

接下来,我们需要将这些坐标从view转换为scene

purple.position = convertPointFromView(bottomLeftOfView)

这是完整的代码

class GameScene: SKScene {

    override func didMoveToView(view: SKView) {
        super.didMoveToView(view)
        let camera = SKCameraNode()
        self.camera = camera
        addChild(camera)
        let purple = SKSpriteNode(imageNamed: "square")
        purple.color = SKColor.purpleColor()
        purple.colorBlendFactor = 1

        let bottomLeftOfView = CGPoint(x: 0, y: view.frame.height)
        purple.position = convertPointFromView(bottomLeftOfView)
        camera.addChild(purple)
    }
}

enter image description here

紫色和锚定

purple精灵中只有四分之一在屏幕内。这是因为它的anchorpoint是(0.5,0.5):中心。所以我们告诉SpriteKit将purple的中心放在屏幕的角落。

为了让紫色完全进入屏幕,我们只需告诉SpriteKit使用bottom left corner of purple作为anchorpoint

purple.anchorPoint = CGPointZero

enter image description here

这是最终的完整代码

class GameScene: SKScene {

    override func didMoveToView(view: SKView) {
        super.didMoveToView(view)

        let camera = SKCameraNode()
        self.camera = camera
        addChild(camera)

        let purple = SKSpriteNode(imageNamed: "square")
        purple.color = SKColor.purpleColor()
        purple.colorBlendFactor = 1
        purple.anchorPoint = CGPointZero

        let bottomLeftOfView = CGPoint(x: 0, y: view.frame.height)
        purple.position = convertPointFromView(bottomLeftOfView)
        camera.addChild(purple)

    }
}