您現在的位置是:首頁 > 手機遊戲首頁手機遊戲
C語言+EasyX庫GUI程式設計之數字記憶遊戲——音訊播放和設定中心
- 2023-02-04
怎麼啟動gui將音訊裝置接入系統
上一期
C語言GUI程式設計之數字記憶遊戲——計時器、暫停和重置遊戲
為遊戲添加了計時器以及暫停、重置的邏輯,這一期繼續讓遊戲的可玩性增強——為遊戲新增背景音樂和提示音,並且提供設定中心的功能以供玩家可以選擇音訊的開關。
遊戲設定
C語言裡的音訊播放
為了控制音訊播放,增加了一個media。cpp媒體模組。
引用winmm.lib庫
使用windows系統再帶的“winmm。lib”庫進行音訊的播放控制。引用winmm。lib庫有兩種方式,第一種直接在模組最上方宣告使用:
#pragma comment(lib, "winmm.lib")
第二種,在使用Visual Studio的情況下,開啟專案->屬性設定->聯結器->輸入,找到“附加依賴”項,編輯新增“winmm。lib”即可。
Visual Studio引入winmm。lib
播放音訊
播放音訊就比較簡單了,先把音訊檔案複製到專案目錄裡,這裡建立了子目錄media用來存放;然後用以下函式執行播放:
mciSendString(_T("open media\\bk_music1.mp3 alias bkmusic"), NULL, 0, NULL);mciSendString(_T("play bkmusic repeat"), NULL, 0, NULL);
這裡不做過多的解釋,更多的使用方式可以去網上查閱資料。
短音訊二次播放
這裡說一下短音訊二次播放的問題。
先看使用場景:玩家點選正確的數字格子,給出“遊戲正確”的提示音,這個提示音的音訊時間很短,大概1秒,第一次點選正確觸發提示音沒有任何問題,緊接著再次觸發提示音後卻不能播放了。
此時的解決方法是在播放短音訊之前先關閉它,然後再接上常規的播放邏輯,如:
mciSendString(_T("close incorrect"), NULL, 0, NULL);mciSendString(_T("open media\\tips_incorrect.mp3 alias incorrect"), NULL, 0, NULL);mciSendString(_T("play incorrect"), NULL, 0, NULL);
設定中心
UI思路
用一張圖片作為設定中心的圖層,然後在上面繪製設定項。
注意,以設定中心為裝置進行繪製的時候,座標原點在設定中心區域的左上角,並不是視窗的左上角。
繪製完成後再使用SetWorkingImage()函式切換到視窗繪製模式,並用putimage()函式把設定中心的圖層輸出在視窗上。
動畫
整個設定中心作為整體從視窗底部向上移入到視窗的中心位置,關閉時從原路移除,效果如下。
設定中心從視窗底部移入
這個動畫原理不復雜,點選右下角設定按鈕的時候,觸發下面的邏輯:
繪製設定中心,把文字、按鈕都繪製到設定中心上去
迴圈把設定中心在視窗上的位置(Y軸)從大到小遞減,一直到視窗中間
注意:迴圈體中要使用cleardevice()清除上一次的裝置,否則會出現重疊。但是執行cleardevice()會使視窗變成黑框(原來的畫面都清除了),所以在此之前先利用getimage()函式把整個視窗的“快照影象”儲存下來記為window_image,在執行cleardevice()之後使用putimage(0,0,&window_image)即可完美呈現出想要的動畫效果。
關閉並移除設定中心的時候,先要獲取設定中心的快照影象,然後進行清除裝置、畫視窗快照、畫設定中心快照這三步迴圈。
另外,還有一個邏輯:遊戲正在進行中點選設定按鈕時要暫停計時。
資料管理
設定的資料儲存在一個二進位制檔案裡。程式裡定義一個全域性變數儲存設定項裡的資料,在主函數里讀取檔案資料並賦給這個全域性變數;當在設定中心修改後改變這個全域性變數裡的值,並且把新資料寫入到檔案裡。
開關按鈕動畫
EasyX做UI介面的話有點不太合適,這裡勉強做了一個開關按鈕的動畫。
開關按鈕動畫
簡單說一下思路:開關底層是一個按鈕,上層一半是按鈕滑塊,一半是開關的提示文字“ON/OFF”;點選切換狀態的時候把上面的滑塊往另一側移動,迴圈這個移動的過程藉助BeginBatchDraw()、FlushBatchDraw()、EndBatchDraw()即可實現開關動畫。
為了使得開發方便,把設定開關按鈕單獨封裝成一個函式,並且留一個滑塊偏移量的引數,這樣就可以透過逐漸改變偏移量來迴圈繪製並達到動畫的效果。
點選區域的管理
在專案裡要記錄比較多的點選區域:
展示數字的格子
右側的暫停/重置功能按鈕
右下角的設定ICON
設定中心的開關、關閉按鈕
其中,格子的座標特別有規律,記錄判斷也很方便;而剩下的就不太方便了,專案裡的處理方式是整理兩個型別(功能按鈕、設定相關的按鈕)的按鈕座標陣列作為全域性變數,在繪製的時候把座標依次記錄下,然後再特定邏輯下去判斷點選了哪個按鈕,並且相應
地
去執行哪個函式。
感覺這種方式比較直接、簡單粗暴,但是維護起來可能不太方便。後期可以專門定義一個結構體資料來存放點選區域,並加上相應的標記,這樣可以使得點選事件的處理邏輯儘可能的統一,讓程式碼的擴充套件性和維護性更強。
OK,這一期的內容分享就到這裡了,目前遊戲已經算得上“能玩”了,後面再把排行榜模組完善一下,再往後就做個專案總結、重構一下專案程式碼。