SpriteKit:场景

时间:2016-06-19 15:22:51

标签: swift sprite-kit sknode

我无法将SKNode集中在我的主场景中。这(下面的照片)是一个包含16个SKLabelNodes的SKNode。在代码中,它位于位置(0,0),但正如您在图像上看到的那样,它似乎没有居中。此外,Apple文档没有说明有关SKNodes上的anchorPoint的信息。

enter image description here

那么,我如何将SKNode置于场景中心?

这是代码。

我有一个将标签存储在数组中的结构。我将它们初始化为0。

struct NumberButtonsMatrix {

let rows: Int, columns: Int
var grid: [NumberButton]

init(rows: Int, columns: Int) {

    grid = [NumberButton]()

    self.rows = rows
    self.columns = columns

    for _ in 0..<(rows*columns) {
        let button = NumberButton(number: 0)
        grid.append(button)
    }
}

}

func indexIsValid(row: Int, column: Int) -> Bool {
    return row >= 0 && row < rows && column >= 0 && column < columns
}

func indexIsValid(index :Int) -> Bool {
    return index >= 0 && index < rows*columns
}

subscript(row: Int, column: Int) -> NumberButton {
    get {
        assert(indexIsValid(row: row, column: column), "Index not valid")
        return grid[(row*columns) + column]
    }
    set {
        assert(indexIsValid(row: row, column: column), "Index not valid")
        grid[(row*columns) + column] = newValue
    }
}


subscript(index: Int) -> NumberButton {
    get {
        assert(indexIsValid(index: index), "Index not valid")
        return grid[index]
    }
    set {
        assert(indexIsValid(index: index), "Index not valid")
        grid[index] = newValue
    }
}

我在结构中也有这个函数来排列网格中的节点。 (下标也在结构上,但我认为没有必要把它放在这里)

func arrangeButtonsInGrid(separation: Int) {

    for i in 0..<rows {
        for j in 0..<columns {

            self[i, j].position = CGPoint(x: -separation*i, y: separation*j)

        }
    }

}

然后,我有一个名为GameBoard的类,它是SKNode的子类,其中所有SKLabel都在。

class GameBoard: SKNode {

var numberButtons: NumberButtonsMatrix

init(rows: Int, columns: Int) {

    numberButtons = NumberButtonsMatrix(rows: rows, columns: columns)

    super.init()

    numberButtons.arrangeButtonsInGrid(separation: 144)

    for i in 0..<(rows*columns) {

        numberButtons[i].number = i
        self.addChild(numberButtons[i])

    }



}

最后,我将它们添加到我的场景中。

var gameBoard = GameBoard(rows: 4, columns: 4)
    gameBoard.position = CGPoint(x: self.size.width / 2, y: self.size.height / 2)
    self.addChild(gameBoard)

1 个答案:

答案 0 :(得分:3)

你设置的内容太多了,在发布一些代码之前我们不会知道。

将屏幕上的SKNode中心设置为非常简单,并且内部没有任何区别。

最大因素是您的场景定位点设置为。

以下是场景定位点设置为0,0并在屏幕中输入容器(SKNode)的示例

    let size = CGSize(width: 50, height: 50)
    let container = SKNode()
    container.position = CGPoint(x: self.size.width / 2, y: self.size.height / 2)

    for row in -1...1 {

        for col in -1...1 {

            let label = SKLabelNode()
            label.text = "0"
            label.position = CGPoint(x: size.width * CGFloat(row), y: size.height * CGFloat(col))

            container.addChild(label)
        }
    }

    addChild(container)

**** **** EDIT

问题不在于您的节点或anchorPoints。问题出在你的arrangeButtonsInGrid函数中。

要考虑的事情,如果您遇到SKNode功能有限的问题,只需将其转换为SKSpriteNode(我通常会这样做进行测试并将其背景颜色设置为红色,以便我可以准确地看到它的布局位置)< / p>

可能有一千种不同的方法来解决您的问题,这里只是一个简单的快速解决方案(另一种选择可能是将容器设为SKSpriteNode并将其锚点设置为零)。看起来你正在编译Swift 2.3或3的代码,所以你可能需要调整一些东西

func arrangeButtonsInGrid(padding: Int) {

    var yPosition = -(rows / 2)

    for row in 0..<rows {

        var xPosition = -(columns / 2)

        for col in 0..<columns {
            self[col, row].position = CGPoint(x: padding * xPosition, y: padding * yPosition)
            xPosition += 1
        }

        yPosition += 1
    }
}