如何在每次触摸SKNode时加1点

How to add 1 point every time SKNode is touched

我创建了一个涉及落球的游戏。每次玩家点击一个球,他们都应该得到一分。我设置了分数标签,但它只是停留在 0。

我的代码有问题吗?

我使用 GameElements.swift 文件作为扩展名。这是文件:

extension GameScene {
    //1st Ball//
    func createPlayer() -> SKNode {
        
        let playerNode = SKNode()
        playerNode.position = CGPoint(x:self.size.width / 2, y:440)
        
        let sprite = SKSpriteNode(imageNamed: "Ball")
        sprite.name = "ballPoints"
        playerNode.addChild(sprite)
        
        playerNode.physicsBody = SKPhysicsBody(circleOfRadius: 120)
        
        playerNode.physicsBody?.dynamic = true
        playerNode.physicsBody?.allowsRotation = false
        
        playerNode.physicsBody?.restitution = 3
        playerNode.physicsBody?.friction = 0
        playerNode.physicsBody?.angularDamping = 0
        playerNode.physicsBody?.linearDamping = 0
        
        playerNode.physicsBody?.usesPreciseCollisionDetection = true
        
        
        playerNode.physicsBody?.categoryBitMask = CollisionBitMask.Player
        
        playerNode.physicsBody?.categoryBitMask = 0
        
        return playerNode
    }
}

这里是 GameScene.swift 文件:

class GameScene: SKScene {
    
    var foreground: SKNode!
    var hud: SKNode!
    var firstBall: SKNode!
    
    var scoreLabel: SKLabelNode!
    
    private var score = 0
    override func didMoveToView(view: SKView) {
        
        
        scoreLabel = SKLabelNode(fontNamed:"Geared-Slab")
        scoreLabel.fontColor = UIColor.blackColor()
        scoreLabel.position = CGPoint( x: self.frame.midX, y: 3 * self.frame.size.height / 4 )
        scoreLabel.fontSize = 100.0
        scoreLabel.zPosition = 100
        scoreLabel.text = String(score)
        self.addChild(scoreLabel)
    }
    
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        for touch: AnyObject in touches {
            let location = touch.locationInNode(self)
            if(firstBall.containsPoint(location)) {
                firstBall.physicsBody?.velocity = CGVectorMake(0, 600)
                firstBall.physicsBody?.applyImpulse(CGVectorMake(0, 1100))
                
                
            }
            if
                let touch : UITouch! = touches.first,
                let tappedSprite = nodeAtPoint(touch!.locationInNode(self)) as? SKSpriteNode,
                let scoreLabel = childNodeWithName("scoreLabel") as? SKLabelNode
                where tappedSprite.name == "ballPoints" {
                score += 1
                scoreLabel.text = "Score: \(score)"
            }
        }
    }
    
    override init(size:CGSize) {
        super.init(size: size)
        
        foreground = SKNode()
        addChild(foreground)
        
        
        //1st Ball//
        firstBall = createPlayer()
        foreground.addChild(firstBall)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
}

我知道这是很多代码,但我希望专家能够自己测试代码。对于背景,我遵循了本教程:https://www.youtube.com/watch?v=0gOi_2Jwt28 直到某个点。

第 1 步

首先让我们为 Ball

创建一个 class
class Ball: SKSpriteNode {
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        let scene = self.scene as! GameScene
        scene.score += 1
    }
}

第 2 步

然后在createPlayer()里面我们替换这个

let sprite = SKSpriteNode(imageNamed: "Ball")

有了这个

let sprite = Ball(imageNamed: "Ball")
sprite.userInteractionEnabled = true

步骤 3

让我们从 GameScene 中删除 touchesBegan

更新

此代码对我来说按预期工作

class GameScene: SKScene {

    var scoreLabel: SKLabelNode!
    var ball: Ball!
    private var score = 0 {
        didSet {
            scoreLabel.text = "\(score)"
            print(score)

        }
    }

    override func didMoveToView(view: SKView) {
        let ball = Ball()
        ball.position = CGPoint(x:frame.midX, y: frame.midY)
        addChild(ball)
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        // this is called when you tap outside of the Ball
        // use self.ball to make the ball to jump
    }
}

class Ball: SKSpriteNode {

    init() {
        let texture = SKTexture(imageNamed: "ball")
        super.init(texture: texture, color: .clearColor(), size: texture.size())
        userInteractionEnabled = true
    }


    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        let scene = self.scene as! GameScene
        scene.score += 1
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}