如何将节点定位到Sprite Kit中圆周边的随机点?

时间:2014-08-31 03:38:45

标签: swift sprite-kit

所以我需要从圆周边的随机点产生游戏敌人。这是我到目前为止的代码,感觉非常接近工作,但不是:

let enemy = SKShapeNode(circleOfRadius: 5)

func enemyGenerator() {

//takes an x value and calculates the corresponding y coordinate on the circle.
    func enemyYSpawnPosition(x: CGFloat) -> CGFloat {
        return sqrt(104006.25 - (x * x))
    }

//randomly selects an x value from a range of acceptable values.
    func enemyXSpawnPosition() -> CGFloat {
        func randRange (lower: Int , upper: Int) -> Int {
            return lower + Int(arc4random_uniform(UInt32(upper - lower + 1)))
        }
        var xValue = randRange(-2.5, 322.5)
        return CGFloat (xValue)
    }

//used to randomly decide whether the y value will be subtracted or added.
    func coinFlip (lower: Int, upper: Int) -> Int {
        return lower + Int(arc4random_uniform(UInt32(upper - lower + 1)))
    }
    var randResult = coinFlip(1, 2)

//positions the enemy using the functions above.
    if randResult == 1 {
        self.enemy.position = CGPointMake(enemyXSpawnPosition(), CGRectGetMidY(self.frame) + enemyYSpawnPosition(enemyXSpawnPosition()))
    }
    else {
        self.enemy.position = CGPointMake(enemyXSpawnPosition(), CGRectGetMidY(self.frame) - enemyYSpawnPosition(enemyXSpawnPosition()))
    }
}

问题在于,当定位敌人时我必须两次调用enemyXSpawnPosition函数,当我这样做时,我得到两个不同的值。当我布置位置时,我需要保持不变的值。

是否有一种更简单的方法可以将一个节点随机定位在一个圆圈的周边,或者是一种修复我已经拥有的东西的方法?

1 个答案:

答案 0 :(得分:14)

此方法在给定圆的半径和中心位置的圆上返回一个随机点。

func randomPointOnCircle(radius:Float, center:CGPoint) -> CGPoint {
    // Random angle in [0, 2*pi]
    let theta = Float(arc4random_uniform(UInt32.max))/Float(UInt32.max-1) * Float.pi * 2.0
    // Convert polar to cartesian
    let x = radius * cos(theta)
    let y = radius * sin(theta)
    return CGPointMake(CGFloat(x)+center.x,CGFloat(y)+center.y)
}