为 SKSpriteNode 选择随机图像

Posted

技术标签:

【中文标题】为 SKSpriteNode 选择随机图像【英文标题】:Choosing random image for 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 似乎总是选择我在代码开头发送的狮子图像。

【问题讨论】:

您是想制造多个障碍,还是仅仅制造一个随时间变化的障碍? 我有一个障碍物,我想随着时间的推移随机改变它的图像。 【参考方案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 如果这解决了您的问题,您应该将其标记为正确答案。

以上是关于为 SKSpriteNode 选择随机图像的主要内容,如果未能解决你的问题,请参考以下文章

SKSpriteNode - 如何写入构成精灵图像的像素?

为无尽的跑步游戏创建动态大小的 SKSpriteNode 平台

为 SKSpriteNode 添加发光效果

如何将SKSpriteNode作为PNG图像保存到相机胶卷?

为啥我的 SKSpriteNode 没有以图像的默认分辨率显示?

如何在继承 SKSpritenode 的类中拥有图像