【问题标题】:SpriteKit Coordinate System OriginSpriteKit 坐标系原点
【发布时间】:2014-06-17 16:47:29
【问题描述】:

我一直在尝试使用带有 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)

【问题讨论】:

  • 尝试 200.f 和 200.f 而不是 200
  • 对不起,同样的结果:/
  • 原点在左下角。如果您得到不同的结果,请检查 scene.size 是否与您的视图和方向匹配,并检查应该设置为 aspect fit 或 resize fill 的 scene.scaleMode。
  • 您的第一个矩形(位于50,50)显示在您的视图中心。这可能意味着您的size 或scale 正在以某种方式转换视图,以便50,50` 位于中心。在这种情况下,0,0 和 200,200 不在屏幕上是有道理的。

标签: sprite-kit swift skspritenode


【解决方案1】:

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

scene.scaleMode = .ResizeFill

【讨论】:

  • 您好屏幕截图右下角的节点数显示您只有 1 个节点连接到场景。您确定您附加到问题的代码与屏幕截图相符吗?
【解决方案2】:

如果场景是由.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),原点会放在左下角等。

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

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

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

【讨论】:

    【解决方案3】:

    屏幕截图右下角的节点数显示您只有 1 个节点连接到场景。 您确定您附加到问题的代码与屏幕截图匹配吗?使用打印调用详细说明调试控制台中的节点坐标。还要测试节点是否存在

    在更新中运行这样的方法

    私有函数 interateNodes() {

    对于孩子中的孩子{ 打印(儿童) }

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      相关资源
      最近更新 更多