在if语句中更改计时器的间隔

时间:2016-04-15 05:27:45

标签: swift sprite-kit

我正在创建一个游戏,其中包含一个计时器,该计时器每秒都会在屏幕上产生对象。要获得积分,你必须抓住物体。

一旦玩家达到一定数量的积分,我希望产卵率增加。

我试过这样做是通过将定时器的间隔指定为1秒的整数(SpeedNumber)值来启动并且已经创建和if语句一旦玩家达到一定量就应该将该整数更改为0.5分数。这对我来说很有意义,但它不起作用。

为什么这不起作用,我应该改变什么?

import SpriteKit

struct physicsCatagory {
    static let person : UInt32 = 0x1 << 1
    static let Ice : UInt32 = 0x1 << 2
    static let IceTwo : UInt32 = 0x1 << 3
    static let IceThree : UInt32 = 0x1 << 4
    static let Score : UInt32 = 0x1 << 5
}


class GameScene: SKScene, SKPhysicsContactDelegate {


   var scorenumber = Int()
    var lifenumber = Int()
    var SpeedNumber : Double = 0.5
    var person = SKSpriteNode(imageNamed: "Person")
    let Score = SKSpriteNode()
    var ScoreLable = SKLabelNode()


    override func didMoveToView(view: SKView) {

        self.scene?.backgroundColor = UIColor.purpleColor()

        physicsWorld.contactDelegate = self

        self.scene?.size = CGSize(width: 640, height: 1136)

        lifenumber = 0
        SpeedNumber = 1

         Score.size = CGSize(width: 648, height: 1)
        Score.position = CGPoint(x: 320, y: -90)
        Score.physicsBody = SKPhysicsBody(rectangleOfSize: Score.size)
        Score.physicsBody?.affectedByGravity = false
        Score.physicsBody?.dynamic = false
        Score.physicsBody?.categoryBitMask = physicsCatagory.Score
        Score.physicsBody?.collisionBitMask = 0
        Score.physicsBody?.contactTestBitMask = physicsCatagory.IceThree
        Score.color = SKColor.blueColor()
        self.addChild(Score)



        person.position = CGPointMake(self.size.width/2, self.size.height/12)
        person.setScale(0.4)
        person.physicsBody = SKPhysicsBody(rectangleOfSize: person.size)
        person.physicsBody?.affectedByGravity = false
        person.physicsBody?.categoryBitMask = physicsCatagory.person
        person.physicsBody?.contactTestBitMask = physicsCatagory.Ice
        person.physicsBody?.collisionBitMask = physicsCatagory.Ice
        person.physicsBody?.dynamic = false




        ScoreLable.position = CGPoint(x: self.frame.width / 2, y: 1000)
        ScoreLable.text = "\(scorenumber)"
        ScoreLable.fontColor = UIColor.yellowColor()
        ScoreLable.fontSize = 100
        ScoreLable.fontName = "Zapfino "
        self.addChild(ScoreLable)



        var IceThreeTimer = NSTimer.scheduledTimerWithTimeInterval(SpeedNumber, target: self, selector: ("spawnThirdIce"), userInfo: nil, repeats: true)


        self.addChild(person)





    }




     func didBeginContact(contact: SKPhysicsContact) {
            let firstBody = contact.bodyA
            let secondBody = contact.bodyB


        if firstBody.categoryBitMask == physicsCatagory.person && secondBody.categoryBitMask == physicsCatagory.IceThree || firstBody.categoryBitMask == physicsCatagory.IceThree && secondBody.categoryBitMask == physicsCatagory.person{

           scorenumber++

            if scorenumber == 5 {

              SpeedNumber = 0.5


            }


            ScoreLable.text = "\(scorenumber)"
            CollisionWithPerson(firstBody.node as! SKSpriteNode, Person: secondBody.node as! SKSpriteNode)


        }

        if firstBody.categoryBitMask == physicsCatagory.Score && secondBody.categoryBitMask == physicsCatagory.IceThree ||
            firstBody.categoryBitMask == physicsCatagory.IceThree && secondBody.categoryBitMask == physicsCatagory.Score{
                lifenumber++

                if lifenumber == 3{

            self.view?.presentScene(EndScene())

        }

               //self.view?.presentScene(EndScene())

        }
    }



