SpriteKit/SKScene: 如何从左上而不是左下绘制?
SpriteKit/SKScene: How to draw from top-left instead from bottom-left?
我们知道 SKScene
的原点在左下角。
但我尝试从一个包含 0 和 1 矩阵的文件中加载一个简单的关卡。虽然 0 什么都不是,但 1 表示一堵墙(简单的矩形)。
由于文件内容明显是从左上到右下,我想在场景中从左上开始画
但是我文件中的第一个角色是在场景的左下角绘制的。
我尝试将场景的 yScale 设置为 -1,希望它反转 y 轴,但这没有用。
最干净的方法是什么 SKScene
我总是从左上角开始画画?我仍然想将 anchorPoint
保持在 0.5,0.5。
所以从左上角开始绘图将位于 x=-widthOfScreen/2
和 y=heightOfScreen/2
由于 SKSpriteNode 允许您使用 -1 的比例翻转其内容,因此您可以将所有节点置于 yScale 为 -1 的主 SKSpriteNode 下。
final class GameScene: SKScene
{
var masterNode:SKSpriteNode! = nil
override func addChild(node: SKNode)
{
if masterNode == nil
{
masterNode = SKSpriteNode()
masterNode.position = CGPoint(x:0, y:size.height)
masterNode.anchorPoint = CGPointZero
masterNode.yScale = -1
super.addChild(masterNode)
}
masterNode.addChild(node)
}
}
请注意,您需要保持 masterNode 的 y 位置与视图大小对齐if/when 大小会发生变化。
我不确定这是否是您想要的,但如果您只想更改坐标系,您可以做的是为 CGPoint 创建一个扩展,例如
//CGPoint+SpriteKit.swift
extension CGPoint {
func flipCoordinates() -> CGPoint {
return CGPoint(x: x, y: UIScreen.mainScreen().bounds.height - y)
}
}
我认为这应该可行,因为你的锚点是 (0.5, 0.5)
类似于 Alain T 的回答,但使用 SKCameraNode
和 yScale = -1
,因此您不需要重写 addChild
函数或具有额外的节点层。
let localCamera = SKCameraNode()
override func didMove(to view: SKView) {
super.didMove(to: view)
localCamera.yScale = -1
localCamera.position = CGPoint(x: size.width/2, y: size.height/2)
addChild(localCamera)
self.camera = localCamera
// ...
}
我们知道 SKScene
的原点在左下角。
但我尝试从一个包含 0 和 1 矩阵的文件中加载一个简单的关卡。虽然 0 什么都不是,但 1 表示一堵墙(简单的矩形)。
由于文件内容明显是从左上到右下,我想在场景中从左上开始画
但是我文件中的第一个角色是在场景的左下角绘制的。 我尝试将场景的 yScale 设置为 -1,希望它反转 y 轴,但这没有用。
最干净的方法是什么 SKScene
我总是从左上角开始画画?我仍然想将 anchorPoint
保持在 0.5,0.5。
所以从左上角开始绘图将位于 x=-widthOfScreen/2
和 y=heightOfScreen/2
由于 SKSpriteNode 允许您使用 -1 的比例翻转其内容,因此您可以将所有节点置于 yScale 为 -1 的主 SKSpriteNode 下。
final class GameScene: SKScene
{
var masterNode:SKSpriteNode! = nil
override func addChild(node: SKNode)
{
if masterNode == nil
{
masterNode = SKSpriteNode()
masterNode.position = CGPoint(x:0, y:size.height)
masterNode.anchorPoint = CGPointZero
masterNode.yScale = -1
super.addChild(masterNode)
}
masterNode.addChild(node)
}
}
请注意,您需要保持 masterNode 的 y 位置与视图大小对齐if/when 大小会发生变化。
我不确定这是否是您想要的,但如果您只想更改坐标系,您可以做的是为 CGPoint 创建一个扩展,例如
//CGPoint+SpriteKit.swift
extension CGPoint {
func flipCoordinates() -> CGPoint {
return CGPoint(x: x, y: UIScreen.mainScreen().bounds.height - y)
}
}
我认为这应该可行,因为你的锚点是 (0.5, 0.5)
类似于 Alain T 的回答,但使用 SKCameraNode
和 yScale = -1
,因此您不需要重写 addChild
函数或具有额外的节点层。
let localCamera = SKCameraNode()
override func didMove(to view: SKView) {
super.didMove(to: view)
localCamera.yScale = -1
localCamera.position = CGPoint(x: size.width/2, y: size.height/2)
addChild(localCamera)
self.camera = localCamera
// ...
}