swift - 使用 Swift 创建随机 CGPoint

标签 swift sprite-kit cgpoint

所以,我正在尝试开发一个用 Swift 编写的简单游戏,但我在做一件非常简单的事情时遇到了困难。我无法创建随机 CGPoint... 使用 arc4random 时,会出现编译器错误,告诉我无法在 CGPoint 中使用 Int32。那么,有什么办法可以做到这一点吗?有什么解决办法吗?谢谢!

最佳答案

还可以利用 Swift 的基类型扩展来创建一组可重用的 CGPoint 重载函数。也许是这样的:

extension CGPoint {

    func random()->CGPoint { return CGPoint(x:Int(arc4random()%1000),y:Int(arc4random()%1000))}

    func random(range:Int)->CGPoint { 
         return CGPoint(x:Int(arc4random()%range),y:Int(arc4random()%range))}

    func random(rangeX:Int, rangeY:Int)->CGPoint { 
         return CGPoint(x:Int(arc4random()%rangeX),y:Int(arc4random()%rangeY))} 
}

然后您可以像这样编写随机 CGPoint:

var p = CGPoint.random() 
//random x and y with a range of 1000

var p = CGPoint.random(range:100)
//random x and y with a range of 100

var p = CGPoint.random(rangeX:200, rangeY:400)
//random x up to 200 and random y with a range of up to 400

当然,我现在不在 Xcode IDE 中检查语法/是否正确编译,但希望这能有所帮助:-)

...

///////////////////

Swift 1.2 更新

///////////////////

似乎这些类型级函数调用不再允许扩展......至少对于 CGPoint 来说;可能是因为 CGPoint 实际上是一个结构体,而不是基于当前 IOS 文档的类。

这是我的扩展的更深入版本,它允许范围类型。

这已被确认在 XCode 6.4 Beta 中有效

(此处包含 Playground 文件的 Github 存储库:

https://github.com/princetrunks/Random-CGPoint-Extension )

//creates random CGPoints in Swift as of XCode Beta 6.4 (6E7)
extension CGPoint {

/*private functions that help alleviate the ambiguity of the modulo bias 
   and nested typecasting as well as recycle similar functionality 
     for either Int or Range type parameter inputs */

private func randomInt(num:Int) ->Int{
    return Int(arc4random_uniform(UInt32(num)))
}

private func randomIntFromRange(numRange:Range<Int>) ->Int{
    return Int(arc4random_uniform(UInt32((numRange.endIndex - numRange.startIndex) + numRange.startIndex)))
}

//private variable for the default range
private var defaultRange : Int{
    get{return 1000}
}

//(a) public variable that creates a default random CGPoint
static var randomPoint = CGPoint.zeroPoint.random()


//(b) default random point creation
func random()->CGPoint { return CGPoint(x:randomInt(defaultRange),y:randomInt(defaultRange))}

//(c) using an Int parameter for both the random x and y range
func random(range:Int)->CGPoint {
    return CGPoint(x:randomInt(range),y:randomInt(range))
}

//(d) allows for the specification of the x and y random range
func random(#rangeX:Int, rangeY:Int)->CGPoint {
    return CGPoint(x:randomInt(rangeX),y:randomInt(rangeY))
}

//(e) allows the same functionality as (c) but with a Range<Int> type parameter
func random(range:Range<Int>)->CGPoint {
    return CGPoint(x:randomIntFromRange(range), y:randomIntFromRange(range))
}

//(f) allows the same functionality as (d) but with a Range<Int> type parameter
func random(#rangeX:Range<Int>, rangeY:Range<Int> )->CGPoint {
    return CGPoint(x:randomIntFromRange(rangeX), y:randomIntFromRange(rangeY))
 }

}

以下是我们测试此扩展的方法:

//(a)
let r  = CGPoint.randomPoint

//(b)
var anotherRandomPoint = r.random()

//(c)
anotherRandomPoint = r.random(1000)

//(d)
anotherRandomPoint = r.random(0...1000)

//(e)
anotherRandomPoint = r.random(rangeX:90, rangeY: 2000)

//(f)
anotherRandomPoint = r.random(rangeX:0...90, rangeY: 0...2000)


// generates 100 random CGPoints between -1000 and 999
for _ in 0...100 {
    anotherRandomPoint.random(-1000...1000)
}

关于swift - 使用 Swift 创建随机 CGPoint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24438495/

相关文章:

ios - 将单元格放置在 Collection View 的中心而不是快速的外部

ios - UITableview 从上一个 View 返回时更改 Y 位置

ios - 游戏卡在安全区域 iPhone Xs

ios - 预加载 SKTextures/SKTextureAtlas 困惑

ios - 如何以可变速度沿 CGPath 移动 Sprite

objective-c - 将 NSValue 转换回 CGPoint

ios - SKLabelNode 没有显示正确的 CGPoint

swift - spritekit 我的玩家节点没有根据我的触摸移动?

swift - textview 中的文本不是垂直居中

ios - 如何改变物体的中心?