我正在创建一个简单的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()
}
答案 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)
}
}