2016-07-18 5 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 

Код выше генерирует случайный SKTexture (красный, синий или зеленый), называемый playerSkin.

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

Right. Невозможно получить имя из самой «SKTexture», поэтому вам нужно сохранить строку, которую вы использовали для ее создания. (Один из способов упростить - это * только * сохранить строку и инициализировать встроенную строку SKTexture при назначении 'selectedColor'.) – 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()) 

ваш фактический выход в 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 вместо фактического индекс 1 после <SKTexture>) в будущей версии выпуска 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

Смежные вопросы