【问题标题】:How to choose from an array of sprites in swift如何快速从一组精灵中进行选择
【发布时间】:2023-03-31 21:39:01
【问题描述】:

所以基本上我希望从 4 个不同颜色的球中随机选择一个进入场景,每个都有我已经编码的动画、物理属性以及运动和间距。我不确定如何制作阵列,然后从 4 个彩色球的阵列中随机选择 以便我随机选择一个球进入场景。 为了更清楚我在问什么,这里有一些代码(我在这段代码中只使用了两个球,所以你不必阅读那么多):

var moveandremove = SKAction()

生成的 runBlock 位于 didMovetoView 内

让 spawn = SKAction.runBlock({ () 在

        self.allballs()

    })

    let delay = SKAction.waitForDuration(2.0)
    let SpawnDelay = SKAction.sequence([spawn, delay])
    let spawndelayforever = SKAction.repeatActionForever(SpawnDelay)
    self.runAction(spawndelayforever)

    let distance = CGFloat(brnball.frame.width * 20 + brnball.frame.width)
    let moveball = SKAction.moveByX(-distance, y: 0, duration: NSTimeInterval(0.003 * distance))
    let removeball = SKAction.removeFromParent()
    moveandremove = SKAction.sequence([moveball])

}


func allballs() {

    TextureAtlasblk = SKTextureAtlas(named: "blkball")

    for i in 1...TextureAtlasblk.textureNames.count{

        var Name = "blkball_\(i)"
        blkarray.append(SKTexture(imageNamed: Name))
    }

    blkball = SKSpriteNode(imageNamed: "blkball_1")
    blkball.position = CGPoint(x: CGRectGetMidX(self.frame) + 100, y: CGRectGetMidY(self.frame))
    blkball.zPosition = 7
    blkball.setScale(0.1)

    self.addChild(blkball)

    blkball.runAction(SKAction.repeatActionForever(SKAction.animateWithTextures(blkarray, timePerFrame: 0.2)))

    //brownball

    TextureAtlasbrn = SKTextureAtlas(named: "brnball")

    for i in 1...TextureAtlasbrn.textureNames.count{

        var Name = "brnball_\(i)"
        brnarray.append(SKTexture(imageNamed: Name))
    }

    brnball = SKSpriteNode(imageNamed: "brnball_1")
    brnball.position = CGPoint(x: CGRectGetMidX(self.frame) + 50, y: CGRectGetMidY(self.frame))
    brnball.zPosition = 7
    brnball.setScale(0.1)

    self.addChild(brnball)

    brnball.runAction(SKAction.repeatActionForever(SKAction.animateWithTextures(brnarray, timePerFrame: 0.2)))

这是我尝试从每个球中选择一个数组的糟糕起点(这是在我的 allballs() 函数中):

var ballarray: NSMutableArray = [blkball, brnball, yelball, bluball]

    runAction(moveandremove)

我是 swift 新手,非常绝望,如果有人可以帮助我,那就太棒了:)

谢谢

【问题讨论】:

    标签: ios arrays swift


    【解决方案1】:

    我很难在代码中找到您所说的数组。但尽管如此,我仍然可以向您展示如何操作。

    假设我们有一个[Int]

    let ints = [10, 50, 95, 48, 77]
    

    我们想要从该数组中随机选择一个元素。

    您可能已经知道,您可以使用带有元素索引的下标运算符来访问数组中的元素,例如ints[2] 返回95。所以如果你给下标一个随机索引,就会返回数组中的一个随机项!

    让我们看看如何生成随机数。

    arc4random_uniform 函数返回一个均匀分布的随机数,介于 0 和参数减一之间。请注意,此函数将UInt32 作为参数,并且返回值的类型相同。所以你需要做一些铸造:

    let randomNumber = Int(arc4random_uniform(UInt32(ints.count)))
    

    使用randomNumber,我们可以访问数组中的随机元素:

    let randomItem = ints[randomNumber]
    

    尝试将此技术应用于您的情况。

    这也是一个通用的方法:

    func randomItemInArray<T> (array: [T]) -> T? {
        if array.isEmpty {
            return nil
        }
    
        let randomNumber = Int(arc4random_uniform(UInt32(array.count)))
        return array[randomNumber]
    }
    

    注意,如果传入的数组为空,则返回nil

    【讨论】:

    • 就是这个,传奇!谢谢:)
    【解决方案2】:

    您可以为返回随机元素的 Array 创建和扩展。

    extension Array {
      func randomElement() -> Element {
         let i = Int(arc4random_uniform(UInt32(count - 1)))
         return self[i]
      }
    }
    

    您可以更进一步,允许将函数直接应用于随机元素。

    mutating func randomElement(perform: (Element) -> Element) {
      let i = Int(arc4random_uniform(UInt32(count - 1)))
      self[i] = perform(self[i])
    }
    

    您可以在使用引用类型数组时使用此函数。

    func randomElement(perform: (Element) -> ()) {
      let i = Int(arc4random_uniform(UInt32(count - 1)))
      perform(self[i])
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多