Рандомизируйте разных врагов в spritekit, чтобы двигаться к игроку

Мне было интересно, может ли кто-нибудь ответить на мой вопрос. Я создал 3 разных анимации врага с атласом текстур в наборе Sprite, и мне было интересно, есть ли способ случайного выбора врага, чтобы он двигался к игроку, как только игра начинается.

TextureAtlas = SKTextureAtlas(named: "zombies.atlas")
for i in 1...TextureAtlas.textureNames.count {
    let Z = "z\(i).png"
    zombieArray.append(SKTexture(imageNamed: Z))
}


TextureAtlas = SKTextureAtlas(named: "baldzomb.atlas")
for i in 1...TextureAtlas.textureNames.count {
    let bald = "baldzomb_\(i).png"
    baldArray.append(SKTexture(imageNamed: bald))
}

TextureAtlas = SKTextureAtlas(named: "crawler.atlas")
for i in 1...TextureAtlas.textureNames.count {
    let Name = "crawler_\(i).png"
    crawlerArray.append(SKTexture(imageNamed: Name))

}

person sicvayne    schedule 16.01.2017    source источник
comment
можешь выложить что ты пробовал   -  person MSU_Bulldog    schedule 16.01.2017
comment
Я еще не пробовал, я думал о создании функции возможного врага в моей функции spawnEnemy. Любые идеи относительно достижения этого?   -  person sicvayne    schedule 16.01.2017


Ответы (1)


Вы можете сделать это следующим образом:

class GameScene: SKScene {


    let storage = [
        SKSpriteNode(color:.brown, size:CGSize(width: 50, height: 50)),
        SKSpriteNode(color:.white, size:CGSize(width: 50, height: 50)),
        SKSpriteNode(color:.black, size:CGSize(width: 50, height: 50)),
        ]

    func getRandomSprite(fromArray array:[SKSpriteNode])->SKSpriteNode{

        return array[Int(arc4random_uniform(UInt32(array.count)))]
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)

        let sprite = getRandomSprite(fromArray: storage)

        if let location = touches.first?.location(in: self){

            if let copy = sprite.copy() as? SKSpriteNode {
                //sprite can have only one parent, so I add a copy, just because of better example
                copy.position = location
                addChild(copy)
            }
        }
    } 
}

Итак, в основном у вас есть массив спрайтов/текстур/что угодно, и вы генерируете случайный индекс на основе длины массива и возвращаете случайный элемент. Вы также можете сделать расширение и сделать что-то вроде yourArray.random.

person Whirlwind    schedule 16.01.2017
comment
@ The1steven2 Этот ответ правильный. Он правильно реагирует на случайный выбор любого из этих врагов. Я не понимаю, почему вы публикуете конструкцию текстурного атласа, которая не должна иметь никакого отношения к случайному выбору врагов. Что еще вы пытаетесь сделать? - person Alessandro Ornano; 17.01.2017
comment
@AlessandroOrnano, причина, по которой вы видите TextureAtlas, заключается в том, что я отредактировал заголовок после того, как на мой вопрос был дан ответ. - person sicvayne; 17.01.2017
comment
Ну, вы должны изменить и свой вопрос, потому что это непонятно. Добавьте новый запрос под своим первым запросом, в противном случае и вопрос, и пользователь, который отвечает до ваших изменений, несовместимы. - person Alessandro Ornano; 17.01.2017
comment
@ The1steven2 Как правило, вы не должны этого делать. Вам лучше задать новый вопрос... - person Whirlwind; 17.01.2017
comment
понял, я опубликую новый вопрос и, надеюсь, все это будет немного понятнее - person sicvayne; 17.01.2017
comment
Хорошо, но, пожалуйста, измените этот вопрос на правильный заголовок. Я не мог понять, что происходит. Спасибо. И отметьте ответ, иначе эта тема останется открытой без объяснения причин. - person Alessandro Ornano; 17.01.2017
comment
@ The1steven2 О перемещении вещей к другим (движущимся) вещам: заголовок ="как переместить врага к движущемуся игроку"> stackoverflow.com/questions/36230619/ - person Whirlwind; 17.01.2017
comment
@ The1steven2 The1steven2 Как указал Алессандро, вы можете отменить свое редактирование, чтобы сделать этот вопрос полезным для будущих читателей. Также, пожалуйста, подумайте о том, чтобы принять этот ответ, если он помог вам решить вашу проблему. Вы делаете это, нажимая галочку рядом с ответом. - person Whirlwind; 17.01.2017
comment
@Whirlwind, уже принял, извините за беспокойство. Я разместил еще один вопрос, и, надеюсь, это будет немного яснее! :] - person sicvayne; 17.01.2017