我有随机生成的节点垂直向下移动的视图。
以下是执行此操作的代码:

    let meteTexture = SKTexture(imageNamed: "redmete.png")
    let movementAmount = arc4random() % UInt32(self.frame.width)
    let meteOffset = CGFloat(movementAmount) - self.frame.width / 2
    let meteTime = arc4random_uniform(4) + 3;
    let moveMete = SKAction.move(by: CGVector(dx: 0, dy: -2 * self.frame.height), duration: TimeInterval(meteTime))

    redmete = SKSpriteNode(texture: meteTexture)
    redmete.position = CGPoint(x: self.frame.midX + meteOffset, y: self.frame.midY + self.frame.height / 2)

我唯一的问题是,由于meteOffset使用了sprite的中心,因此它偶尔会产生大约50%的卵,这样就看不见了。
我试过了
let movementAmount = arc4random() % UInt32(self.frame.width - meteTexture.size().width / 2)

我也试过
let meteOffset = CGFloat(movementAmount) - meteTexture.size().width / 2 - self.frame.width / 2

但也不能把整个精灵都藏在视野里。我该怎么做?

最佳答案

你会希望初始位置在你的框架高度的子范围之间,这个范围是流星高度的一半。
你需要:

let meteorHeight    = meteTexture.size().height
let verticalRange   = self.frame.height - meteorHeight
let randomXPosition = meteorHeight/2  + arc4random() % verticalRange

水平位置也是如此(如果您希望也是随机的话):
let meteorWidth     = meteTexture.size().width
let horizontalRange = self.frame.width - meteorWidth
let randomYPosition = meteorWidth/2  + arc4random() % horizontalRange

然后可以直接用随机XY坐标设置位置
redmete.position = CGPoint(x:randomXPosition, y:randomYPosition)

如果不希望流星看起来太靠近边缘,可以通过减去固定偏移量或乘以小数来进一步减小垂直范围和水平范围的值。

10-08 16:57