首先
有个比较有意思的地方.创建一个场景有两种方式.
- 第一种: let scene = SKScene(fileNamed: "GameScene")!
- 第二种: let scene = GameScene() //GameScene是SKScene的子类
这两种方式都是创建一个场景
但是!!!,它们是有区别的,坐标系的参考就发生了变化.
-
第一种


-
第二种
直接let scene = GameScene(),这种创建方式的好处是不需要再附加一个.sks文件.但是坐标系为左下角为原点.
重要 : 后续所有代码都按照第二种方式创建场景!
图方便,不用创建sks文件`
以下以第一种来创建一个场景.
anchorPoint(锚点)
定义与节点位置对应的精灵中的点。
您可以在单位坐标空间中指定此属性的值。 默认值为(0.5,0.5)
这意味着精灵位于其位置的中心。
position(坐标)
节点在其父系坐标系中的位置。
默认值为(0.0,0.0)。
一直不理解,自己经过测试,发现一些比较有意思的地方.相对于UIKit的frame有点不一样.
- 在SKScene中,Scene的坐标系是固定的.中心点为原点.
这个坐标系是固定的,可以理解为绝对坐标系.也就是说,在scene中,所有的节点都是参考这样的一个坐标系来布局坐标和锚点

以下用代码尝试
- 创建两个大小不一样的节点(不设置坐标和锚点)
func createNode() {
let node = SKSpriteNode(color: UIColor.red, size: CGSize(width: 800, height: 800))
node.color = UIColor.red
let node2 = SKSpriteNode(color: UIColor.red, size: CGSize(width: 400, height: 400))
node2.color = UIColor.blue
self.addChild(node)
self.addChild(node2)
}

- 设置蓝色的节点的坐标(不设置锚点)
func createNode() {
let node = SKSpriteNode(color: UIColor.red, size: CGSize(width: 800, height: 800))
node.color = UIColor.red
let node2 = SKSpriteNode(color: UIColor.red, size: CGSize(width: 400, height: 400))
node2.color = UIColor.blue
node2.position = CGPoint(x: -1024, y: 0)
self.addChild(node)
self.addChild(node2)
}

- 设置蓝色的节点的锚点
func createNode() {
let node = SKSpriteNode(color: UIColor.red, size: CGSize(width: 800, height: 800))
node.color = UIColor.red
let node2 = SKSpriteNode(color: UIColor.red, size: CGSize(width: 400, height: 400))
node2.color = UIColor.blue
node2.anchorPoint = CGPoint(x: 0, y: 0.5)
node2.position = CGPoint(x: -1024, y: 0)
self.addChild(node)
self.addChild(node2)
}

小总结 :
1.简单的理解坐标和锚点的配合使用
2.要从scene的绝对坐标来考虑节点具体的位置.(我看资料都没有提到这个细节,要从scene来参考.)
以下以第二种来创建一个场景.
同样的代码创建.
let node = SKSpriteNode(color: UIColor.red, size: CGSize(width: 800, height: 800))
node.color = UIColor.red
let node2 = SKSpriteNode(color: UIColor.red, size: CGSize(width: 400, height: 400))
node2.color = UIColor.blue
self.addChild(node)
self.addChild(node2)


修改一下position来再次验证
node.position = CGPoint(x: 0, y: size.height * 0.5)

小总结 :
- 场景的坐标系变成了从左下角为起点了.
网友评论