如何在swift中选择一系列精灵

时间:2016-08-02 23:15:58

标签: ios arrays swift

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

var moveandremove = SKAction()<这是我的ballScene.swift

spawn 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)

我是新手,很快就会毫无希望,如果有人可以帮助我的话会很棒:)

由于

2 个答案:

答案 0 :(得分:1)

我很难找到您在代码中谈论的数组。但是,我仍然可以告诉你如何。

我们说我们有print subsets([1,2,3]) appending [] ans: [[]] appending [3] ans: [[3], [3]] appending [2] ans: [[2], [2], [2]] appending [2, 3] ans: [[2, 3], [2, 3], [2, 3], [2, 3]] appending [1] ans: [[1], [1], [1], [1], [1]] appending [1, 3] ans: [[1, 3], [1, 3], [1, 3], [1, 3], [1, 3], [1, 3]] appending [1, 2] ans: [[1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2]] appending [1, 2, 3] ans: [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]] [[], [], [], [], [], [], [], []]

[Int]

我们希望获得该数组中随机选择的元素。

您可能已经知道,使用带有元素索引的下标运算符来访问数组中的元素,例如let ints = [10, 50, 95, 48, 77] 返回ints[2]。因此,如果您为下标提供随机索引,则会返回数组中的随机项!

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

95函数返回0到1之间参数的均匀分布的随机数。请注意,此函数将arc4random_uniform作为参数,返回值的类型相同。所以你需要做一些演员:

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] }

答案 1 :(得分:0)

您可以为返回随机元素的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])
}
相关问题