当SpriteNode关闭时,Swift中的分数增加

时间:2017-05-11 21:19:46

标签: ios swift sprite-kit skspritenode

我搜索了很多,但找不到任何有用的东西。 我正在使用Swift 3在SpriteKit中创建一个游戏。

SpriteNodes在屏幕的右侧产生,并使用SKActions进入屏幕的左侧,重复此过程。

我需要一种方法,当SpriteNode通过我的播放器时(在场景中间),分数会上升一个。

以下区块将我的敌人角色从右向左移动。

func createEnemyBird() {
    // Create Enemy Bird 1
    enemyBird1 = EnemyBird(imageNamed: "enemy 1")
    enemyBird1.position.x = self.frame.width + 100
    enemyBird1.position.y = CGFloat.randomBetweenNumbers(firstNum: -(self.frame.size.height / 2.8), secondNum: (self.frame.size.height / 2.4))
    enemyBird1.name = "EnemyBird1"
    enemyBird1.initialise()

    print(enemyBird1.position.y)

    // Add Physics Bodys
    enemyBird1.physicsBody = SKPhysicsBody(circleOfRadius: self.size.height/10)
    enemyBird1.physicsBody?.allowsRotation = false
    enemyBird1.physicsBody?.affectedByGravity = false
    enemyBird1.physicsBody?.isDynamic = false
    // Add Collision Bitmasks
    enemyBird1.physicsBody?.categoryBitMask = ColliderType.Pipes

    // Animate Enemy Bird
    var enemyBirdAnim = [SKTexture]()
    for i in 1..<5 {
        let enemyName = "enemy \(i)"
        enemyBirdAnim.append(SKTexture(imageNamed: enemyName))
    }
    let animateEnemyBird = SKAction.animate(with: enemyBirdAnim, timePerFrame: 0.08, resize: false, restore: true)
    enemyBird1.run(SKAction.repeatForever(animateEnemyBird))

    // Make enemy Bird Move Left
    let destination = self.frame.width * 2;
    let move = SKAction.moveTo(x: -destination, duration: TimeInterval(6));
    let remove = SKAction.removeFromParent();


    // Run Enemy Bird Mobe
    enemyBird1.run(SKAction.sequence([move, remove]), withKey: "Move")



    // Add Children to scene
    self.addChild(enemyBird1)

}

我也有一个功能但我不知道何时调用它

    // Score increase
func incrementScore() {
    if enemyBird1.position.x == -(self.frame.size.width/2) {
        score += 1
        scoreLabel.text = String(score)
    }
}

我试图在序列中添加一个SKAction Run Block来调用它,但是在它实际开始计数之前通过大约6个敌人角色并不能很好地工作(这很奇怪)...

3 个答案:

答案 0 :(得分:1)

一种解决方案是在incrementScore上的update方法中添加SKScene函数:

override func update(_ currentTime: TimeInterval) {

    if !enemyBird1.isScored {
        if enemyBird1.position.x > -self.frame.size.width / 2 {
            score += 1
            scoreLabel.text = String(score)
            enemyBird1.isScored = true
        }
    }

}

update方法将触发每一帧,并检查鸟是否已经通过屏幕中心。如果有,它将被标记为已经得分,因此不会再次计算。

这将要求您向isScored课程添加EnemyBird属性。

假设您的EnemyBirdSKSpriteNode,它将如下所示:

class EnemyBird: SKSpriteNode {

    var isScored = false

    // other properties, inits, functions, etc

}

答案 1 :(得分:1)

您可以考虑在EnemyBird中覆盖position,以便在鸟的位置发生变化时调用函数。例如,在EnemyBird类中,您可以添加如下内容:

 override var position: CGPoint {
    didSet {
        if self.position.x == theParentSceneLeftEdge {
        // call a function to update score
        } 
    }
 }

EnemyBird还需要知道theParentSceneLeftEdge的值,当你初始化EnemyBird时,你可以指定它等于场景左边缘的值。

希望这有帮助!

答案 2 :(得分:1)

你可以用SKActions完成整个事情。只需将移动分为两部分:首先移动到划线,然后移动剩下的部分。在两者之间,更新分数。此代码替换ws.Cells["A4"].Style.Indent = 5; 中的“让敌人向左移动”和“运行敌人鸟类”部分:

createEnemyBird()

您也可以从// first action moves to the score line let scoreLineDestination = -self.frame.width / 2 let moveToScoreLine = SKAction.moveTo(x: scoreLineDestination, duration: TimeInterval(3)); // second action calls your incrementScore() method let increment = SKAction.run(self.incrementScore) // third action moves the rest of the way let finalDestination = -self.frame.width * 2; let moveToFinal = SKAction.moveTo(x: finalDestination, duration: TimeInterval(3)); // finally remove let remove = SKAction.removeFromParent(); enemyBird1.run(SKAction.sequence([moveToScoreLine, increment, moveToFinal, remove]), withKey: "Move") 删除位置检查,因为您知道在鸟儿越过分数线之前不会被调用:

incrementScore()

这样你就不用担心哪只鸟叫它了。