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

Posted

技术标签:

【中文标题】从数组中多次使用 SKSpriteNode(s)【英文标题】:Use SKSpriteNode(s) Multiple Times From An Array 【发布时间】:2015-09-04 15:44:14 【问题描述】:

我正在开发的应用程序有多个节点,这些节点会重复添加到游戏中。我一直在做的是使用纹理数组创建新的 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 多次加载到场景中? 【参考方案1】:

您的代码目前的作用如下:

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

您的应用程序崩溃,因为您尝试将 same 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

现在,尽管它是长期伤痕累累的,但它仍然只是迈向有效且更明智的代码结构的起点......

【讨论】:

我正在使用横​​向模式,我添加了 10 个精灵,其中有几个是不可见的。你能告诉我如何在屏幕内定位每个精灵吗? actually ads several sprites - "adds" 拼写错误

以上是关于从数组中多次使用 SKSpriteNode(s)的主要内容,如果未能解决你的问题,请参考以下文章

从 SKSpriteNode 类实例访问 GameScene 中的数组?

如何在Swift中正确地从父节点中删除SKSpriteNode的子类(要从数组中移除,屏幕上的空格......)?

在节点中使用精灵套件问题进行游戏开发?

如何从数组中抓取一个随机元素而不多次抓取同一个元素? [复制]

使用 SKAction colorizeWithColor 使 SKSpriteNode 闪烁白色

数组更改图像中的 SKSpriteNode