touchesBegan()无法正常工作

时间:2016-07-14 21:37:45

标签: ios sprite-kit swift2 xcode7 touchesbegan

我正在创建一个简单的spritekit游戏,你试图将球放入一个洞中,并为此得分。我在屏幕顶部有2个标签,分别是“Balls left:#”和“Score:#”。我正在使用 touchesBegan方法来表示球应该从触摸屏幕的位置掉落。当他们触摸屏幕时,我还想减少他们留下的球数,然后更新“Balls Left”标签。但是,当我尝试实现同时丢球并将球数减少1的代码时,球不会出现,但分数标签会正确更新。我认为这是因为标签更新覆盖了丢球的功能。关于如何解决这个问题的任何建议都太棒了!我的代码在下面!在此先感谢:)

这是我在GameScene.swift中的代码

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

        for touch in touches {

            let ball = SKSpriteNode(imageNamed:"ball")

            ball.xScale = 0.04
            ball.yScale = 0.04
            ball.position = touch.locationInNode(self)


            ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.height / 2)

            self.addChild(ball)
        }


    }

这是我在viewController.swift中的代码

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        ballsLeftInt -= 1
        testEndGame()
    }

1 个答案:

答案 0 :(得分:0)

您可以使用总球数限制生成的球数。 假设您希望玩家在每场比赛中有10个球掉落。 在GameScene.swift中,设置全局值

var ballNum = 10

然后在TouchesBegin方法

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

    if ballNum > 0 {

        for touch in touches {

            let ball = SKSpriteNode(imageNamed:"ball")

            ball.xScale = 0.04
            ball.yScale = 0.04
            ball.position = touch.locationInNode(self)


            ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.height / 2)

            self.addChild(ball)
            ballNum -= 1
            //tell VC to update the two labels in your VC
        }

    }else {
        //tell VC game over and reload ballNum after user click replay
    }
}

通过使用NSNotificationCenter的观察者可以实现告诉VC的方法。

因此,在VC的视图中加载,你必须添加两个观察者,一个用于更新UI标签,一个用于游戏结束。

在VC中,重写viewDidLoad

    override func viewDidLoad() {
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.updateScore), name: "updateScore", object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.informGameOver), name: "informGameOver", object: nil)

}

并添加两个功能,

    func updateScore() {
    // update your labels
}

func informGameOver() {
    // tell the player game over and offer the play again button
}

现在,回到touchesBegan方法,你可以通过帖子通知告诉VC,最后的方法就像

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

if ballNum > 0 {

    for touch in touches {

        let ball = SKSpriteNode(imageNamed:"ball")

        ball.xScale = 0.04
        ball.yScale = 0.04
        ball.position = touch.locationInNode(self)


        ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.height / 2)

        self.addChild(ball)
        ballNum -= 1
        NSNotificationCenter.defaultCenter().postNotificationName("updateScore", object: nil)
    }

}else {
            NSNotificationCenter.defaultCenter().postNotificationName("informGameOver", object: nil)

}

}