【问题标题】:Choosing random image for SKSpriteNode为 SKSpriteNode 选择随机图像
【发布时间】:2014-12-22 15:23:29
【问题描述】:

我正在尝试构建一个简单的障碍跳跃应用程序。我希望从一组图像中随机挑选障碍物的图像。我尝试使用 arc4random_uniform 函数和 switch case 的组合,但这似乎并没有更新 SKSpriteNode。我做错了什么?

class PlayScene: SKScene, SKPhysicsContactDelegate{
      ...
      var block3 = SKSpriteNode(imageNamed: "lion")
      ....
}


override func update(currentTime: NSTimeInterval) {
     .....
     blockRunner()
    }


func blockRunner() {

        var imageNamedAnimal = ""
        var randomIndex = arc4random_uniform(2)
        switch(randomIndex) {
        case 0 : imageNamedAnimal = "turtle"
        case 1: imageNamedAnimal = "lion"
        default: imageNamedAnimal = "turtle"
        }

        block3 = SKSpriteNode(imageNamed: imageNamedAnimal)
        .....
        }   

我应该在什么时候尝试设置随机图像?尽管 imageNamedAnimal 在每一帧中显示随机值,但 Block3 似乎总是选择我在代码开头发送的狮子图像。

【问题讨论】:

  • 您是想制造多个障碍,还是仅仅制造一个随时间变化的障碍?
  • 我有一个障碍物,我想随着时间的推移随机改变它的图像。

标签: ios image swift sprite-kit skspritenode


【解决方案1】:

您可以通过创建图像并将其存储为纹理来避免每次更改角色时加载图像。以下是如何做到这一点的示例:

创建一个数组来存储纹理

var textures = [SKTexture]()

在didMoveToView,创建并存储纹理

textures.append(SKTexture(imageNamed: "turtle"))
textures.append(SKTexture(imageNamed: "lion"))
textures.append(SKTexture(imageNamed: "rhino"))
...

在blockRunner方法中,添加以下内容

 // Randomly select a character
 let rand = Int(arc4random_uniform(UInt32(textures.count)))
 let texture = textures[rand] as SKTexture

 block3.texture = texture
 // Optionally, resize the sprite
 block3.size = texture.size()

【讨论】:

  • 谢谢!这绝对是一个更简洁的实现,而不是每次都加载图像。它最终会节省处理能力吗?
  • 使用imageNamed 加载图像时,您可能会随机看到轻微的延迟。
【解决方案2】:

当您调用初始化程序时,您正在创建一个新的 SKSpriteNode,但您从未将它添加到视图中。相反,您可以通过设置其纹理来更改精灵中的图像,如下所示:

block3.texture = SKTexture(imageNamed: imageNamedAnimal)

【讨论】:

  • @newbiedev 如果这解决了您的问题,您应该将其标记为正确答案。
猜你喜欢
  • 2014-01-28
  • 2020-07-03
  • 1970-01-01
  • 2013-03-27
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多