swift - 生成敌人

标签 swift sprite-kit nstimer

在我的游戏中,我希望每 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()

然后在 GameScene 类的敌人2Function 中我编写:

 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

在日志“调用!”中出现但敌人尚未生成。只是为了让你知道我确实通过以下方式在类(class)中创造了顶尖的敌人:

let enemy2 = SKSpriteNode(imageNamed: "enemy")

有谁知道我如何生成第二个敌人?预先感谢您!

-维尼

最佳答案

您应该让事情变得简单,并在 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


    }

}

说到定位,我假设您的场景已经具有正确的尺寸。如果场景未正确初始化并且与 View 具有不同的大小(或更准确地说,不同的纵横比),则敌人在生成时可能会离开屏幕位置。了解更多 here关于如何正确初始化场景大小。

关于swift - 生成敌人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31909725/

相关文章:

ios - SpriteKit - 如何正确暂停和恢复应用程序

cocoa - NSTimer - 设置普通 Vanilla - 不触发

ios - 如何在后台模式下运行 NStimer?

ios - Swift 中 NSTimer 的问题

swift - .sks 文件中 SKSpriteNode 的子类

json - 如何在 Swift 中从 JSON 解码大量数据

ios - 创建搜索文本字段

ios - 在 Objective-C 中访问 Swift OptionSetType

swift - CheckSum8 模 256 Swift

ios - 如何在我的 Sprite Kit 游戏应用程序中实现 Facebook 和 Twitter 发帖?