SpriteKit定位和坐标系统

4
我在我的项目中有一个空的SKScene,我尝试按照以下方式将一个方块添加到场景中:
let blueBox = SKSpriteNode(color: UIColor.blueColor(),
                               size: CGSize(width: 100, height: 100))
blueBox.anchorPoint = CGPoint(x: 0, y: 0)
blueBox.position = CGPoint(x: 0, y: 0)
addChild(blueBox)

由于某种原因,该框未显示在屏幕上。如果我对定位坐标的理解是正确的,即anchorPoint为0,0,位置为0,0,则意味着“将点0,0视为蓝色框的左下角”。因此,我期望在屏幕的左下角看到一个蓝色框。然而,如果我像这样更改位置:

blueBox.position = CGPoint(x: 300, y: 0)

我能看到一个蓝色的框(在底部非常靠近左边缘)。就好像屏幕底部左侧坐标不是从x = 0开始,而是某个大约等于300的值。

有人能给我一点提示吗?正如你所看到的,我对SpriteKit相当陌生。

我第二个问题与SKScene中的bound和frame有关。我可以看到'self.size.width'确实与'self.frame.size.width'相同。同样,'self.size.height'与'self.size.height'相同(在我的模拟器中,宽度为1024,高度为768)。 然而,如果我使用self.view.bounds.size.width,则得到375。类似地,self.view.bounds.size.height给我667。 那么我的问题是,这个“view”(SKView)是如何在我的代码中设置的?我没有设置任何内容。

字面上是:

class GameScene: SKScene {

    override func didMoveToView(view: SKView) {
      // prints Optional(375.0) Optional(667.0)
      print("\(self.view?.bounds.size.width) \(self.view?.bounds.size.height)")

      // prints 1024.0 768.0
      print("\(self.size.width) \(self.size.height)")
    }
}

非常感谢您的帮助!以下是关于IT技术的内容:


我相信点(0,0)在屏幕的左上角。 - Pranav Wadhwa
@penatheboss 在SpriteKit中,(0,0)是左下角。 - Whirlwind
或许这是针对UIView的...感谢澄清。 - Pranav Wadhwa
2个回答

3

啊...好的...我找到了我的问题的答案(部分解决了)。 在我的项目中,我仍然有 GameScene.sks (这是由 Xcode 生成的新游戏项目)。

在我的 GameViewController 中,我按照以下方式构建了 GameScene:

GameScene(fileNamed: "GameScene")

如果我将其更改为:
GameScene(size: view.bounds.size)

然后一切都正常工作了。在我的didMoveToView中打印的大小现在是:

Optional(375.0) Optional(667.0)
375.0 667.0

正如我构建游戏场景时所使用的尺寸一样,这是可以预期的。然而,我对于这个“边界”尺寸仍有疑问。它是固定的吗?我正在 iPhone 6s 模拟器上运行...


1
没错。场景大小与视图大小不同。在Xcode 7中,默认情况下,场景从.sks文件加载,并且大小为1024x768。视图大小可能因实际设备而异。这就是你困惑的根源 ;) - Whirlwind

1
问题1的问题在于你的scaleMode。默认情况下,它是.AspectFill。这意味着场景的纵横比得到保留,并且屏幕尺寸最接近的部分将是裁剪发生的地方。你绘制盒子确实发生在(0,0),但(0,0)不是屏幕的底角,而是在裁剪的领域。
在开始游戏之前确定所需的scaleMode非常重要。你有四个选择:.AspectFill.AspectFit.Fill.ResizeFill。我已经讲解了.AspectFill.AspectFit则相反。最好的描述方式就像看DVD一样。电影的宽高比与监视器的宽高比不同,因此你会看到黑色边框。这就是这个模式的作用,保留场景的宽高比并添加黑色边框。而.Fill不保留宽高比,这将导致场景在屏幕上不成比例地缩放,所以如果你的场景是9:16,而设备是2:3,你最终会得到矮胖的版本。最后你可以使用.ResizeFill,它可以调整场景大小以适应视图。当你想要更大的屏幕来查看更多的游戏区域时,可以使用这种模式。
现在,在大多数情况下,你确实希望使用.AspectFill,并设计你的游戏以适应侧面的裁剪。我喜欢做的是进入sks文件,并将其大小更改为9:16的比率。这将允许所有手机无缺陷处理,但iPad和4s用户需要处理一些裁剪,但这很容易管理。
有一件事我从不建议做,就是像你现在所做的那样,将场景设置为视图的大小。当你想要进行未来更改时,你会发现自己遇到问题,所以我总是建议坚持使用sks文件,如果你想让场景成为视图大小,请使用.ResizeFillscaleMode
你的第二个问题已经得到了回答。场景边界与视图边界不同,你需要像这样可视化结构:
屏幕 -视图控制器 --视图 ---场景
每一个元素都可能拥有自己的坐标/大小,这取决于你如何布局你的应用程序。

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