从 Swift 中的 SKSpriteNode 子类更新 SKScene 中保存的游戏分数
Updating game score held in SKScene from a SKSpriteNode subclass in Swift
我们有一个主游戏场景 SKScene
,它包含 HUD 逻辑和分数。
我们还有一个对象的子类 SKSpriteNode
。当对象被点击时,我们在 SKSpriteNode
子类中处理触摸。
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
我们想要做的是在点击一个游戏场景时更新保存在游戏场景中的分数。如何实现?
I assume that
GameScene
有一个名为 "scoreLabel"
的 child SKLabelNode
"scoreLabel"
显示当前游戏比分
- GameScene 有一个名为
"mySprite"
的 child SKSpriteNode
- 当
"mySprite"
被点击时,分数必须增加1
- GameScene 有一个私有 属性
var score = 0
This is how you should implement touchesBegan:withEvent
class GameScene: SKScene {
private var score = 0
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
if
let touch = touches.first as? UITouch,
let tappedSprite = nodeAtPoint(touch.locationInNode(self)) as? SKSpriteNode,
let scoreLabel = childNodeWithName("scoreLabel") as? SKLabelNode
where tappedSprite.name == "mySprite" {
score += 1
scoreLabel.text = "Score: \(score)"
}
}
}
Explanation
第一个条件选择第一个接收到的触摸。如果至少有一个触摸,这将成功。 (理论上这条线永远不会失败。)
第二个条件确实检索了包含触摸点的 SKNode
,然后尝试将此节点转换为 SKSpriteNode
。
第三个条件尝试检索名称为 "scoreLabel"
的 SKLabelNode
。
where 检查检索到的 sprite 是否具有名称 "mySprite"
。
如果这 4 个条件都成功,那么私人 属性 分数会增加 1,并且标签的文本会更新。
希望这对您有所帮助。
我们有一个主游戏场景 SKScene
,它包含 HUD 逻辑和分数。
我们还有一个对象的子类 SKSpriteNode
。当对象被点击时,我们在 SKSpriteNode
子类中处理触摸。
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
我们想要做的是在点击一个游戏场景时更新保存在游戏场景中的分数。如何实现?
I assume that
GameScene
有一个名为"scoreLabel"
的 child "scoreLabel"
显示当前游戏比分- GameScene 有一个名为
"mySprite"
的 child - 当
"mySprite"
被点击时,分数必须增加1 - GameScene 有一个私有 属性
var score = 0
SKLabelNode
SKSpriteNode
This is how you should implement touchesBegan:withEvent
class GameScene: SKScene {
private var score = 0
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
if
let touch = touches.first as? UITouch,
let tappedSprite = nodeAtPoint(touch.locationInNode(self)) as? SKSpriteNode,
let scoreLabel = childNodeWithName("scoreLabel") as? SKLabelNode
where tappedSprite.name == "mySprite" {
score += 1
scoreLabel.text = "Score: \(score)"
}
}
}
Explanation
第一个条件选择第一个接收到的触摸。如果至少有一个触摸,这将成功。 (理论上这条线永远不会失败。)
第二个条件确实检索了包含触摸点的 SKNode
,然后尝试将此节点转换为 SKSpriteNode
。
第三个条件尝试检索名称为 "scoreLabel"
的 SKLabelNode
。
where 检查检索到的 sprite 是否具有名称 "mySprite"
。
如果这 4 个条件都成功,那么私人 属性 分数会增加 1,并且标签的文本会更新。
希望这对您有所帮助。