C語言手寫-植物大戰殭屍

專案效果(主頁置頂視訊)

說明:因為完整動圖提交後提示違規,所以這裡僅截圖示意。如果需要演示視訊,在評論中回覆即可。

專案準備

安裝Visual Studio的任意版本(推薦VS2019社群版、VS2022社群版)

安裝easyx圖形庫(官網下載地址)

領取專案素材(回覆“植物大戰殭屍”,即可領取)

建立專案

使用VS建立專案,使用空專案模板:

匯入素材:在專案目錄下,建立res資料夾,把解壓後的素材拷貝到res目錄下。

實現遊戲初始場景

程式碼如下(需要逐行程式碼視訊講解,可回覆“程式碼講解“)。

新增啟動選單

建立選單介面,程式碼如下:

在main函式中呼叫選單,程式碼如下:

生產陽光

熟悉植物大戰殭屍的同學都知道,種植植物才能消滅殭屍,但是種植植物,需要先具備一定數量的陽光值。初始的陽光值很小。有兩種方式生成陽光:第一種,隨機降落少量的陽光;第二種,通過種植向日葵,讓向日葵自動生產陽光。我們先實現第一種方式。

定義一個結構體,來表示陽光球。因為陽光是以旋轉的方式運動的,所以定義一個圖片幀陣列,通過迴圈播放圖片幀來實現旋轉效果。

在gameInit函式中,初始化陽光幀陣列。

建立陽光,程式碼如下。

修改陽光的位置和幀序號,程式碼如下。

在updateGame函式中呼叫以上兩個函式 ,以建立陽光並更新陽光的狀態。

在updateWindow函式中,渲染陽光。

收集陽光

當“陽光球”出現的時候,使用者點選陽光球,就可以“收集”這個陽光,當前總的陽光值就會增加25點。在原版的植物大戰殭屍遊戲中,陽光球被收集後,會慢慢移動到頂部的“工具欄”的左側。這個陽光球的“移動過程”,我們後續再實現。

定義一個全域性變數,表示當前總的陽光值。

int sunshine;

在初始化gameInit中,設定一個初始值。

sunshine = 150;

建立收集陽光的函式,如下:

在使用者點選處理中,呼叫收集陽光的函式。

顯示當前總的陽光值

在gameInit初始化中,設定字型。

在updateWindow中繪製陽光值。

建立殭屍

建立殭屍的資料模型。這裡一共建立了10個殭屍,這10個殭屍全部被消滅後,這個關卡就勝利了。

殭屍陣列,以及殭屍序列幀圖片陣列,在gameInit函式中進行初始化,如下。(注意:把殭屍的素材圖片儲存到src/zm目錄下。)

建立殭屍,程式碼如下:

更新殭屍的資料(殭屍的圖片幀序號、殭屍的位置),程式碼如下:

在updateGame函式中,建立殭屍並更新殭屍資料,如下:

建立繪製殭屍的介面, 如下:

在updateWindow函式中,繪製殭屍,如下:

實現陽光球的飛躍

現在的實現效果是,陽光被點選後,陽光球直接消失了!而原版的植物大戰殭屍中,陽光被點選後,陽光會自動飛向左上角的位置,飛到終點後,陽光值才增加25點。我們的實現方式是,陽光球每次飛躍4個點,直到飛到終點,如下圖:

給陽光的結構體新增兩個成員,表示飛躍過程中的偏移量:

在陽光被建立時,把變異量設定為0, 如下:

陽光被點選後,馬上修改陽光球的xoff和yoff:

在陽光飛躍過程中更新陽光的位置,如下:(注意是在飛躍過程中,不斷計算偏移量,效果更好。)

刪除原來被點選後,立即更新陽光值的程式碼。

修改渲染陽光的判斷條件,如下:

此時已經能夠實現陽光的飛躍了,但是飛躍動作太慢了,後期我們再優化。

發射豌豆

殭屍靠近時,已經種植的植物豌豆就會自動發射“子彈”,我們先為子彈定義資料型別,如下:

在gameInit函式中,初始化“豌豆子彈池”和子彈的圖片,如下:

在殭屍結構體中,新增成員row, 表示該殭屍所在的“行”,方便後續的判斷。也可以不加,直接根據殭屍的y座標來計算。

在createZM函式中,建立殭屍的時候,設定row成員的值,如下:

建立shoot函式,實現豌豆發射子彈,如下:

更新子彈的位置,如下:

在updateGame函式中,發射子彈並更新子彈的位置,如下:

在updateWindow中繪製子彈,如下:

子彈和殭屍的碰撞

子彈碰到殭屍之後,子彈會“爆炸”,同時殭屍會“掉血”。我們先給殭屍新增血量成員。

並在建立殭屍的時候,把血量初始化為100,如下:

子彈在碰到殭屍之後才會爆炸,並顯示爆炸圖片:

所以,我們在子彈的結構體中新增兩個成員,分別表示當前是否已經爆炸,以及爆炸的幀圖片序號,如下:

在gameInit函式中對子彈幀圖片陣列,進行初始化,如下:

在發射子彈shoot函式中,對子彈的blast和幀序號frameIndex進行初始化,如下:

在更新子彈的updateBullets函式中,更新子彈爆炸的幀序號,如下:

進行碰撞檢測,檢查子彈和殭屍是否發生碰撞,如下:

在updateGame函式中,呼叫碰撞檢測函式,如下:

渲染子彈的爆炸效果,如下:

殭屍死亡

殭屍被豌豆子彈擊中後,會“掉血”,血量掉光了,就直接KO了,同時變成一堆“黑沙”。

給殭屍結構體新增dead成員,表示是否已經死亡,另外新增一個圖片幀陣列,用來表示變成成黑沙的過程。

在gameInit中對這個圖片幀陣列進行初始化。

在碰撞檢測中對殭屍的血量做檢測,如果血量降到0,就設定為死亡狀態。如下:

殭屍死亡後,在updateZM中,更新殭屍的狀態(變成黑沙發)。如下:

繪製殭屍的黑沙狀態,如下:

後續的內容詳情看主頁置頂視訊

隨便看看 更多