1

上下文

  • 有一个光标(就像你的鼠标一样)SKSpriteNode
  • cam是 aSKCameraNode并且是光标的子项(即光标所在的位置,因此跟随相机)。
  • cam故意不以光标为中心;相反,它是偏移的,所以光标出现在视图的顶部,下面还有空白空间

下面给出一个简单的示意图 在此处输入图像描述

目标:目标是在相机视图的左下角和右下角添加两个精灵。精灵将是相机的孩子,因此它们始终保持在视野中。

问题

如何将精灵定位在相机的角落,特别是考虑到SKSpriteNode没有anchorPoint属性(通常有SKSpriteNode,这让我将相机作为一个孩子偏移到光标)?

注意:可以将SKSpriteNodes定位在GameScene然后调用.move(toParent: SKNode),这会让你更接近,但也会弄乱SKSpriteNodes的位置和比例

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
        ...
4

2 回答 2

2

cameraNode 没有大小,但是可以通过 frame 属性获取当前屏幕大小

frame.size

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

yournode.position.x = 0
yournode.position.y = frame.size.height
于 2017-01-15T22:09:04.867 回答
1

最好使用充当相机屏幕空间坐标系的“虚拟节点”来解决此问题。

将此虚拟节点放置在相机视图的确切中心,在您满意的 zPosition 上,作为相机的子节点。

...来自 SKCameraNode 文档页面:

渲染场景,以便将相机节点的原点放置在

场景的中间。

将所有 HUD 元素和您想要保留的其他图形和对象(相对于相机)附加到这个虚拟对象,在一个相对于相机“视角”(即其框架)有意义的坐标系中观点。

...从 SKCameraNode 文档页面再往下看:

相机的视口与场景的视口大小相同(由场景的 size 属性确定),并且场景在渲染到视图中时仍由其 scaleMode 属性进行缩放。

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

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

于 2017-01-15T17:20:00.223 回答