Swift   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Swift开发Sprite Kit游戏实践(四):背景音乐与Game Over大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

Game Over! 如果monkey跟敌人相撞,或落出屏幕的话,就会显示”Game Over“,接着出现重新点击开始游戏的画面。 首先将以下所有变量添加到GameScene顶端,在 let player = SKSpriteNode(imagenamed:”spacemonkey_fly02”)之后: // 1 var gameOver = false // 2 let endLabel = S
  • Game Over!

如果monkey跟敌人相撞,或落出屏幕的话,就会显示”Game Over“,接着出现重新点击开始游戏的画面。

首先将以下所有变量添加到GameScene顶端,在 let player = SKSpriteNode(imagenamed:”spacemonkey_fly02”)之后:

// 1 var gameOver = @H_197_31@false // 2 let endLabel = SKLabelNode(text: "Game Over") let endLabel2 = SKLabelNode(text: "Tap to restart!") let touchToBeginLabel  
            = SKLabelNode(text: "Touch to begin!") let points = SKLabelNode(text: "0")  
            // 3 var numPoints = 0 // 4 let explosionSound = SKAction.playSoundFilenamed("explosion.mp3",waitForCompletion: @H_197_31@true) let coinSound = SKAction.playSoundFilenamed("coin.wav",waitForCompletion: @H_197_31@false)

