飞机大战——图文详解
文章目錄
- 1.前言
- 2.效果展示
- 3.圖片素材的準(zhǔn)備
- 4.需要構(gòu)建的函數(shù)
- 5.變量的定義
- 6.數(shù)據(jù)的初始化
- 7.畫(huà)面的呈現(xiàn)
- 8.飛機(jī)移動(dòng)的實(shí)現(xiàn)
- 9.子彈的構(gòu)建和移動(dòng)
- 9.1子彈的構(gòu)建
- 9.2子彈的移動(dòng)
- 10.敵機(jī)的創(chuàng)建和移動(dòng)
- 11.敵機(jī)消滅函數(shù)
- 12.結(jié)束語(yǔ)
- 13.完整代碼
- 14.內(nèi)容更新
1.前言
本次需要用到easyx圖形庫(kù),關(guān)于easyx的安裝和一些基本函數(shù),我在另外一篇推箱子小游戲中也有介紹,需要了解的小伙伴也可以點(diǎn)擊進(jìn)去看一看,下面會(huì)附上鏈接;
在寫(xiě)程序過(guò)程中需要的圖片,可以去百度找,也可以自己制作,有想要了解如何制作的小伙伴也可以點(diǎn)擊我下面的博客鏈接;
圖片素材如何制作鏈接
easyx介紹鏈接
2.效果展示
3.圖片素材的準(zhǔn)備
如下圖所示,我將我用到的圖片的背景圖和原碼圖都放在了源文件的文件夾,這樣訪問(wèn)的時(shí)候直接填寫(xiě)圖片文件名即可;
有個(gè)小建議,圖片名字別亂取,因?yàn)檎移饋?lái)特別麻煩,啊哈哈;
4.需要構(gòu)建的函數(shù)
下圖中,展示了我們需要構(gòu)建的函數(shù)以及定義的結(jié)構(gòu)體,下面我將會(huì)解釋各個(gè)函數(shù)的實(shí)現(xiàn)
5.變量的定義
我們使用變量時(shí)需要定義,我們的圖片在使用之前也需要定義和加載,如下圖所示:
6.數(shù)據(jù)的初始化
由上面可知我們定義了飛機(jī)結(jié)構(gòu)體變量,變量中的的x,y即代表了飛機(jī)的坐標(biāo),我們的飛機(jī)在出生時(shí),應(yīng)該在界面的最低的中央處。子彈和敵機(jī)的初始化一目了然這里就不再贅述了;
下圖展現(xiàn)了窗口的坐標(biāo),和飛機(jī)的起始坐標(biāo)取值:
7.畫(huà)面的呈現(xiàn)
通過(guò)判斷我方飛機(jī),子彈,敵機(jī)的結(jié)構(gòu)體中的bool值來(lái)確定是否打印圖案;
我們的子彈和敵機(jī)的設(shè)置為數(shù)組,通過(guò)數(shù)組元素形成的時(shí)間差,來(lái)營(yíng)造連綿不斷的動(dòng)態(tài)效果;
8.飛機(jī)移動(dòng)的實(shí)現(xiàn)
9.子彈的構(gòu)建和移動(dòng)
9.1子彈的構(gòu)建
9.2子彈的移動(dòng)
10.敵機(jī)的創(chuàng)建和移動(dòng)
敵機(jī)的創(chuàng)建和移動(dòng)就是子彈的復(fù)制版本,兩者邏輯是一樣的
11.敵機(jī)消滅函數(shù)
12.結(jié)束語(yǔ)
非常感謝大家的訪問(wèn),期待你們的指導(dǎo)。
這次只實(shí)現(xiàn)了飛機(jī)大戰(zhàn)基本的功能,后面會(huì)繼續(xù)更新其它有趣的內(nèi)容;
13.完整代碼
#ifndef _PLANE_H_ #define _PLANE_H_#include <stdio.h> #include <graphics.h> #include <time.h>#define SIZE 600 //背景大小 #define PSIZE 80 //飛機(jī)大小 #define BSIZE 40 //子彈大小 #define MAX 10//子彈數(shù)目 #define FMAX 10//敵機(jī)數(shù)目 typedef struct Member {double x;double y;bool lable; }mem;void Game(); void Load();//圖片加載 void DataInit();//數(shù)據(jù)初始化 void PlaneCtr();//通過(guò)輸入上下左右來(lái)改變飛機(jī)的坐標(biāo) void Show();//畫(huà)面呈現(xiàn) void BullterCre();//按了空格,調(diào)用函數(shù),創(chuàng)建子彈 void BullterMove();//子彈移動(dòng) void FplaneCre();//敵機(jī)創(chuàng)建 void FplaneMove();//敵機(jī)移動(dòng) void Hit();//消滅敵機(jī)#endif #include"plane.h"//定義圖片變量 IMAGE background;//背景圖 IMAGE plane_back;//飛機(jī)背景圖 IMAGE plane_mask;//飛機(jī)掩碼圖 IMAGE fplane_back;//敵機(jī)背景圖 IMAGE fplane_mask;//敵機(jī)掩碼圖 IMAGE bullte_back;//子彈背景圖 IMAGE bullte_mask;//子彈掩碼圖//定義全局變量 mem plane;//飛機(jī)結(jié)構(gòu)體 mem bullte[MAX];//子彈結(jié)構(gòu)體數(shù)組 mem fplane[FMAX];//敵機(jī)結(jié)構(gòu)體DWORD time_start, time_last; //時(shí)間變化量void Load()//圖片加載 {loadimage(&background, "background.jpg", SIZE, SIZE);loadimage(&plane_back, "plane_back.jpg", PSIZE, PSIZE);loadimage(&plane_mask, "plane_mask.jpg", PSIZE, PSIZE);loadimage(&fplane_back, "fplane_back.jpg", PSIZE, PSIZE);loadimage(&fplane_mask, "fplane_mask.jpg", PSIZE, PSIZE);loadimage(&bullte_back, "bullte_back.jpg", BSIZE, BSIZE);loadimage(&bullte_mask, "bullte_mask.jpg", BSIZE, BSIZE); } void DataInit()//數(shù)據(jù)初始化 {//飛機(jī)的數(shù)據(jù)初始化plane.x = SIZE / 2 - PSIZE / 2; //飛機(jī)起始位置在背景圖的中央plane.y = SIZE - PSIZE;plane.lable = true; //飛機(jī)出生是存活的//子彈初始化for (int i = 0; i < MAX; i++){bullte[i].lable = false;//子彈沒(méi)按空間前是不存在的}time_start = time_last = GetTickCount();//開(kāi)機(jī)到現(xiàn)在的毫秒數(shù)//敵機(jī)初始化for (int i = 0; i>FMAX; i++){fplane[i].lable = false;}}void PlaneCtr()//通過(guò)輸入上下左右來(lái)改變飛機(jī)的坐標(biāo) {if (GetAsyncKeyState(VK_UP))//向上移動(dòng){if (plane.y>0)//不能越界plane.y-=0.8;}if (GetAsyncKeyState(VK_DOWN))//向下移動(dòng){if (plane.y<SIZE-PSIZE)//y最大值600,飛機(jī)圖片大小為80plane.y+=0.8;}if (GetAsyncKeyState(VK_LEFT))//向左移動(dòng){if (plane.x>-PSIZE/2)//可以縮入墻壁一半機(jī)體plane.x-=0.8;}if (GetAsyncKeyState(VK_RIGHT))//向右移動(dòng){if (plane.x<SIZE-PSIZE/2)plane.x+=0.8;}if (GetAsyncKeyState(VK_SPACE) &&time_last - time_start>80)//發(fā)射子彈,每顆子彈間接為80毫秒{BullterCre();//空格發(fā)射子彈time_start = time_last;}time_last = GetTickCount(); }void Show()//畫(huà)面呈現(xiàn) { BeginBatchDraw();//雙緩沖繪圖,防閃爍putimage(0, 0, &background);if (plane.lable)//飛機(jī)存活就打印飛機(jī){putimage((int)plane.x, (int)plane.y, &plane_mask, SRCAND);putimage((int)plane.x, (int)plane.y, &plane_back, SRCPAINT);}for (int i = 0; i < MAX; i++)//循環(huán)判斷子彈{if (bullte[i].lable)//子彈存在就打印子彈{putimage((int)bullte[i].x, (int)bullte[i].y, &bullte_mask, SRCAND);putimage((int)bullte[i].x, (int)bullte[i].y, &bullte_back, SRCPAINT);}}for (int i = 0; i < FMAX; i++){if (fplane[i].lable)//打印敵機(jī){putimage((int)fplane[i].x, (int)fplane[i].y, &fplane_mask, SRCAND);putimage((int)fplane[i].x, (int)fplane[i].y, &fplane_back, SRCPAINT);}}EndBatchDraw(); }void BullterCre()//按了空格,調(diào)用函數(shù),創(chuàng)建子彈 {for (int i = 0; i < MAX; i++){if (!bullte[i].lable)//子彈不存在就創(chuàng)建子彈{//從飛機(jī)的正前方發(fā)出去bullte[i].x = plane.x + PSIZE / 2 - BSIZE / 2;bullte[i].y = plane.y - BSIZE;bullte[i].lable = true;break;//一次空格產(chǎn)生一顆子彈}} } void BullterMove()//子彈移動(dòng) {for (int i = 0; i < MAX; i++){if (bullte[i].lable)//子彈存在,它的y坐標(biāo)就減少{bullte[i].y--;//坐標(biāo)減,產(chǎn)生移動(dòng)if (bullte[i].y < 0)//子彈回收,否則下次全是發(fā)射出去的子彈{bullte[i].lable = false;}}} } void FplaneCre()//敵機(jī)創(chuàng)建 {for (int i = 0; i < FMAX; i++){if (!fplane[i].lable&&time_last-time_start>100)//沒(méi)有敵機(jī)就進(jìn)行構(gòu)建,用時(shí)間函數(shù)控制產(chǎn)生速度{fplane[i].lable = true;fplane[i].x = rand() % SIZE - PSIZE;//不讓敵出現(xiàn)在窗口外fplane[i].y = 0;time_start = time_last;break;//每次一個(gè)}time_last = GetTickCount();//獲取新的時(shí)間} } void FplaneMove()//敵機(jī)移動(dòng) {for (int i = 0; i < FMAX; i++){if (fplane[i].lable){fplane[i].y+=0.3;//敵機(jī)往下走if (fplane[i].y>SIZE)//敵機(jī)回收fplane[i].lable = false;}} } void Hit()//消滅敵機(jī) {for (int i = 0; i < FMAX; i++){if (!fplane[i].lable)//不存在則換下一個(gè)判斷continue;for (int j = 0; j < MAX; j++){if (!bullte[j].lable)continue;//子彈不存在也換下一個(gè)判斷if (bullte[j].x>fplane[i].x&& //子彈和敵機(jī)有交集則都消失bullte[j].x<fplane[i].x + PSIZE&&bullte[j].y>fplane[i].y&&bullte[j].y <fplane[i].y + PSIZE) {bullte[j].lable = false;fplane[i].lable = false;}}} }void Game() {//加載圖片數(shù)和初始化數(shù)據(jù)Load();DataInit();srand((unsigned)time(NULL));//種下隨機(jī)數(shù)種子while (1){Show();//圖像顯示PlaneCtr();//操控BullterMove();//子彈移動(dòng)FplaneCre();//敵機(jī)創(chuàng)建 Hit();//判斷是否打中敵機(jī)FplaneMove();//敵機(jī)往下走} } #include"plane.h"int main() {initgraph(600, 600);Game();getchar();return 0;}14.內(nèi)容更新
內(nèi)容更新鏈接,點(diǎn)擊進(jìn)入
總結(jié)
以上是生活随笔為你收集整理的飞机大战——图文详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: android h5使用缓存_Andro
- 下一篇: UVa 264 - Count on C