Memunculkan Musuh

Dalam permainan saya, saya ingin musuh muncul setiap 10 detik. Saya mencoba mencapai ini dengan, di GameViewController, menulis

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

dalam metode viewWillLayoutSubviews. Kemudian di fungsi musuh kedua saya menulis:

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

    gameScene.enemy2Function()

Kemudian di musuh2Function di kelas GameScene saya menulis:

 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

Di log "Dipanggil!" muncul namun musuh belum muncul. Asal tahu saja, saya menciptakan musuh di kelas teratas dengan melakukan:

let enemy2 = SKSpriteNode(imageNamed: "enemy")

Adakah yang tahu bagaimana saya bisa menelurkan musuh kedua saya? Terima kasih sebelumnya!

-Vinny


person vinny_711    schedule 09.08.2015    source sumber
comment
di pengatur waktu, putar berulang ke benar dan biarkan fungsinya mencoba terus memunculkan musuh. beri tahu saya jika Anda bisa membuat musuh muncul setidaknya sekali   -  person MaxKargin    schedule 10.08.2015
comment
@ M321K Terima kasih telah merespons. Saya terus menerima panggilan! di log setiap sepuluh detik namun tidak ada musuh yang muncul. Ada ide?   -  person vinny_711    schedule 10.08.2015
comment
Jika Anda tidak menggunakan generator nilai acak dan hanya menentukan bagian tengah layar untuk musuh, apakah itu muncul?   -  person MaxKargin    schedule 10.08.2015
comment
@ M321K Terima kasih telah merespons lagi. Sayangnya tidak, musuh tidak muncul :(   -  person vinny_711    schedule 10.08.2015
comment
Apakah ada node sprite latar belakang yang mungkin menyembunyikannya? Apakah Anda menyetel titik jangkar adegan di mana saja sehingga mungkin node berada di tempat yang salah?   -  person MaxKargin    schedule 10.08.2015
comment
@ M321K Terima kasih telah merespons. Tidak, tidak ada node latar belakang yang memblokirnya dan tidak, saya tidak mengatur titik jangkar adegan di mana pun sehingga node berada di tempat yang salah. Terima kasih lagi.   -  person vinny_711    schedule 10.08.2015


Jawaban (1)


Anda harus menjaga semuanya tetap sederhana dan melakukan semuanya di dalam GameScene. Hal lainnya adalah menjatuhkan NSTimer dan menggunakan SKAction untuk menelurkan musuh. NSTimer tidak menghormati keadaan adegan yang dijeda, sehingga pada akhirnya Anda dapat mendapat masalah. Inilah cara menelurkan musuh menggunakan 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


    }

}

Dalam hal penentuan posisi, saya berasumsi bahwa adegan Anda sudah memiliki ukuran yang tepat. Jika adegan tidak diinisialisasi dengan benar dan memiliki ukuran yang berbeda (atau lebih tepatnya, rasio aspek berbeda) dari tampilan, bisa saja musuh berada di luar layar saat muncul. Baca selengkapnya di sini tentang cara menginisialisasi ukuran adegan dengan benar.

person Whirlwind    schedule 10.08.2015
comment
Terima kasih banyak telah merespons! kode ini berfungsi dengan sempurna, tetapi apakah saya dapat membatasi berapa banyak musuh yang muncul? Saya tahu saya meminta banyak hal, tetapi apakah saya bisa menerapkan dorongan ke setiap musuh dalam arah yang acak? Sekali lagi terima kasih banyak. - person vinny_711; 12.08.2015
comment
@ vinny_711 Anda dapat menggunakan beberapa variabel penghitung untuk menghitung berapa banyak musuh yang muncul, dan menghapus kunci tindakan bila diperlukan. Atau Anda dapat mengulangi tindakan sebanyak jumlah yang ditentukan: developer.apple.com/library/prerelease/ios/documentation/: Cari situs SO tentang pertanyaan kedua Anda, saya yakin ada sesuatu yang bermanfaat ditemukan tentang topik itu. Atau ajukan pertanyaan baru, karena komentar tidak cocok untuk pertanyaan/jawaban baru. - person Whirlwind; 12.08.2015