2016-07-18 99 views
2

我正在使用以下代碼爲我的遊戲中的玩家生成隨機圖像。將名稱設置爲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(player.name) 

然而,當我檢查了球員的名字,它顯示爲這取決於隨機圖像以下的一個選擇:

可選(」 \‘紅色\’(120×120) 「)

可選(」 \ '藍\'(120×120) 「)

可選(」 \ '綠色\'(120×120) 「)

我的圖片被稱爲」 紅「,」藍色「和」綠色「,位於Assets.xc Xcode中的資產文件夾。

我的圖像是120 x 120,但爲什麼這些長的隨機名出現?我怎樣才能將「紅色」,「藍色」或「綠色」作爲玩家的名字?

我需要名稱纔是正確的「紅色」,「藍色」或「綠色」,因爲我想稍後使用player.name用於不同的功能。

回答

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 
+0

權。沒有辦法從'SKTexture'本身檢索名字,所以你需要存儲你用來創建它的字符串。 (簡化的一種方法是僅*存儲字符串,並在分配'selectedColor'時初始化內聯'SKTexture'。) – andyvn22

+0

感謝claassenApps!這是最簡單的方法!我是編程新手,所以這是完美的。乾杯! – Questions

1

SKTexture獲取文件名的唯一方法是使用類別文本表示

Swift通過CustomStringConvertible協議可以輕鬆地將自定義類轉換爲字符串(例如用於打印)。 (在早期的實現明顯改善)

這是一個例子:

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

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

所以,如果你犯了一個:

print(SKTexture()) 

在雨燕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而不是實際的在<SKTexture>之後的索引1)在未來的iOS版本或Swift版本中,但這也可能發生在代碼的其他部分。

+0

太棒了!很難追隨,但輝煌。 – Confused

+0

有無論如何,你可以使用類似的東西來通過一個文件夾,並拔出所有要使用的圖像,並命名後續節點? http://stackoverflow.com/questions/39811334/folder-of-images-create-and-fill-skshapenodes-1-of-each – Confused

+0

我試着給你也有答案:) –

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) 
+0

是這樣的:「 PlayerNode.colorNames.map(){SKTexture(imageNamed:$ 0)}「一些穿過所有紋理的魔法巫術? – Confused

+0

除了關於數組巫術的混淆外,我還要補充,謝謝!代碼體系結構提示是無價的。謝謝!!! – Confused

+0

而且,如果您有一段時間......我如何更改此行以反映正在加載的圖像的大小,而不是隨意的? 「size:CGSize(width:50,height:50)」 – Confused