Swift:定位SKCameraNode的孩子

时间:2017-01-15 11:39:58

标签: ios swift sprite-kit skspritenode skcameranode

上下文

  • 有一个光标(就像你的鼠标一样)SKSpriteNode
  • cam SKCameraNode并且是光标的子节点(即光标所在的位置,因此在摄像机后面)。
  • cam 故意不以光标为中心;相反,它是偏移的,因此光标出现在视图的顶部,并且
  • 下方仍有空白区域

下面给出一个简单的示意图 enter image description here

目标: 目标是两个精灵添加到摄像机视图的左下角和右下角。精灵将成为相机的孩子,因此他们总是留在视野中。

问题

如何将精灵定位在相机的角落,尤其是SKSpriteNode 具有anchorPoint属性(作为SKSpriteNode通常有,让我将相机作为孩子偏移到光标处?)

注意:可以将SKSpriteNode放在GameScene上,然后拨打.move(toParent: SKNode),这样可以让您关闭,但也会对SKSpriteNode的位置和比例感到困惑小号

var cam: SKCameraNode!
let cursor = SKSpriteNode(imageNamed: "cursor")

    override func didMove(to view: SKView) {

        // Set up the cursor
        cursor.setScale(spriteScale)
        cursor.position = CGPoint(x: self.frame.midX, y: raisedPositioning)
        cursor.anchorPoint = CGPoint(x:0.5, y:0.5)
        cursor.zPosition = CGFloat(10)
        addChild(cursor)

        // Set up the camera
        cam = SKCameraNode()
        self.camera = cam
        cam.setScale(15.0)

        // Camera is child of Cursor so that the camera follows the cursor
        cam.position = CGPoint(x: cursor.size.width/2, y: -(cursor.size.height * 4))
        cursor.addChild(cam)

        // Add another sprite here and make it child to cursor
        ...

2 个答案:

答案 0 :(得分:2)

cameraNode没有大小,但您可以使用frame属性获取当前屏幕大小

frame.size

然后您可以相应地定位您的节点,例如,如果您想将yournode的中心放在左角,则将位置设置为:

yournode.position.x = 0
yournode.position.y = frame.size.height

答案 1 :(得分:0)

这最好通过"虚拟节点"来解决。充当相机的屏幕空间坐标系统。

将此虚拟节点放在相机视图的正中心位置,作为相机的一个孩子,在您感到满意的z位置。

<强> ...from SKCameraNode docs page:

  

渲染场景,以便将摄像机节点的原点放在

中      

场景的中间。

将相对于相机要保留的所有HUD元素和其他图形和对象附加到此虚拟对象,在相对于相机的#34;#34中有意义的坐标系中;视角&#34;,这是它的视角。

...from a little further down the SKCameraNode docs page:

  

相机的视口大小与场景的视口大小相同   (由场景的大小属性决定)并且场景仍然是   当它被渲染到视图中时,由scaleMode属性缩放。

每当相机移动时,它会移动虚拟对象,虚拟对象的所有子对象都会随虚拟对象一起移动。

这种方法的最大优点是可以摇动或以其他方式移动虚拟物体,以创建指示运动和爆炸的视觉效果。但也是一个整洁的系统,以便从视野中删除。