这个 SpriteKit 设置中的坐标系有啥问题?

Posted

技术标签:

【中文标题】这个 SpriteKit 设置中的坐标系有啥问题?【英文标题】:What is wrong with the coordinate system in this SpriteKit setup?这个 SpriteKit 设置中的坐标系有什么问题? 【发布时间】:2013-12-31 14:05:04 【问题描述】:

我创建了一个 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];

你可以在左下角看到绿色方块:

在我看来,SpriteKit 坐标系是这样的,原点总是在中心。但在场景中,原点位于左下角。当我将子节点添加到 0,0 时,它也会出现在左下角。

当我添加一个 SKSpriteNode 并将其放置在场景中 0,0 时,它会出现在左下角。但它以左下角的场景原点为中心(向左剪掉一半,从底部剪掉一半)。

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

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

回顾:

当我在场景中的 0,0 处放置一个精灵时,它出现在底部 左,剪掉 50%(以原点为中心)。 当我将一个精灵定位在 0,0 的精灵中时,它会显示在精灵的中心。

是我的场景配置错误还是它的工作方式是这样的?

【问题讨论】:

【参考方案1】:

这就是它的工作方式。所有 OpenGL 视图(至少是 2D 视图)的原点位于左下角。

你的精灵的位置也是正确的。默认情况下,两者都位于 0,0。精灵的纹理是根据锚点因子相对于节点位置绘制的。默认值为 0.5,0.5 将纹理置于节点位置的中心。

您可以将场景的锚点更改为 0.5,0.5,这会将精灵移动到场景的中心。您也可以更改精灵的锚点,但不建议这样做,因为它会影响旋转、缩放、碰撞检测和子节点位置等内容。

【讨论】:

【参考方案2】:

您可以将此代码添加到 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)
    

【讨论】:

【参考方案3】:

我所做的是将要显示的 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)
    

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

【讨论】:

以上是关于这个 SpriteKit 设置中的坐标系有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

对 iOS 上 SpriteKit 中的坐标、帧和子节点感到困惑?

Spritekit - 屏幕坐标的底部

CAShapeLayer 和 SpriteKit

SpriteKit 和 Swift 中 SKSpriteNodes 的 setScale 和 size 有啥区别?

SpriteKit 中坐标空间之间的转换问题

使用 spritekit 检测释放滑动 swift 时的坐标 [关闭]