Swift SpriteKit包含屏幕宽度内的节点

时间:2017-04-07 18:55:06

标签: swift view

我随机产生了在视图中垂直向下移动的节点。

以下是执行此操作的代码:

    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使用精灵的中心因此它偶尔会产生,所以50%左右的视图不在视野范围内。

我试过了

let movementAmount = arc4random() % UInt32(self.frame.width - meteTexture.size().width / 2)

我也试过

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

但是不要在视图中保留整个精灵。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

您希望初始位置介于帧高的子范围之间,该范围是流星高度的一半。

你需要:

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)

如果您不希望流星显得太靠近边缘,您可以通过减去固定偏移量或乘以分数来进一步减小verticalRange和horizo​​ntalRange的值。

答案 1 :(得分:0)

解决:

let meteTexture = SKTexture(imageNamed: "redmete.png")
    let movementAmount = arc4random() % UInt32(self.frame.width / 2)
    let meteOffset = CGFloat(movementAmount) + meteTexture.size().width/2 - 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)