【问题标题】:SpriteKit: What's up with the coordinate system?SpriteKit:坐标系怎么了?
【发布时间】:2015-10-08 15:07:46
【问题描述】:

我正在通过编写一个简单的游戏来自学如何进行 SpriteKit 编程,该游戏需要我在横向场景的左侧布置一个方形“游戏场”。我只是使用在 XCode 中创建新的 SpriteKit“游戏”项目时获得的 1024x768 库存视图 - 没什么特别的。然而,当我在didMoveToView() 中设置游戏场时,我发现坐标系有点奇怪。首先,我希望我必须将电路板放置在 (0, 0) 位置,它才能出现在左下角。并非如此——事实证明,游戏板必须在 y 方向上增加约 96 个像素才能工作。所以我最终得到了这个奇怪的代码:

    let gameFieldOrigin = CGPoint(x:0, y:96) // ???
    let gameFieldSize = CGSize(width:560, height: 560)
    let gameField = CGRect(origin: gameFieldOrigin, size: gameFieldSize)

    gameBorder = SKShapeNode(rect: gameField)
    gameBorder.strokeColor = UIColor.redColor()
    gameBorder.lineWidth = 0.1

    self.addChild(gameBorder) // "self" is the SKScene subclass GameScene

此外,当我向其中添加一个孩子(一个在场地内弹跳的球)时,我假设我只会使用相对坐标将其放置在中心。但是,我最终不得不使用“绝对”坐标,并且不得不再次将 y 坐标偏移 96。

我注意到的另一件事是,当我调用 touch.locationInNode(gameBorder) 时,坐标再次与边界无关,而是从边界底部的 (0, 96) 开始,而不是像我想的那样 (0, 0)猜到了。

那么我在这里错过了什么?我是否误解了有关坐标如何工作的基本知识?

[PS:我想在这个问题中添加标签“SpriteKit”,但我没有足够的代表。 :/]

【问题讨论】:

    标签: ios swift sprite-kit


    【解决方案1】:

    您希望将整个屏幕作为坐标系进行引用,但实际上您是在从 GameScene.sks 加载的场景中设置所有内容。正确的做法是修改 GameViewController.swift 中的一行,以便将场景大小设置为与屏幕大小相同。像这样初始化场景大小,而不是从 .sks 文件中取消归档:

    let scene = GameScene(size: view.bounds.size)
    

    不要忘记删除 if 语句,因为我们不再需要它了。这样,(0, 0) 就在左下角了。

    放东西,例如aNode,在场景的中心,你可以设置它的位置:

    aNode.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));
    

    【讨论】:

    • 我认为这让我走上了正轨。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多