arrays - 从数组中多次使用 SKSpriteNode(s)

标签 arrays swift sprite-kit skspritenode skphysicsbody

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

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

例如,下面是我一直在玩的,它可以工作,但是如果我添加另一行 addChild(arraySegment_Type1[0] as 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 吗?

最佳答案

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

  • 创建一个 [SKSpriteNode] 类型的空数组
  • 创建单个 SKSpriteNode 实例
  • 为 Sprite 添加一个 physicsBody
  • 将这个单个 spriteNode 添加到一个数组中
  • 挑选出数组中的第一个对象(索引 0)并将其广告到父节点。

您的应用程序崩溃是因为您试图多次将相同 SKSpriteNode 实例添加到场景中。


这是您的代码的修改版本,它实际上将几个 Sprite 添加到场景中,它在技术上是可行的,但目前还没有多大意义:

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

正如我所说,这并没有多大意义。您可能已经注意到,为了一件事,所有 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)
    }
}

显然是一个改进,但是所有的 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
}

现在,虽然这是一个长期的伤口,但它仍然只是通向一个有效且更明智的代码结构的起点......

关于arrays - 从数组中多次使用 SKSpriteNode(s),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32401936/

相关文章:

javascript - 从对象的数组元素中,如何访问对象的属性/方法。杰斯

ios - 无法将表达式的类型 'Void' 转换为类型 'CFAllocator!'

ios - arc4random 函数随机执行两次或三次

ios - SKAction 不重启

javascript - 在 chart.js 数据和标签字段中使用数组值

python - numpy,取它们交集的数组差

javascript - 如何在 Angular.js 中的 JSON 对象中返回和排列

swift - 从初始化器返回而不初始化所有存储的属性错误 - 但一切都已初始化

swift - 使用 SwiftyJSON 解析 comlpex JSON

ios - 如何使按钮在按住时不断调用函数(SpriteKit)