再回顾一下上述步骤:

  1. 首先创建一个gameOver布尔变量,不论游戏是否结束,都进行跟踪记录。
  2. 创建一些label node,好在Sprite Kit中设置屏幕上显示的字幕。
  3. 创建Integer储存分数。注意,用var来标记 Integer,不是let,方便之后进行修改
  4. 最后创建一些action,随后制造音效。
  5. @H_197_99@

    下一步创建名为setupLabels()的新方法

    func setupLabels() {  
      // 1  
      touchToBeginLabel.position = CGPoint(x: frame.size.width/2,y: frame.size.height/2)  
      touchToBeginLabel.fontColor = UIColor.whiteColor()  
      touchToBeginLabel.fontSize = 50  
      addChild(touchToBeginLabel)  
    
      // 2    
      points.position = CGPoint(x: frame.size.width/2,y: frame.size.height * 0.1)  
      points.fontColor = UIColor.whiteColor()  
      points.fontSize = 100  
      addChild(points)  
    }

    再回顾一下上述步骤:

    1. 将“touch to begin(点击开始)”标签放在屏幕中央,字体白色,大小50pt。
    2. 将position label设在屏幕底端,白色,大小100。
    3. @H_197_99@

      现在在didMoveToView(_:)里调用setupLabels():

      setupLabels()

      再删掉touchesBegan(_:withEvent:),添加如下代码

      override func touchesBegan(touches: Set<NSObject>,withEvent event: UIEvent) {  
        // 1 
        if (!gameOver) {  
          if player.physicsBody?.dynamic == false {  
            player.physicsBody?.dynamic = true  
            touchToBeginLabel.hidden = true  
            BACkgroundColor = SKColor.blackColor()  
      
            runAction(SKAction.repeatActionForever(  
              SKAction.sequence([  
                SKAction.runBlock(spawnEnemy),SKAction.waitForDuration(1.0)])))  
          }  
          // 2 
          jumpPlayer()  
      
        }  
        // 3 
        else if (gameOver) {  
          let newScene = GameScene(size: sizE)  
          newScene.scaleMode = scaleMode  
          let reveal = SKTransition.flipHorizontalWithDuration(0.5)  
          view?.presentScene(newScene,transition: reveal)  
        }  
      }

      回顾一下:

      1. 如果游戏还没结束,monkey还处于非动态(受物理引擎控制),同样说明新游戏还没开始。这时将dynamic设置为true,隐藏label,大批敌人开始出现在屏幕上。
      2. 不管怎样都要调用 jumpPlayer ,因为只有dynamic 设置为true的时候,它才能被调用
      3. 如果游戏结束了,要重新开始,那么创建一个新的GameScene ,显示在屏幕上。
        接下来在代码添加如下方法
      4. @H_197_99@
        override func update(currentTime: CFTimeInterval) {  
          //1 
          if !gameOver {  
            //2 
            if player.position.y <= 0 {  
              endGame()  
            }  
            //3 
            enumerateChildNodesWithName("enemy") {  
              enemy,_ in  
              //4 
              if enemy.position.x <= 0 {  
                //5 
                self.updateEnemy(enemy)  
              }  
            }  
          }  
        }

        回顾一下:

        1. 如果gameOver 为false的话,看看monkey是否消失了,如果是,调用endGame——这个随后再添加
        2. 用enumerateChildNodesWithName 查看场景中的带有“enemy(敌人)“的对象。每当一个敌人消失,就会调用updateEnemy()——这个也是随后再添加
        3. @H_197_99@

          现在添加名为updateEnemy()的method,在框架渲染前调用——产生的效果是:每当一个敌人消失,玩家就会得1分:

          func updateEnemy(enemy: SKNodE) { //1 if enemy.position.x < 0 { //2  
                              enemy.removeFromParent() //3 runAction(coinSound) //4 numPoints++ //5 points.text  
                              = "\(numPoints)" } }

          再回顾一下上述步骤:

          1. 看一下敌人是否在在屏幕外的x轴上。
          2. 如果是,把敌人从parent上移除(从游戏中移除)。
          3. 将玩家分数储存在NumPoints里。
          4. 将分数转化为分数条,再将分数条插入分数label。
          5. @H_197_99@

            现在需要稍稍改变下didBeginContact(_:)了。从parent移除第一个节点之后,添加这行代码

            endGame()

            现在终于可以用endGamemethod了,久等了:

            func endGame() {  
              // 1  
              gameOver = true  
              // 2  
              removeAllActions()  
              // 3  
              runAction(explosionSound)  
            
              // 4  
              endLabel.position = CGPoint(x: frame.size.width/2,y: frame.size.height/2)  
              endLabel.fontColor = UIColor.whiteColor()  
              endLabel.fontSize = 50  
              endLabel2.position = CGPoint(x: frame.size.width/2,y: frame.size.height/2 + endLabel.fontSize)  
              endLabel2.fontColor = UIColor.whiteColor()  
              endLabel2.fontSize = 20  
              points.fontColor = UIColor.whiteColor()  
              addChild(endLabel)  
              addChild(endLabel2)  
            }

            现在来回顾一下:

            1. 将gameOver设置为true。
            2. 移除场景中的所有action,终止所有动画效果
            3. 运行爆炸声效。
            4. 定位,再为场景添加endLabel。
            5. @H_197_99@

              现在用didMoveToView(_:)移除这个代码块:

              ackgroundColor = SKColor.blackColor()  
              
              runAction(SKAction.repeatActionForever(  
                SKAction.sequence([  
                  SKAction.runBlock(spawnEnemy),SKAction.waitForDuration(1.0)])))

              最后添加一行:

              player.physicsBody?.dynamic = @H_197_31@false

              这样设置之后,点击屏幕后游戏才会开始,否则monkey是不会移动的。

              编写完成后运行,游戏大功告成了!

              • 背景音乐

              等会儿,还有一件事!打开ViewController.swift,添加一个属性

              var BACkgroundMusicPlayer: AVAudioPlayer!

              还要添加一个新method:

              func playBACkgroundMusic(filename: String) {  
                let url = NSBundle.mainBundle().URLForresource(  
                  filename,withExtension: nil)  
                if (url == nil) {  
                  println("@R_419_1793@ not find file: \(fileName)")  
                  return  
                }  
              
                var error: NSError? = nil  
                BACkgroundMusicPlayer =  
                  AVAudioPlayer(contentsOfURL: url,error: &error)  
                if BACkgroundMusicPlayer == nil {  
                  println("@R_419_1793@ not create audio player: \(error!)")  
                  return  
                }  
              
                BACkgroundMusicPlayer.numberOfLoops = -1  
                BACkgroundMusicPlayer.prepareToPlay()  
                BACkgroundMusicPlayer.play()  
              }

              这个method很方便,用来添加一些背景音乐。工作原理在此不详述。

              用起来很简单,只要在skView.presentScene(scenE)那一行后添加viewWillLayoutSubviews():

              playBACkgroundMusic("BACkgroundMusic.mp3") 

              编写好之后运行,美妙的背景音乐出现啦!太棒了!

              转自:http://www.csdn.net/article/2015-05-26/2824772-sprite-kit-for-kids-with-swift/4

大佬总结

以上是大佬教程为你收集整理的Swift开发Sprite Kit游戏实践(四):背景音乐与Game Over全部内容,希望文章能够帮你解决Swift开发Sprite Kit游戏实践(四):背景音乐与Game Over所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。