【问题标题】:SpriteKit: center SKNode in sceneSpriteKit:场景中的中心 SKNode
【发布时间】:2016-10-20 21:34:58
【问题描述】:

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

那么,我怎样才能使 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
    }
}

我在将节点排列成网格的结构中也有这个功能。 (下标也在struct上,但我觉得没必要放在这里)

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)

【问题讨论】:

  • 您应该发布用于实现此节点和标签的代码,以便人们可以验证它是如何设置的
  • 请同时加上下标,没有下标这段代码无法编译

标签: swift sprite-kit sknode


【解决方案1】:

您的设置可能有很多问题,在您发布一些代码之前我们不会知道。

在屏幕上将一个 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)

****编辑****

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

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

可能有上千种不同的方法可以解决您的问题,这里只是一个快速简单的解决方案(另一种选择可能是使容器成为 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
    }
}

【讨论】:

  • @José 您需要检查答案,如果它们对您有帮助,请将其标记为正确。我注意到您的最后 7 个问题未在答案中标记。人们花费大量时间来帮助解决问题,并且应该得到奖励。
  • 抱歉,一直忙到现在。您的回答完美,谢谢!
猜你喜欢
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多