我随机产生了在视图中垂直向下移动的节点。
以下是执行此操作的代码:
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
但是不要在视图中保留整个精灵。我怎么能这样做?
答案 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和horizontalRange的值。
答案 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)