我正在使用以下代码为我的游戏中的玩家生成随机图像。
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来获得不同的功能。
答案 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)