我的项目中有一个空白的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)
由于某种原因,该框不会出现在屏幕上。如果我对定位坐标的理解是正确的,锚点0,0和0,0的位置意味着"将点0,0视为蓝框"的左下角。所以我希望在屏幕左下方看到一个蓝色框。但是,如果我这样改变位置:
blueBox.position = CGPoint(x: 300, y: 0)
然后我可以看到蓝色的盒子(在底部,非常接近左边缘)。就好像屏幕左下方的坐标不是从x = 0开始,有些值大致相当于300.
有人能分享一些亮点吗?我对SpriteKit很新,你可以清楚地看到......
我的第二个问题是关于SKScene内部的边界和框架。我可以看到' 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。 所以我的问题是,这是怎样的观点' (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)")
}
}
再次,非常感谢您的帮助!
答案 0 :(得分: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
这是预期的,因为我构建了具有该维度的GameScene。我的问题是关于这个'界限的问题。仍然存在。它固定了吗?我在iPhone 6s上运行我的模拟器...
答案 1 :(得分:1)
问题1的问题是您的scaleMode
。默认情况下,它是.AspectFill
这意味着保留了场景的方面,并且最接近在一起的屏幕大小将是裁剪发生的位置。您对该框的绘制确实发生在(0,0),但是(0,0)不是屏幕的底角,它处于裁剪区域。
在开始游戏之前确定所需的scaleMode非常重要。您有4种选择,.AspectFill
,.AspectFit
,.Fill
和.ResizeFill
。我已经过了.AspectFill
,.AspectFit
正好相反。描述这个的最好方法就像看DVD一样。电影的方面与显示器的方面不同,因此你会得到黑条。这就是这样做,黑条在保留场景方面。 .Fill
不保留方面,这里会发生什么,场景会在屏幕上按比例缩放,所以如果你的场景是9:16而你的设备是2:3,你最终会缩短最初绘制的粗糙版本。最后你有.ResizeFill
,它的作用基本上就是你现在正在做的事情,它调整场景的大小以适应视图。如果您希望更大的屏幕可以看到更多的游戏区域,那么您可以使用此功能。
现在在大多数情况下,你确实想要.AspectFill
,并且你想设计你的游戏来解决两边的裁剪问题。我喜欢做的是进入sks文件,并将其大小改为9:16的比例。这将允许所有手机,但4s完美处理。 ipads和4s用户需要处理一些裁剪,但这很容易管理。
我从不推荐做的一件事就是你现在正在做的事情,将场景设置为视图的大小。当你想要进行未来的更改时,你会发现自己会遇到问题,因此我总是建议坚持使用sks文件,如果你想让场景成为视图大小,请使用.ResizeFill
scaleMode
。
您的第二个问题已经得到解答。场景边界与视图边界不同,您需要将结构可视化为:
屏幕
- 查看控制器
- 查看
---场景
根据您的应用布局方式,这些元素中的每一个都可能最终具有独立于其他元素的坐标/尺寸。