从数组

时间:2015-09-04 15:44:15

标签: arrays swift sprite-kit skspritenode skphysicsbody

我正在处理的应用程序有多个节点,这些节点会重复添加到游戏中。我一直在做的是使用纹理数组创建新的SKSpriteNodes,一旦添加了节点,我就为该节点分配一个特定的物理体。但我想做的不是拥有一个纹理数组,而是拥有一个预先分配了物理主体的SKSpriteNodes数组。

我相信我已经弄清楚如何做到这一点,我遇到的问题是当我尝试将SKSpriteNode多次添加到场景时。

例如,下面是我一直在玩,有效,但如果我添加另一行addChild(arraySegment_Type1 [0]作为SKSpriteNode),我收到错误,应用程序崩溃。

override func didMoveToView(view: SKView) {

    anchorPoint = CGPointMake(0.5, 0.5)

    var arraySegment_Type1:[SKSpriteNode] = []
    var sprite = SKSpriteNode(imageNamed: "myimage")

    sprite.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(sprite.size.width, sprite.size.height))
    sprite.physicsBody?.dynamic = false
    sprite.name = "mysprite"

    arraySegment_Type1.append(sprite)

    addChild(arraySegment_Type1[0] as SKSpriteNode)

}

有人知道如何从阵列中多次加载SKSpriteNodes吗?

1 个答案:

答案 0 :(得分:5)

您的代码目前所执行的操作如下:

  • 创建[SKSpriteNode]
  • 类型的空数组
  • 创建单个SKSpriteNode实例
  • 将一个physicsBody广告到精灵
  • 将此单个spriteNode广告到数组
  • 挑选出数组中的第一个对象(索引0)并将其广告给parentNode。

您的应用崩溃了,因为您尝试将相同的 SKSpriteNode实例多次添加到场景中。

以下是您的代码的重新设计版本,它实际上会向场景广告几个精灵,它在技术上有效,但还没有很多意义:

override func didMoveToView(view: SKView) {
    // your ARRAY is not an array-segment it is a collection of sprites
    var sprites:[SKSpriteNode] = []

    let numberOfSprites = 16 // or any other number you'd like

    // Creates 16 instances of a sprite an add them to the sprites array
    for __ in 0..<numberOfSprites {
        var sprite = SKSpriteNode(imageNamed: "myimage")
        sprite.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size)
        sprite.physicsBody?.dynamic = false
        sprite.name = "mysprite" // not sure what your plans are here...
        sprites.append(sprite)
    }

    // picks out each sprite in the sprites array
    for sprite in sprites {
        addChild(sprite)
    }
}

现在正如我所说,这并没有多大意义。因为你可能已经注意到精灵们都出现在彼此之上。 更重要的是,在didMoveToView中执行此操作意味着通过整个阵列舞蹈没有多大意义,您可以简单地执行以下操作:

override func didMoveToView(view: SKView) {
    let numberOfSprites = 16 // or any other number you'd like

    for __ in 0..<numberOfSprites {
        var sprite = SKSpriteNode(imageNamed: "myimage")
        // skipping the physicsBody stuff for now as it is not part of the question

        addChild(sprite)
    }
}

显然有一个改进,但是所有精灵仍然互相覆盖,didMoveToView可能不是处理这一切的最佳地点,所以也许这样的事情来说明这一点:

override func didMoveToView(view: SKView) {
    let sprites = spritesCollection(count: 16)
    for sprite in sprites {
        addChild(sprite)
    }
}

private func spritesCollection(#count: Int) -> [SKSpriteNode] {
    var sprites = [SKSpriteNode]()
    for __ in 0..<count {
        var sprite = SKSpriteNode(imageNamed: "myimage")
        // skipping the physicsBody stuff for now as it is not part of the question

        // giving the sprites a random position
        let x = CGFloat(arc4random() % UInt32(size.width))
        let y = CGFloat(arc4random() % UInt32(size.height))
        sprite.position = CGPointMake(x, y)
        sprites.append(sprite)
    }
    return sprites
}

现在,因为这仍然只是一个工作且更明智的代码结构的起点......