    func CollisionWithPerson (Ice: SKSpriteNode, Person: SKSpriteNode){

      Person.removeFromParent()

    }



    func spawnThirdIce(){

        var Ice = SKSpriteNode(imageNamed: "Ice")
        Ice.setScale(0.9)
        Ice.physicsBody = SKPhysicsBody(rectangleOfSize: Ice.size)
        Ice.physicsBody?.categoryBitMask = physicsCatagory.IceThree
        Ice.physicsBody?.contactTestBitMask = physicsCatagory.person | physicsCatagory.Score
        Ice.physicsBody?.affectedByGravity = false
        Ice.physicsBody?.dynamic = true
        let MinValue = self.size.width / 8
        let MaxValue = self.size.width - 20
        let SpawnPoint =  UInt32(MaxValue - MinValue)
        Ice.position = CGPoint(x: CGFloat(arc4random_uniform(SpawnPoint)), y: self.size.height)
        self.addChild(Ice)

        let action = SKAction.moveToY(-85, duration: 2.5)
        let actionDone = SKAction.removeFromParent()
        Ice.runAction(SKAction.sequence([action,actionDone]))


    }



    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {


        for touch in touches {
            let location = touch.locationInNode(self)

         person.position.x = location.x



                   }
    }
    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {

        for touch in touches {
            let location = touch.locationInNode(self)

            person.position.x = location.x



        }
    }




    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
    }
}

2 个答案:

答案 0 :(得分:1)

你可以按照以下方式做你想做的事:

首先声明2个属性(在您的类中但在所有函数定义之外)

var timeOfLastSpawn: CFTimeInterval = 0.0
var timePerSpawn: CFTimeInterval = 1.0

然后,在Update中,检查是否已超出timePerSpawn。如果是这样,请调用生成新对象的spawn进程,然后重置自上次生成以来的时间:

override func update(currentTime: CFTimeInterval) {
    /* Called before each frame is rendered */
    if (currentTime - timeOfLastSpawn > timePerSpawn) {
       spawnObject()
       self.timeOfLastSpawn = currentTime
    }
}

func spawnObject() {
       // Your spawn code here
}

使生成过程成为一个单独的函数的优点是你可以从didMoveToView或任何其他地方调用它来生成正常时间控制周期之外的对象。

您可以根据需要更改timePerSpawn的值,以控制生成对象的速率。

您还可以考虑创建一个以指定的时间间隔运行SKAction的{​​{1}},但我认为要更改生成对象的速率,您必须删除并重新创建 - 创建SKAction,但你可以在timePerSpawn的setter中执行此操作。

你不应该真正使用NSTimer是SpriteKit,因为SpriteKit引擎将不知道计时器正在做什么并且无法控制它(一个例子是如果设置场景,计时器继续运行暂停了。)

答案 1 :(得分:0)

您应该将var IceThreeTimer的声明移动到类级别(在方法之外,在您声明SpeedNumber的位置。这将确保指针的句柄在两者中都可用didMoveToViewdidBeginContact方法。

didMoveToView中,您将声明更改为:

// I removed the "var"
IceThreeTimer = NSTimer.scheduledTimerWithTimeInterval(SpeedNumber, target: self, selector: ("spawnThirdIce"), userInfo: nil, repeats: true)

然后在didBeginContact修改:

if scorenumber == 5 {
   SpeedNumber = 0.5
   // Stop the already running timer
   IceThreeTimer.invalidate()
   // Schedule a new timer
   IceThreeTimer = NSTimer.scheduledTimerWithTimeInterval(SpeedNumber, target: self, selector: ("spawnThirdIce"), userInfo: nil, repeats: true)
}