SpriteKit / SKScene:如何从左上角而不是从左下角绘制?

时间:2016-08-03 01:05:07

标签: ios swift sprite-kit skscene

我们知道SKScene的来源位于左下角。

但我尝试从包含0和1矩阵的文件中进行简单的级别加载。虽然0表示无效,1表示墙(简单矩形)。

由于文件的内容显然是从左上角到右下角,我想在场景的左上角绘制。

但是文件中的第一个字符是在场景的左下角绘制的。 我尝试将场景的 yScale 设置为-1,希望它反转y轴,但是没有工作

最简洁的方法是什么SKScene我总是从左上角开始画画?我仍然希望将anchorPoint保持在0.5,0.5。

因此,左上角的绘图位于x=-widthOfScreen/2y=heightOfScreen/2

3 个答案:

答案 0 :(得分:2)

我不确定这是不是你想要的,但是如果你只是想改变坐标系你可以做的是为CGPoint创建一个扩展,比如

//CGPoint+SpriteKit.swift
extension CGPoint {
    func flipCoordinates() -> CGPoint {
        return CGPoint(x: x, y: UIScreen.mainScreen().bounds.height - y)
    }
}

认为这应该有用,因为你的锚点是(0.5,0.5)

答案 1 :(得分:0)

由于SKSpriteNode允许您使用-1的比例翻转其内容,因此您可以将所有节点放在具有-1的yScale的主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的位置与视图大小保持一致。

答案 2 :(得分:0)

与Alain T的答案类似,但是将static void LottoMethod(int[] randNums,int[] userNums) { Console.WriteLine("Guess 10 numbers"); for(int i = 0; i <= userNums.Length-1; i++) { userNums[i] = Int32.Parse( Console.ReadLine()); } Console.WriteLine("The numbers you entered: "); foreach(int k in userNums) { Console.Write(k+" "); } //generate 10 numbers randomly Random rnds = new Random(); for(int k = 0; k <= randNums.Length - 1; k++) { randNums[k] = rnds.Next(1, 26); } Console.WriteLine("Random Numbers"); foreach(int i in randNums) { Console.Write(i + " "); } int correctNums = 0; //Check if random numbers correspond with entered numbers try { for(int i = 0; i <= randNums.Length-1; i++) { for(int j = 0; j <= userNums.Length-1; j++) { if (randNums[i] == userNums[j]) { correctNums++; } } } Console.WriteLine($"There are {correctNums} numbers "); } catch(Exception e) { throw new Exception(e.ToString()); } } SKCameraNode一起使用,因此您无需覆盖yScale = -1函数或具有额外的节点层。

addChild