用Go和Korok寫一個Flappybird遊戲-5

coyan發表於2021-09-09

我們給遊戲新增了場景轉換支援,現在遊戲邏輯已經基本完善,唯一剩下的就是音效了。本節會新增音效支援,這也是這一系列的最後一節。本節你會學會:如何播放音效.

注:如果你沒有完成上一節的教程,也可以直接從 下載到上節結束時的程式碼,以便開始本節的內容。

音訊資源

在 Korok 中,只支援兩種基本的音訊格式:wav 和 ogg/vorbis. 前者是原聲的未壓縮音訊格式比較適合於播放音效,後者是經過壓縮的音訊格式比較適合於播放比較長的背景音樂。在工程的  assets/sound/ 目錄中,我們已經準備幾個音訊檔案,不過這些檔案都是音效(在本遊戲中並不需要背景音樂)。

讀取音效檔案可以在 GameSceneLoad 方法中執行:

    asset.Audio.Load("sound/rise.ogg", false)
    asset.Audio.Load("sound/drop.ogg", false)
    asset.Audio.Load("sound/point.ogg", false)
    asset.Audio.Load("sound/collision.ogg", false)
    asset.Audio.Load("sound/swooshing.ogg", false)

上面程式碼把音訊檔案載入到了記憶體,需要注意的是第二個引數,這個引數指定了當前音訊是直接載入記憶體還是以流檔案的方式載入。對 Flappy Bird 來說,這些檔案都是比較短小的音效,所以直接載入記憶體是沒有問題的。

// 在 GameScene 中新增屬性 type GameScene struct {
    ...
    sound struct{
        rise uint16
        drop uint16
        collision uint16
        point uint16
        swooshing uint16
    }
}// 在 OnEnter 中初始化sn.sound.rise, _ = asset.Audio.Get("sound/rise.ogg")
sn.sound.drop, _ = asset.Audio.Get("sound/drop.ogg")
sn.sound.point, _ = asset.Audio.Get("sound/point.ogg")
sn.sound.collision, _ = asset.Audio.Get("sound/collision.ogg")
sn.sound.swooshing, _ = asset.Audio.Get("sound/swooshing.ogg")

需要注意的是,直接載入僅記憶體的音訊是可以用 audio.PlayEffect() 播放發的,但是以流的形式載入的不可以。以流的形式載入的只能用 audio.PlayMusic 播放, 這是 Korok 音訊系統的一個約定。

播放音訊

播放音訊是非常簡單的,直接在觸發事件的時候呼叫 Play 方法即可。比如,點選螢幕的時候會給鳥一個向上的衝量,同時會播放一個 “呼——” 的音效:

    if input.PointerButton(0).JustPressed() {
        sn.bird.vy = TapImpulse        // play effect
        audio.PlayEffect(sn.sound.rise, 1)
    }

由於簡書是不能播放影片的,所以效果無法感受了。大概就是每次飛的時候會 “呼——” 的一聲。

在碰撞和墜落的時候也加上音效:

    if sn.bird.state != Dead {
        ps.StopScroll()
        sn.bird.state = Dead        // stop bird animation
        korok.Flipbook.Comp(sn.bird.Entity).Stop()        // play collision
        audio.PlayEffect(sn.sound.collision, 1)
    }    // detect collision with ground and sky
    if y := sn.bird.Vec2[1]; y > 480 {
        sn.bird.Vec2[1] = 480
    } else if y 

以上程式碼在墜落和死亡的時候,分別播放了音效。值得注意的是,播放音效的方法: audio.PlayEffect(sn.sound.collision, 1) 的第二個引數是一個優先順序。在這個遊戲中,音效比較少幾乎用不到,但在有大量音效的遊戲中,可能會使用這些優先順序引數來調整音訊的重要程度。最終的效果:

圖片描述

final final


經過5個小節,FlappyBird 系列教程終於結束了,它基本上涵蓋了 引擎 70~80% 的功能,只有粒子系統和一些隱藏功能沒有被提及。程式碼已經傳到 GitHub - ,關注 master 分支。

零幾年的時候剛上大學,那會在圖書館的角落發現一本叫C語言的書,從此便開始了編碼人生,那會經常著迷於折騰一些程式碼編寫小遊戲,比如俄羅斯方塊、連連看。十幾年過去了經歷了專案的壓力、業務的枯燥,有時候在週末想自己寫些程式碼卻不知道寫些什麼。希望經此教程你可以學會用 引擎做一些小遊戲,重拾編寫遊戲的樂趣。

             


作者:ntop
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2236/viewspace-2805001/,如需轉載,請註明出處,否則將追究法律責任。

相關文章