这个SpriteKit设置中的坐标系统出了什么问题?

11

我创建了一个 SKView,用它来展示一个 SKScene 的子类,代码如下:

SKView *skv = [[SKView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:skv];

self.skScene = [[TestScene alloc] initWithSize:v.bounds.size];
[skv presentScene:_skScene];

然后为了看到坐标系原点,我在场景中添加了一个小的10x10有颜色的正方形。

SKSpriteNode *ori = [SKSpriteNode spriteNodeWithColor:[UIColor greenColor] size:CGSizeMake(10,10)];
[self addChild:ori];

您可以在左下角看到绿色正方形:

green dot in lower left corner

据我所知,SpriteKit坐标系统的原点始终位于中心。但是在场景中,原点位于左下角。当我向{0,0}添加子节点时,它也会出现在左下角。

当我在场景中添加一个SKSpriteNode并将其定位为{0,0}时,它会出现在左下角。但它围绕左下角的场景原点居中(左侧和底部各切掉一半)。

但现在问题变得更加混乱。当我将SKSpriteNode添加到另一个SKSpriteNode中时,子精灵会在父精灵中居中。

这是否意味着场景坐标系统与精灵坐标系统的工作方式不同?

总结:

  • 当我在场景中将精灵定位为 {0,0} 时,它会出现在左下角,被截去 50%(围绕原点居中)。
  • 当我在精灵中将精灵定位为 {0,0} 时,它会出现在中心。

我的场景配置有问题还是这就是它的工作方式?

3个回答

17

它的工作方式如下。所有的OpenGL视图(至少是2D)都将其原点放在左下角。

你的精灵位置也是正确的。默认情况下,两个精灵都位于0,0处。精灵的纹理相对于节点位置绘制,根据anchorPoint因子进行调整。它的默认值为0.5,0.5,使纹理居中于节点位置。

您可以将场景的anchorPoint更改为0.5,0.5,这将将精灵移动到场景的中心。您还可以更改精灵的anchorPoint,但不推荐这样做,因为这会影响旋转、缩放、碰撞检测和子节点位置等方面。


3
你可以将以下代码添加到GameViewController.swift文件中:
override func viewDidLoad() {
        super.viewDidLoad()

        // Detect the screensize
        var sizeRect = UIScreen.mainScreen().applicationFrame
        var width = sizeRect.size.width * UIScreen.mainScreen().scale
        var height = sizeRect.size.height * UIScreen.mainScreen().scale

        // Scene should be shown in fullscreen mode
        let scene = GameScene(size: CGSizeMake(width, height))


        // Configure the view.
        let skView = self.view as! SKView
        skView.showsFPS = true
        skView.showsNodeCount = true

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

0
我所做的是将想要展示的 SKScene 的尺寸设置为你想要从中展示场景的 Viewcontroller 的 bounds.size。就像这样:
    if let scene = GameScene(fileNamed:"GameScene") {
        // Configure the view.
        let skView = self.view as! SKView
        skView.showsFPS = true
        skView.showsNodeCount = true

        /* Sprite Kit applies additional optimizations to improve rendering performance */
        skView.ignoresSiblingOrder = true
        scene.size = skView.bounds.size
        /* Set the scale mode to scale to fit the window */
        scene.scaleMode = .AspectFill

        skView.presentScene(scene)
    }

希望这对你也有用,如果我在这里犯了任何错误,请也让我知道 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接