Создание врага

В моей игре я хочу, чтобы враг появлялся каждые 10 секунд. Я пытаюсь сделать это, написав в GameViewController

var secondEnemyTimer = NSTimer.scheduledTimerWithTimeInterval(10.0, target: self, selector: "secondEnemyFunction", userInfo: nil, repeats: false)

в методе viewWillLayoutSubviews. Затем во второй EnemyFunction я пишу:

let skView = self.view as! SKView
    let gameScene = GameScene(size: skView.bounds.size)

    gameScene.enemy2Function()

Затем в функции evil2Function в классе GameScene пишу:

 println("Called!")

    enemy2.name = enemyCategoryName

    enemy2.size.width = 57
    enemy2.size.height = 57

    let randomX = randomInRange(Int(CGRectGetMinX(self.frame)), hi: Int(CGRectGetMaxX(self.frame)))
    let randomY = randomInRange(Int(CGRectGetMinY(self.frame)), hi: Int(CGRectGetMaxY(self.frame)))
    let randomPoint = CGPoint(x: randomX, y: randomY)
    enemy2.position = randomPoint

    self.addChild(enemy2)

    enemy2.physicsBody = SKPhysicsBody(circleOfRadius: enemy1.size.width / 2)
    enemy2.physicsBody?.friction = 0
    enemy2.physicsBody?.restitution = 1
    enemy2.physicsBody?.linearDamping = 0
    enemy2.physicsBody?.allowsRotation = false

    enemy2.physicsBody?.applyImpulse(CGVectorMake(50, -50))

    enemy2.physicsBody?.categoryBitMask = enemyCategory

В журнале "Вызывается!" появляются, но враг еще не создан. Просто чтобы вы знали, что я создал врага на вершине класса, выполнив:

let enemy2 = SKSpriteNode(imageNamed: "enemy")

Кто-нибудь знает, как я могу вызвать своего второго врага? Заранее спасибо!

-Винни


person vinny_711    schedule 09.08.2015    source источник
comment
в таймере ход повторяется до true, и пусть функция пытается продолжать порождать врага. скажи мне, сможешь ли ты заставить врага появиться хотя бы один раз   -  person MaxKargin    schedule 10.08.2015
comment
@ M321K Спасибо за ответ. Я продолжал получать Called! в журнале каждые десять секунд, но врагов не появлялось. Любые идеи?   -  person vinny_711    schedule 10.08.2015
comment
Если не использовать генератор случайных значений, а просто указать центр экрана для врага, он появится?   -  person MaxKargin    schedule 10.08.2015
comment
@ M321K Спасибо, что ответили еще раз. К сожалению нет, враг не появляется :(   -  person vinny_711    schedule 10.08.2015
comment
Возможно, есть фоновый спрайт-узел, который может его скрывать? Вы устанавливаете точку привязки сцены в любом месте, чтобы узлы могли быть в неправильных местах?   -  person MaxKargin    schedule 10.08.2015
comment
@ M321K Спасибо за ответ. Нет никаких фоновых узлов, чтобы заблокировать его, и нет, я нигде не устанавливаю точку привязки сцены, чтобы узлы были в неправильных местах. Еще раз спасибо.   -  person vinny_711    schedule 10.08.2015


Ответы (1)


Вы должны быть проще и просто делать все внутри GameScene. Другое дело — сбросить NSTimer и использовать SKAction для создания врагов. NSTimer не учитывает состояние паузы сцены, поэтому в конечном итоге у вас могут возникнуть проблемы. Вот как вы можете создавать врагов с помощью SKAction:

GameScene.swift:

import SpriteKit

class GameScene: SKScene {


    override func didMoveToView(view: SKView) {

        generateEnemies()
    }

    func stopGeneratingCoins(){


        if(self.actionForKey("spawning") != nil){removeActionForKey("spawning")}

    }

    func generateEnemies(){

        if(self.actionForKey("spawning") != nil){return}



        let timer = SKAction.waitForDuration(10)

        //let timer = SKAction.waitForDuration(10, withRange: 3)//you can use withRange to randomize duration


        let spawnNode = SKAction.runBlock {


            var enemy = SKSpriteNode(color: SKColor.greenColor(), size:CGSize(width: 40, height:40))
            enemy.name = "enemy" // name it, so you can access all enemies at once.

            //spawn enemies inside view's bounds
            let spawnLocation = CGPoint(x:Int(arc4random() % UInt32(self.frame.size.width - enemy.size.width/2) ),
                y:Int(arc4random() %  UInt32(self.frame.size.height - enemy.size.width/2)))

            enemy.position = spawnLocation


            self.addChild(enemy)

            println(spawnLocation)

        }

        let sequence = SKAction.sequence([timer, spawnNode])


        self.runAction(SKAction.repeatActionForever(sequence) , withKey: "spawning") // run action with key so you can remove it later


    }

}

Когда дело доходит до позиционирования, я предположил, что ваша сцена уже имеет правильный размер. Если сцена неправильно инициализирована и имеет другой размер (точнее, другое соотношение сторон), чем представление, может случиться так, что враг при появлении окажется за кадром. Узнайте больше здесь о том, как правильно инициализировать размер сцены.

person Whirlwind    schedule 10.08.2015
comment
Большое спасибо за ответ! этот код работает отлично, но можно ли как-то ограничить количество появляющихся врагов? Я знаю, что прошу многого, но могу ли я применить импульс к каждому врагу в случайном направлении? Еще раз большое спасибо. - person vinny_711; 12.08.2015
comment
@vinny_711 Вы можете использовать некоторую переменную-счетчик, чтобы подсчитать, сколько врагов было создано, и при необходимости удалить клавишу действия. Или вы можете повторить действие указанное количество раз: developer.apple.com/library/prerelease/ios/documentation/: выполните поиск на ТАК-сайте по вашему второму вопросу, я уверен, что может быть что-то полезное нашел по этой теме. Или задайте новый вопрос, т.к. комментарии не подходят для новых вопросов/ответов. - person Whirlwind; 12.08.2015