SpriteKit(1) - 坐标系

首先

有个比较有意思的地方.创建一个场景有两种方式.

  • 第一种: let scene = SKScene(fileNamed: "GameScene")!
  • 第二种: let scene = GameScene() //GameScene是SKScene的子类

这两种方式都是创建一个场景
但是!!!,它们是有区别的,坐标系的参考就发生了变化.

  • 第一种

scene为nil,因为没有.sks
sks文件的坐标系已经固定
  • 第二种

直接let scene = GameScene(),这种创建方式的好处是不需要再附加一个.sks文件.但是坐标系为左下角为原点.

重要 : 后续所有代码都按照第二种方式创建场景!

图方便,不用创建sks文件`


以下以第一种来创建一个场景.

anchorPoint(锚点)

定义与节点位置对应的精灵中的点。
您可以在单位坐标空间中指定此属性的值。 默认值为(0.5,0.5)
这意味着精灵位于其位置的中心。

position(坐标)

节点在其父系坐标系中的位置。
默认值为(0.0,0.0)。

一直不理解,自己经过测试,发现一些比较有意思的地方.相对于UIKit的frame有点不一样.

  • 在SKScene中,Scene的坐标系是固定的.中心点为原点.
    这个坐标系是固定的,可以理解为绝对坐标系.也就是说,在scene中,所有的节点都是参考这样的一个坐标系来布局坐标和锚点
场景的坐标系.png

以下用代码尝试

  • 创建两个大小不一样的节点(不设置坐标和锚点)
    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)
    }
根据不同设备来看scene的frame,这里用的是iPhone6sp
  • 设置蓝色的节点的坐标(不设置锚点)
   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)
设备效果

Debug View Hierarchy方式查看

修改一下position来再次验证

node.position = CGPoint(x: 0, y: size.height * 0.5)
修改坐标(0,场景中间位置)

小总结 :

  • 场景的坐标系变成了从左下角为起点了.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容