SpriteKit坐标系原点

时间:2014-06-17 16:47:29

标签: sprite-kit swift skspritenode

我一直在尝试使用Swift的SpriteKit框架在屏幕上放置节点,但是我无法找到原点的位置。我以为它是在左下角,但是当我把node3放在那里时,它似乎在某个地方不在屏幕上。只有node1出现在屏幕上,有人可以解释发生了什么吗?

class GameScene: SKScene {
    override func didMoveToView(view: SKView) {

    let node = SKSpriteNode(color: UIColor.greenColor(), size: CGSize(width: 50, height: 50))
    node.position = CGPoint(x:CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame))
    self.addChild(node)

    let node2 = SKSpriteNode(color: UIColor.orangeColor(), size: CGSize(width: 50, height: 50))
    node2.position = CGPoint(x: 200.0  , y: 200.0 as Double)
    self.addChild(node2)

    let node3 = SKSpriteNode(color: UIColor.redColor(), size: CGSize(width: 50, height: 50))
    node3.position = CGPoint(x: 0.0  , y: 0.0)
    self.addChild(node3)
}

SpriteKit模板具有以下视图配置:

        let skView = self.view as SKView

        /* 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)

enter image description here

3 个答案:

答案 0 :(得分:2)

如@ LearnCoco2D所述,视图和场景大小不匹配。要解决此问题,我将scene.scaleMode更改为ResizeFill并绘制了相对于视图而不是场景的所有矩形。

scene.scaleMode = .ResizeFill

答案 1 :(得分:1)

如果场景由 .anchorPoint 值定义,则坐标系的中心,默认情况下为 (0.5, 0.5),这意味着位置为 (x: 0, y: 0) 的子节点位于高度和场景框架宽度的一半。

那么左上角是(x: -scene.frame.width/2, y: scene.frame.height/2)

那么左下角是(x: -scene.frame.width/2, y: -scene.frame.height/2)

然后右上角是(x: scene.frame.width/2, y: scene.frame.height/2)

那么右下角是(x: scene.frame.width/2, y: -scene.frame.height/2);

如果把.anchorPoint改成(0, 0),原点会放在左下角等

在您的示例中,绿色节点从 CGRectGetMidXCGRectGetMidY 获取其位置,这恰好给出了 (0, 0),因此它被放置在场景的中心。

我不知道你场景的大小,位置为 (200, 200) 的橙色节点可能在屏幕外到 top-right。 ("y: 200.0 as Double" - 这里不需要 "as Double")。

位置为 (0, 0) 的红色节点与绿色节点的位置相同。由于您没有设置 zPosition,它被具有相同坐标和大小的绿色节点重叠。

答案 2 :(得分:0)

您在屏幕快照右下角的节点数表示您仅在场景中附加了1个节点。 您确定问题附带的代码是否与屏幕截图匹配?使用打印调用来详细说明调试控制台中节点的坐标。还测试一下节点是否存在

在更新中运行这样的方法

私有函数interateNodes(){

儿童中的儿童{      打印(儿童)   }

}