在 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).