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