设置SKSpriteNode的名称?

时间:2016-07-18 15:43:17

标签: swift sprite-kit skspritenode

我正在使用以下代码为我的游戏中的玩家生成随机图像。

var playerTexture = [SKTexture]()

        playerTexture.append(SKTexture(imageNamed: “red”))
        playerTexture.append(SKTexture(imageNamed: “blue”))
        playerTexture.append(SKTexture(imageNamed: “green”))


        let rand = Int(arc4random_uniform(UInt32(playerTexture.count)))
        let chosenColor = playerTexture[rand] as SKTexture
        let playerSkin = chosenColor

上面的代码生成一个名为playerSkin的随机SKTexture(红色,蓝色或绿色)。

    player = SKSpriteNode(texture: playerSkin)
    player.size = CGSize(width: 50, height: 50)
    player.position = location
    self.addChild(player)
    player.name = chosenColor.description

然后,代码的下一部分将播放器创建为SKSpriteNode,并为其指定红色,蓝色或绿色的随机纹理。但主要的是代码使用以下命令将player.name分配给随机选择的图像:

player.name = chosenColor.description

然后我使用print检查播放器的名称。

 print(player.name)

但是,当我检查播放器的名称时,根据选择的随机图像,它会显示为以下之一:

可选(" \'红色\'(120 x 120)")

可选(" \'蓝色\'(120 x 120)")

可选(" \'绿色\'(120 x 120)")

我的图像被称为"红色","蓝色"和"绿色"并位于Xcode的Assets.xcassets文件夹中。

我的图片是120 x 120,但为什么会出现这些长长的随机名称?如何设置" red"," blue"或"绿色"仅作为玩家的名字?

我需要名字是完全的"红色","蓝色"或"绿色"因为我想稍后使用player.name来获得不同的功能。

3 个答案:

答案 0 :(得分:1)

可能有更好的方法可以做到这一点,但这是我想到的第一件事 - 让playerTexture变量包含一个元组数组,其中包含纹理和你想要给它的名字:

 var playerTexture = [(SKTexture, String)]()

  playerTexture.append((SKTexture(imageNamed: “red”), "red"))
  playerTexture.append((SKTexture(imageNamed: “blue”), "blue"))
  playerTexture.append((SKTexture(imageNamed: “green”), "green"))

  let rand = Int(arc4random_uniform(UInt32(playerTexture.count)))
  let chosenColor = playerTexture[rand].0 as SKTexture
  let colorName = playerTexture[rand].1
  let playerSkin = chosenColor

  player = SKSpriteNode(texture: playerSkin)
  player.size = CGSize(width: 50, height: 50)
  player.position = location
  self.addChild(player)
  player.name = colorName

答案 1 :(得分:1)

SKTexture获取文件名的唯一方法是使用类的文本表示

通过 CustomStringConvertible 协议,Swift可以轻松地将自定义类转换为字符串(例如,用于打印)。 (对早期实施的明显改进)

这是一个例子:

class X : CustomStringConvertible  {
  var description: String{
    return "This is class X"
  }
}

print(X()) //output is: "This is class X"

所以,如果你做了一个:

print(SKTexture())

你在Swift 2.2中的实际输出将是:

<SKTexture> '(null)' (0 x 0)

其中null是文件名。

要获取您的文件名,您可以这样做:

let filename = chosenColor.description.characters.split{$0 == " "}.map(String.init)[1].stringByReplacingOccurrencesOfString("\'", withString: "") as! NSString

<强>输出

red.png

<强>优点 - 易于操作,您可以获得 SKTexture

使用的真实文件名

<强>缺点 - 它不优雅,最后你从类中解析一个字符串,这可能会改变他的描述结构(例如,一个新元素可以添加到描述中,文件名可以位于第2位而不是实际索引在未来的iOS版本或Swift版本中,<SKTexture>之后的1,但这可能也会发生在代码的其他部分。

答案 2 :(得分:1)

如果您刚开始使用SpriteKit,我建议您创建SKSpriteNode的专用子类,并保留其中的所有行为和关注点。随着时间的推移,您会发​​现整个游戏逻辑的实现和维护都会更加简单。

public class PlayerNode:SKSpriteNode
{
   static let colorNames           = ["red","blue","green"]
   static let textures:[SKTexture] = PlayerNode.colorNames.map(){ SKTexture(imageNamed:$0) }

   init(randomAtLocation location:CGPoint)
   {
      let rand = Int(arc4random_uniform(UInt32(PlayerNode.colorNames.count)))
      super.init( texture: PlayerNode.textures[rand], 
                    color: UIColor.clearColor(), 
                     size: CGSize(width: 50, height: 50)
                )
      name     = PlayerNode.colorNames[rand]
      position = location
   }

   public required init?(coder aDecoder: NSCoder) { super.init(coder:aDecoder) }
}

因此,您的播放器初始化代码可能非常简单:

let player = PlayerNode(randomAtLocation:location)
self.addChild(player)