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