如何在视图中居中节点数组?
How do I center array of nodes in view?
我通过编程绘制等距图块创建了一个游戏板,然后将它们添加到一个数组中。节点已被任意放置,以尽可能多地在中心显示游戏板。当然,这在不同设备上 运行 时不起作用。所以,我正在寻找一种方法,让游戏板始终位于屏幕的绝对中心。
我有一个关于将节点合并成一个大...节点的想法?然后将其中心设置为视图的中心。那可行吗?如何?或者有更好或更简单的方法吗?
这就是我创建磁贴的方式:
func newTile(size:CGSize) -> SKShapeNode {
let shape = SKShapeNode()
let path = UIBezierPath()
path.move(to: CGPoint(x:0, y:size.height / 2.0))
path.addLine(to: CGPoint(x:size.width / 2.0, y:0))
path.addLine(to: CGPoint(x:0, y:-size.height / 2.0))
path.addLine(to: CGPoint(x:-size.width / 2.0, y:0))
path.close()
shape.path = path.cgPath
shape.lineWidth = 1.0
shape.fillColor = SKColor.gray
return shape
}
放置方块的函数:
func tilePosition(col:Int, row:Int) -> CGPoint {
let x = (CGFloat(row) * tileWidth / 2.0) + (CGFloat(col) * tileWidth / 2.0)
let y = (CGFloat(col) * tileHeight / 2.0) - (CGFloat(row) * tileHeight / 2.0)
return CGPoint(x: x-250, y: y)
}
... 并添加到看板(为了简化,我删除了此处的代码。这只是为了给您一个想法):
func createGameBoard(sceneView: SKScene) -> [[SKShapeNode]] {
let size = CGSize(width: tileWidth, height: tileHeight)
for row in 1...numRows {
var colArray = [SKShapeNode]()
for col in 1...numCols {
let tile = newTile(size: size)
tile.position = tilePosition(col: col, row: row)
sceneView.addChild(tile)
colArray.append(tile)
}
gameBoardArray.append(colArray)
}
return gameBoardArray
}
那么,如何将这个东西放在视图中间呢?也就是说,中心图块位于屏幕中央,所有其他图块相应地围绕它对齐。
可能有上千种不同的方法来解决您的问题,这里只是一个快速简单的解决方案(另一种选择是使容器成为 SKSpriteNode 并将其锚点设置为零)。
func arrangeButtonsInGrid(padding: Int) {
var yPosition = -(rows / 2)
for row in 0..<rows {
var xPosition = -(columns / 2)
for col in 0..<columns {
tiles[col, row].position = CGPoint(x: padding * xPosition, y: padding * yPosition)
xPosition += 1
}
yPosition += 1
}
}
我通过编程绘制等距图块创建了一个游戏板,然后将它们添加到一个数组中。节点已被任意放置,以尽可能多地在中心显示游戏板。当然,这在不同设备上 运行 时不起作用。所以,我正在寻找一种方法,让游戏板始终位于屏幕的绝对中心。
我有一个关于将节点合并成一个大...节点的想法?然后将其中心设置为视图的中心。那可行吗?如何?或者有更好或更简单的方法吗?
这就是我创建磁贴的方式:
func newTile(size:CGSize) -> SKShapeNode {
let shape = SKShapeNode()
let path = UIBezierPath()
path.move(to: CGPoint(x:0, y:size.height / 2.0))
path.addLine(to: CGPoint(x:size.width / 2.0, y:0))
path.addLine(to: CGPoint(x:0, y:-size.height / 2.0))
path.addLine(to: CGPoint(x:-size.width / 2.0, y:0))
path.close()
shape.path = path.cgPath
shape.lineWidth = 1.0
shape.fillColor = SKColor.gray
return shape
}
放置方块的函数:
func tilePosition(col:Int, row:Int) -> CGPoint {
let x = (CGFloat(row) * tileWidth / 2.0) + (CGFloat(col) * tileWidth / 2.0)
let y = (CGFloat(col) * tileHeight / 2.0) - (CGFloat(row) * tileHeight / 2.0)
return CGPoint(x: x-250, y: y)
}
... 并添加到看板(为了简化,我删除了此处的代码。这只是为了给您一个想法):
func createGameBoard(sceneView: SKScene) -> [[SKShapeNode]] {
let size = CGSize(width: tileWidth, height: tileHeight)
for row in 1...numRows {
var colArray = [SKShapeNode]()
for col in 1...numCols {
let tile = newTile(size: size)
tile.position = tilePosition(col: col, row: row)
sceneView.addChild(tile)
colArray.append(tile)
}
gameBoardArray.append(colArray)
}
return gameBoardArray
}
那么,如何将这个东西放在视图中间呢?也就是说,中心图块位于屏幕中央,所有其他图块相应地围绕它对齐。
可能有上千种不同的方法来解决您的问题,这里只是一个快速简单的解决方案(另一种选择是使容器成为 SKSpriteNode 并将其锚点设置为零)。
func arrangeButtonsInGrid(padding: Int) {
var yPosition = -(rows / 2)
for row in 0..<rows {
var xPosition = -(columns / 2)
for col in 0..<columns {
tiles[col, row].position = CGPoint(x: padding * xPosition, y: padding * yPosition)
xPosition += 1
}
yPosition += 1
}
}