【问题标题】:Create random CGPoint with Swift使用 Swift 创建随机 CGPoint
【发布时间】:2014-06-26 19:19:11
【问题描述】:

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

【问题讨论】:

    标签: swift sprite-kit cgpoint


    【解决方案1】:

    还可以利用 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))} 
    }
    

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

    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 文档的类。

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

    这已确认从 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 1.2 中,我们不再可以进行 CGPoint.random() 或任何这些类型级别的调用。现在更新扩展代码,不久之后应该也有一个 github 存储库,以便它可以不断分叉和更新
    【解决方案2】:

    你好,构造一个 Int 怎么样? Int(arc4random())

    例如

    var p = CGPoint(x:Int(arc4random()%1000),y:Int(arc4random()%1000))
    

    【讨论】:

    • 哦,成功了!谢谢!有没有更短的方法来做到这一点?再次感谢! :D
    【解决方案3】:
    Swift 4,5
    // Add some range
    let minX = 0
    let maxX = 100
    let minY = 0
    let maxY = 100
    let randomX = CGFloat.random(in: minX..<maxX)
    let randomY = CGFloat.random(in: minY..<maxY)
    let random = CGPoint(x: randomX, y: randomY)
    

    【讨论】:

      【解决方案4】:

      这是 CGPoint 的扩展,可根据您的 x,y 封闭范围生成随机点。

      extension CGPoint {
          static func randPoint(xRange: ClosedRange<CGFloat>, yRange: ClosedRange<CGFloat>) -> Self {
              let x = CGFloat.random(in: xRange)
              let y = CGFloat.random(in: yRange)
              return .init(x: x, y: y)
          }
          
          
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-03
        • 1970-01-01
        • 2013-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多