2010C语言添加背景图片_2019级C语言大作业 - 火柴人试炼之地
分享19級同學大一上學期用C語言實現的火柴人試煉之地。分步驟代碼、圖片音樂素材、可執行程序可以從百度網盤下載:
鏈接:https://pan.baidu.com/s/1XelHD8GVnXfR8coAYOAC9w
提取碼:dbu3
1 設計思路:
本游戲參考了網絡上的同名游戲,并通過EasyX插件用C語言編寫實現,玩家通過鼠標進行游戲界面中的選擇,通過鍵盤輸入進行游戲主干的操作,并盡可能使界面更加美觀,更加符合人性化操作要求,并且加入存檔功能和外置游戲數據,前者目的為提高游戲體驗,后者目的為方便游戲關卡內容升級。
2 功能描述:
游戲主體基本功能就是接受玩家的鼠標和鍵盤輸入,并做出相應的反應,實現界面選擇和游戲功能。其分部分介紹如下:
2.1 初始化
初始化函數為startup()函數,其基本功能有一下幾點:
1.初始化畫布(initgraph()函數),而且為了避免玩家在游戲過程中關閉窗口,造成無法存檔,我在初始化畫布時,添加了相應的參數,禁用了關閉按鈕和最小化按鈕,使游戲在運行時不會被意外關閉。
2.導入并播放音樂。因為考慮到游戲風格,我并不打算在游戲添加人物活動的音效,所以,只有重復播放的背景音樂。
3.導入所有所需要的圖片。
4.初始化所有變量。
5.防止在加載圖片時出現長時間黑屏,顯示加載界面。
2.2 讀取游戲進度
讀取游戲進度為readGameStageFromFile()函數,用于讀取存檔,并且在讀取失敗時默認將游戲進度置為1,然后返回。
2.3 讀取游戲存檔
讀取游戲存檔為readGameDataFromFile(int num)函數,通過接收傳入的指定關卡,讀取相應的關卡,并且,在讀取失敗時提醒并退出游戲。
2.4 寫入游戲進度
寫入游戲進度為writeGameStageToFile(int num)函數,接收目前的關卡狀態(即游戲進度),并寫入存檔。該函數在執行exit(0)前執行。
2.5 歡迎界面
歡迎界面為welcomeUI()函數,將圖片序列依次輸出顯示,其重點為遇到鍵盤輸入或鼠標點擊時能跳過,因此其中的主要部分為判斷。
2.6 作者聲明
作者聲明為poweredByUI()函數,強制輸出作者信息,以聲明作者創作權。
2.7 主界面
主界面為mainPageUI()函數,顯示游戲的選擇主界面,其分為背景圖片序列顯示和文字和按鈕顯示,為了提供比較美觀的游戲界面,我去查詢了EasyX的幫助文檔,了解了旋轉圖片的函數,使標題文字可以旋轉,提高美觀性,而對于按鈕,通過變量控制坐標,使其在鼠標移動上去時產生抖動效果,提高美觀性。
2.8 游戲選擇界面
游戲選擇界面為chooseGameUI()函數,其分為兩個部分,第一部分為詢問是否讀取上一次游戲的存檔界面,并采用和主界面類似的界面美觀設計,第二部分為游戲關卡選擇,通過gameRecord變量的信息來輸出相應的關卡選擇圖案,并且進行一定的美觀設計,當鼠標移上去時,顏色發生變化,然后在點擊后,改變gameStage變量,以進入相應的關卡。
2.9 主游戲界面
主游戲界面為gameUI()函數,用于輸出游戲中物體,其通過幾個標記變量來判斷輸出不同的人物狀態,除此之外,通過maps中儲存的地圖信息來顯示地圖。
2.10 主游戲操作輸入
主游戲操作輸入為gameInput()函數,為了使游戲體驗更加流暢,我使用了異步輸入GetAsyncKeyState()函數,并且同時兼容了ASDW和方向按鍵,以提升玩家體驗。每個按鍵中操作除了坐標改變外,還有相應標記變量的改變。此外,函數重點為人物跳躍落地判斷,此處我通過判斷當前坐標對每個方塊的寬度取余,以對應到maps數據中用了判斷。而且,為了游戲效果更佳逼真,我采用了重力加速度的計算方法,來讓人物有加速下落的效果。
2.11 暫停界面
暫停界面為pauseUI()函數,其界面設計與讀取存檔界面統一,并采用一樣的按鍵美化方法。
2.12 游戲結束界面
游戲結束界面為endGameUI()函數,其界面設計與暫停界面和讀取存檔界面統一,并采用一樣的按鍵美化方法。在點擊確認的情況下,清除相應的數據,將游戲進度寫入存檔,并安全退出。
2.13 主函數
主函數僅為對各種函數的調用,并通過while(1)來實現不斷顯示,而界面切換是通過switch來判斷stage數據,以進入相應的函數。
3 實現過程中的重點和難點
3.1 chooseGameUI界面中按鈕顯示異常問題(難點)
在chooseGameUI中,由于按鍵有不同類型,因此其判斷是分開進行的,結果在初期調試時發現,只有第一部分按鈕有動態效果,其他按鈕無反應,經過反復分析,我發現,在這函數的一次執行中,有多個并列的if(MouseHit())語句,而MouseHit()對鼠標情況的讀取總是使程序進入第一部分的按鈕判斷中,而后面的MouseHit()都被第一個MouseHit()阻塞,導致對后面的按鈕判斷不能被執行。
解決方法為:加入一段語句,使后面的判斷進入條件共用一個MouseHit()函數。(代碼如下)
int mFlag = 0; if (MouseHit()) {mFlag = 1;m = GetMouseMsg(); }后面的判斷都使用mFlag,而不是MouseHit()。
3.2 游戲CPU占用過高引起的低配置電腦運行卡頓問題(難點)
由于游戲中使用了while(1),相當于程序在死循環,而為了游戲的流暢效果,不能直接使用Sleep()函數,所以,程序全程都在對CPU進行高占用,而不同幀數對數據處理時間不同,直接的無限循環就導致了刷新幀率有巨大波動,影響游戲效果,且過度消耗電腦資源。在程序優化前,游戲程序在任意界面下都幾乎占滿一個CPU核心(數據為i7-9750H處理器在連接電源情況下保持4.2GHz左右的時鐘頻率工作下測得),而我通過查詢,找到了一個MyTimer.h的自定義庫,可直接調用實現非阻塞式的延時,從而統一刷新幀率,對游戲實現優化。在程序優化后,游戲程序在任意界面下都可以實現低占用率,在電腦省電模式下的極端測試,游戲程序不會占用一個CPU核心的50%以上(數據為i7-9750H處理器在不接通電源下開啟極限省電模式保持0.9GHz左右的時鐘頻率工作下測得)。
3.3 存檔問題(重點)
我們的游戲離不開存檔和數據讀取功能,因此對文件操作要求較高,因此我加入了許多對于文件操作的異常情況的處理,如:存檔文件無法打開時游戲進度自動歸零,地圖數據無法打開時游戲報錯提醒等,在這里我還使用了MessageBox函數,此外,為了防止玩家意外按到關閉按鈕退出而丟失游戲進度數據,我還禁用了窗口的關閉按鈕。
4 感悟
此次大作業中,誠然知識的要求很重要,但是,我感覺我收獲最多的是自主學習,自主糾錯的能力,程序,誰都能寫,但是對于一些細節的東西,整體框架的整潔度,邏輯是否合理,是否規范才是最重要的地方。在本次作業中,有多處體現了這中思維的重要性,如對于每個界面結束時界面殘余數據的清除置零,MouseHit()的沖突與干擾,還有人物運動與顯示的邏輯,這些都是考驗。而查詢幫助文檔和用法,是我的另一大收獲,編程里面東西很多,如果只靠別人說,難以學深,更多的就是依靠自己學習自己查詢幫助文檔。
總之,大作業讓我獲益匪淺。
總結
以上是生活随笔為你收集整理的2010C语言添加背景图片_2019级C语言大作业 - 火柴人试炼之地的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 胫骨粗隆是哪个位置
- 下一篇: 修改正文中参考文献标注_论文写作中怎样正