วางไข่ศัตรู

ในเกมของฉัน ฉันต้องการให้ศัตรูเกิดทุกๆ 10 วินาที ฉันพยายามทำสิ่งนี้ให้สำเร็จโดยการเขียนใน GameViewController

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

ในเมธอด viewWillLayoutSubviews จากนั้นใน SecondEnemyFunction ฉันเขียน:

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

    gameScene.enemy2Function()

จากนั้นในฟังก์ชั่นของศัตรู 2 ในคลาส 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
ในตัวจับเวลา การหมุนซ้ำเป็นจริง และปล่อยให้ฟังก์ชันพยายามวางไข่ศัตรูต่อไป บอกฉันว่าคุณสามารถทำให้ศัตรูปรากฏตัวอย่างน้อยหนึ่งครั้งได้หรือไม่   -  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
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/: ค้นหาไซต์ SO เกี่ยวกับคำถามที่สองของคุณ ฉันแน่ใจว่าสิ่งที่มีประโยชน์สามารถ พบเกี่ยวกับหัวข้อนั้น หรือถามคำถามใหม่ เนื่องจากความคิดเห็นไม่เหมาะกับคำถาม/คำตอบใหม่ - person Whirlwind; 12.08.2015