在 SpriteKit 场景中将生成的行居中
Center a generated Row in a SpriteKit Scene
我正在制作一个 Breakout Game,该游戏会根据我想要的那一行中的多少块砖生成行。但我无法让行从中间开始。我将如何实现这一点,这是我当前的代码。
我尝试了很多东西,但我得到的最接近的是让它们都在中间,但应该从中间展开。
我想要实现的应该是这样的。
您正在将积木添加到父级 SKNode
(使用 addChild(_:)
)。添加到该父节点中的所有内容都相对于其坐标 space.
尝试在 y: 0
处添加一块砖,看看它会放在哪里。如果您的场景 anchorPoint
为 0.5,您可能会在屏幕中央看到砖块。从那里,你向上或向下(正值或负值 y
值)显示其他行。
要更好地了解坐标系的工作原理,请参阅 About SpriteKit Coordinate Systems。
x轴也是一样的。如果您的积木从左到右开始,则意味着父节点的原点在屏幕左侧。
要从中间开始,你需要知道中间点。一种选择是制作一个容器节点,将其放置在屏幕中央,然后将所有积木添加到那里。这样,积木可以从(0, 0)
.
开始
let middle = CGPoint(x: scene!.size.width / 2, y: scene!.size.height / 2)
let container = SKNode()
container.position = middle
// inside makeBricks(), add everything inside container:
container.addChild(brick)
这实际上取决于您如何设置节点层次结构。
如果您有可用的最大行大小,一种简单的方法是在计算 x 坐标时包括一个偏移量。
let maxRow = ... // whatever the maximum row size is
let padding = (maxRow - row) / 2 // how many blocks to skip on the left
for i in 1...row {
// your block creation loop
let x = 15 + (i + padding) * Int(brick.size.width)
// make the brick at x, y
}
如果事情可能不会平均分配(例如,如果 maxRow
是 15,就像它在您的图片中一样,但 row
可能是 4)那么您必须决定您的行为喜欢。以上将保持砖块对齐,因为计算 padding
中的整数除法将被截断;左右填充将不相同。如果您使用浮动除法并获得像 3.5 这样的 padding
,您将获得完全居中的行,但奇数行和偶数行将具有不同的对齐方式。
如果您的问题是您希望事物以动画方式出现(如您的图片),那么事情就更复杂了。与其根据序列 1, 2, ..., row
生成,不如考虑从序列 0, +1, -1, +2, -2, ... 生成后生成中间的积木,你会成对地生成额外的积木。 x 坐标将计算为 xCenter + i * Int(brick.side.width)
.
我正在制作一个 Breakout Game,该游戏会根据我想要的那一行中的多少块砖生成行。但我无法让行从中间开始。我将如何实现这一点,这是我当前的代码。
我尝试了很多东西,但我得到的最接近的是让它们都在中间,但应该从中间展开。
我想要实现的应该是这样的。
您正在将积木添加到父级 SKNode
(使用 addChild(_:)
)。添加到该父节点中的所有内容都相对于其坐标 space.
尝试在 y: 0
处添加一块砖,看看它会放在哪里。如果您的场景 anchorPoint
为 0.5,您可能会在屏幕中央看到砖块。从那里,你向上或向下(正值或负值 y
值)显示其他行。
要更好地了解坐标系的工作原理,请参阅 About SpriteKit Coordinate Systems。
x轴也是一样的。如果您的积木从左到右开始,则意味着父节点的原点在屏幕左侧。
要从中间开始,你需要知道中间点。一种选择是制作一个容器节点,将其放置在屏幕中央,然后将所有积木添加到那里。这样,积木可以从(0, 0)
.
let middle = CGPoint(x: scene!.size.width / 2, y: scene!.size.height / 2)
let container = SKNode()
container.position = middle
// inside makeBricks(), add everything inside container:
container.addChild(brick)
这实际上取决于您如何设置节点层次结构。
如果您有可用的最大行大小,一种简单的方法是在计算 x 坐标时包括一个偏移量。
let maxRow = ... // whatever the maximum row size is
let padding = (maxRow - row) / 2 // how many blocks to skip on the left
for i in 1...row {
// your block creation loop
let x = 15 + (i + padding) * Int(brick.size.width)
// make the brick at x, y
}
如果事情可能不会平均分配(例如,如果 maxRow
是 15,就像它在您的图片中一样,但 row
可能是 4)那么您必须决定您的行为喜欢。以上将保持砖块对齐,因为计算 padding
中的整数除法将被截断;左右填充将不相同。如果您使用浮动除法并获得像 3.5 这样的 padding
,您将获得完全居中的行,但奇数行和偶数行将具有不同的对齐方式。
如果您的问题是您希望事物以动画方式出现(如您的图片),那么事情就更复杂了。与其根据序列 1, 2, ..., row
生成,不如考虑从序列 0, +1, -1, +2, -2, ... 生成后生成中间的积木,你会成对地生成额外的积木。 x 坐标将计算为 xCenter + i * Int(brick.side.width)
.