C++學習教程,QT飛機大戰教程(含詳細步驟教程一)

2020-12-05 黑馬程式設計師

1 項目簡介

飛機大戰是我們大家所熟知的一款小遊戲,本教程就是教大家如何製作一款自己的飛機大戰

首先我們看一下效果圖

玩家控制一架小飛機,然後自動發射子彈,如果子彈打到了飛下來的敵機,則射殺敵機,並且有爆炸的特效

接下來再說明一下案例的需求,也就是我們需要實現的內容

滾動的背景地圖飛機的製作和控制子彈的製作和射擊敵機的製作碰撞檢測爆炸效果音效添加2 創建項目

創建項目步驟如下:

打開Qt跟著嚮導創建項目基類選擇 QWidget空窗口

第一個場景為主場景 MainScene

不帶UI界面

2.1 打開Qt

找到你安裝的Qt Creator,打開它

如果安裝時,沒有選擇在桌面上建立快捷方式,那麼你的Qt軟體位置如下

C:\qt\Qt5.x.x\Tools\QtCreator\bin

在這個路徑下找到

qtcreator.exe

雙擊打開即可

2.2 按照嚮導創建項目

2.2.1 新建項目

點擊菜單 中的文件 -> 新建文件或項目 或者 在首頁面中點擊New Project

2.2.2 選擇模板

模板選擇 Application -> Qt Widget Application

2.2.3 項目名稱和位置

給項目起個名稱以及選中項目要保存的地方

這一步選擇後在Kits 構建套件中直接點擊下一步即可

2.2.4 類信息

基類選擇 QWidget

類名也就是我們第一個窗口場景的名稱,這裡我起名為

MainScene

代表遊戲中的主場景

取消創建界面中的內容

2.2.5 完成創建

在匯總頁面中點擊完成,我們就邁開了項目的第一步!

3 設置主場景

主場景設置的步驟如下:

添加配置文件,保存遊戲中所有配置數據初始化主場景窗口大小、標題3.1 配置文件添加

創建新的頭文件為 config.h 主要記錄程序中所有的配置數據,方便後期修改

添加窗口寬度、高度的配置信息,依據背景圖大小進行設置

/********** 遊戲配置數據 **********/#define GAME_WIDTH 512 //寬度#define GAME_HEIGHT 768 //高度#define GAME_TITLE "飛機大戰 v1.0" //標題

3.2 主場景基本設置

在mainScene.h中添加新的成員函數initScene 用來初始化遊戲場景

voidinitScene();

在mainScene.cpp中實現如下代碼

voidMainScene::initScene(){//初始化窗口大小setFixedSize(GAME_WIDTH,GAME_HEIGHT);//設置窗口標題setWindowTitle(GAME_TITLE);}

在構造函數MainScene中調用該函數 initScene

MainScene::MainScene(QWidget*parent):QWidget(parent){//初始化場景initScene();}

測試運行效果如圖:

4 資源導入

在主場景中其實還有一個配置項沒有實現,也就是窗口左上角的那個圖標資源

那麼接下來我們將遊戲中的資源進行導入並且設置遊戲圖標

資源導入步驟

生成qrc文件項目同級目錄下創建res文件夾並將資源粘貼過來編輯qrc,加入前綴和文件利用qrc生成二進位文件 rccrcc文件放入到debug同級目錄下註冊二進位文件添加圖標資源4.1 qrc文件生成

右鍵項目,點擊添加新文件

選擇Qt -> Qt Resource File

資源文件起名 如:res

生成res.qrc文件

4.2 創建res文件夾

項目的同級目錄下創建文件夾res,並將準備好的資源粘貼進去

4.3 編輯qrc文件

右鍵qrc文件,選中Open in Editor

添加前綴為 '' \ ''

添加文件 將res下所有文件選中即可

4.4 qrc生成 rcc二進位文件

由於資源過大,會提示錯誤:

這個錯誤也就是「編譯器的堆空間不足」。

由於資源文件qrc過大,超出分配的內存範圍

因此我們需要利用二進位資源,而生成二進位資源就需要我們剛剛的qrc文件

利用cmd打開終端,定位到res.qrc的目錄下,輸入命令

rcc-binary.\res.qrc-oplane.rcc

4.5 複製rcc文件

將生成好的rcc文件,放入到debug同級目錄中一份

4.6 註冊二進位文件

在config.h中追加配置數據

#define GAME_RES_PATH "./plane.rcc" //rcc文件路徑

在main.cpp中修改代碼

#include"mainscene.h"#include<QApplication>#include<QResource>#include"config.h"intmain(intargc,char*argv[]){QApplicationa(argc,argv);//註冊外部的二進位資源文件QResource::registerResource(GAME_RES_PATH);MainScenew;w.show();returna.exec();}

此時,qrc文件已經沒用了,刪除即可!

最簡單的刪除方式就是 .pro工程文件中刪除代碼,與工程無瓜葛

刪除以下代碼:RESOURCES+= \ res.qrc

4.7 添加圖標資源

配置文件config.h中追加代碼

虛擬資源路徑語法如下:

" : + 前綴名 + 文件路徑 "

#define GAME_ICON ":/res/app.ico"

在mainScene.cpp的 initScene函數中追加代碼:

//設置圖標資源setWindowIcon(QIcon(GAME_ICON));//加頭文件 #include <QIcon>

運行測試:

5 地圖滾動

步驟:

創建地圖文件和類添加成員函數和成員屬性 實現成員函數遊戲運行調用定時器啟動定時器,監聽定時器信號實現遊戲循環計算遊戲內元素坐標繪製到屏幕中5.1 創建地圖文件和類

右鍵項目,添加新文件

選擇C++ -> C++ Class

修改類名為map,點擊下一步,直到創建完畢

至此,地圖Map的文件和類創建完畢

5.2 地圖的成員函數和成員屬性

在map.h中添加如下代碼

#ifndef MAP_H#define MAP_H#include<QPixmap>classMap{public://構造函數Map();//地圖滾動坐標計算voidmapPosition();public://地圖圖片對象QPixmapm_map1;QPixmapm_map2;//地圖Y軸坐標intm_map1_posY;intm_map2_posY;//地圖滾動幅度intm_scroll_speed;};#endif // MAP_H

5.3 實現成員函數

在config.h中添加新的配置數據

/********** 地圖配置數據 **********/#define MAP_PATH ":/res/img_bg_level_1.jpg" //地圖圖片路徑#define MAP_SCROLL_SPEED 2 //地圖滾動速度

在map.cpp中實現成員函數

#include"map.h"#include"config.h"Map::Map(){//初始化加載地圖對象m_map1.load(MAP_PATH);m_map2.load(MAP_PATH);//設置地圖其實y軸坐標m_map1_posY=-GAME_HEIGHT;m_map2_posY=0;//設置地圖滾動速度m_scroll_speed=MAP_SCROLL_SPEED;}voidMap::mapPosition(){//處理第一張圖片滾動m_map1_posY+=MAP_SCROLL_SPEED;if(m_map1_posY>=0){m_map1_posY=-GAME_HEIGHT;}//處理第二張圖片滾動m_map2_posY+=MAP_SCROLL_SPEED;if(m_map2_posY>=GAME_HEIGHT){m_map2_posY=0;}}

5.4 定時器添加

在mainScene.h中添加新的定時器對象

QTimerm_Timer;

在 config.h中添加 屏幕刷新間隔

#define GAME_RATE 10 //刷新間隔,幀率 單位毫秒

在MainScene.cpp的initScene中追加代碼

//定時器設置m_Timer.setInterval(GAME_RATE);

5.5 啟動定時器實現地圖滾動

在MainScene.h中添加新的成員函數以及成員對象

//啟動遊戲 用於啟動定時器對象voidplayGame();//更新坐標voidupdatePosition();//繪圖事件voidpaintEvent(QPaintEvent*event);//地圖對象Mapm_map;

在MainScene.cpp中實現成員函數

voidMainScene::playGame(){//啟動定時器m_Timer.start();//監聽定時器connect(&m_Timer,&QTimer::timeout,[=](){//更新遊戲中元素的坐標updatePosition();//重新繪製圖片update();});}voidMainScene::updatePosition(){//更新地圖坐標m_map.mapPosition();}voidMainScene::paintEvent(QPaintEvent*event){QPainterpainter(this);//繪製地圖painter.drawPixmap(0,m_map.m_map1_posY,m_map.m_map1);painter.drawPixmap(0,m_map.m_map2_posY,m_map.m_map2);}

測試運行遊戲,實現地圖滾動

6 英雄飛機

步驟如下:

創建英雄文件和類添加成員函數和成員屬性實現成員函數創建飛機對象並顯示拖拽飛機6.1 創建英雄文件和類

創建HeroPlane類以及生成對應的文件

和創建地圖的步驟一樣,這裡就不在詳細截圖了

創建好後生成HeroPlane.h 和 HeroPlane.cpp兩個文件

6.2 飛機的成員函數和成員屬性

在HeroPlane.h中添加代碼

classHeroPlane{public:HeroPlane();//發射子彈voidshoot();//設置飛機位置voidsetPosition(intx,inty);public://飛機資源 對象QPixmapm_Plane;//飛機坐標intm_X;intm_Y;//飛機的矩形邊框QRectm_Rect;};

6.3 成員函數實現

這裡飛機有個發射子彈的成員函數,由於我們還沒有做子彈

因此這個成員函數先寫成空實現即可

在config.h中追加飛機配置參數

/********** 飛機配置數據 **********/#define HERO_PATH ":/res/hero2.png"

heroPlane.cpp中實現成員函數代碼:

#include"heroplane.h"#include"config.h"HeroPlane::HeroPlane(){//初始化加載飛機圖片資源m_Plane.load(HERO_PATH);//初始化坐標m_X=GAME_WIDTH*0.5-m_Plane.width()*0.5;m_Y=GAME_HEIGHT-m_Plane.height();//初始化矩形框m_Rect.setWidth(m_Plane.width());m_Rect.setHeight(m_Plane.height());m_Rect.moveTo(m_X,m_Y);}voidHeroPlane::setPosition(intx,inty){m_X=x;m_Y=y;m_Rect.moveTo(m_X,m_Y);}voidHeroPlane::shoot(){}

6.4 創建飛機對象並顯示

在MainScene.h中追加新的成員屬性

//飛機對象HeroPlanem_hero;

在MainScene.cpp的paintEvent中追加代碼

//繪製英雄painter.drawPixmap(m_hero.m_X,m_hero.m_Y,m_hero.m_Plane);

測試飛機顯示到屏幕中

6.5 拖拽飛機

在MainScene.h中添加滑鼠移動事件

//滑鼠移動事件voidmouseMoveEvent(QMouseEvent*event);

重寫滑鼠移動事件

voidMainScene::mouseMoveEvent(QMouseEvent*event){intx=event->x()-m_hero.m_Rect.width()*0.5;//滑鼠位置 - 飛機矩形的一半inty=event->y()-m_hero.m_Rect.height()*0.5;//邊界檢測if(x<=0){x=0;}if(x>=GAME_WIDTH-m_hero.m_Rect.width()){x=GAME_WIDTH-m_hero.m_Rect.width();}if(y<=0){y=0;}if(y>=GAME_HEIGHT-m_hero.m_Rect.height()){y=GAME_HEIGHT-m_hero.m_Rect.height();}m_hero.setPosition(x,y);}

測試飛機可以拖拽

7 子彈製作

製作步驟如下:

創建子彈文件和類添加子彈類中的成員函數和成員屬性實現成員函數測試子彈7.1 創建子彈文件和類

創建Bullet類以及生成對應的文件

創建好後生成bullet.h 和 bullet.cpp兩個文件

7.2 子彈的成員函數和成員屬性

在Bullet.h中添加代碼

#ifndef BULLET_H#define BULLET_H#include"config.h"#include<QPixmap>classBullet{public:Bullet();//更新子彈坐標voidupdatePosition();public://子彈資源對象QPixmapm_Bullet;//子彈坐標intm_X;intm_Y;//子彈移動速度intm_Speed;//子彈是否閒置boolm_Free;//子彈的矩形邊框(用於碰撞檢測)QRectm_Rect;};#endif // BULLET_H

7.3 子彈類成員函數實現

在config.h中追加子彈配置信息

/********** 子彈配置數據 **********/#define BULLET_PATH ":/res/bullet_11.png" //子彈圖片路徑#define BULLET_SPEED 5 //子彈移動速度

在bullet.cpp中實現成員函數,代碼如下:

#include"bullet.h"Bullet::Bullet(){//加載子彈資源m_Bullet.load(BULLET_PATH);//子彈坐標 初始坐標可隨意設置,後期會重置m_X=GAME_WIDTH*0.5-m_Bullet.width()*0.5;m_Y=GAME_HEIGHT;//子彈狀態m_Free=true;//子彈速度m_Speed=BULLET_SPEED;//子彈矩形框m_Rect.setWidth(m_Bullet.width());m_Rect.setHeight(m_Bullet.height());m_Rect.moveTo(m_X,m_Y);}voidBullet::updatePosition(){//如果子彈是空閒狀態,不需要坐標計算//玩家飛機可以控制子彈的空閒狀態為falseif(m_Free){return;}//子彈向上移動m_Y-=m_Speed;m_Rect.moveTo(m_X,m_Y);if(m_Y<=-m_Rect.height()){m_Free=true;}}

7.4 測試子彈

子彈本身應該由飛機發射,測試階段我們寫一段輔助代碼,看看效果即可

測試過後,這些代碼可以刪除掉

在MainScene.h中添加測試代碼

//測試子彈代碼Bullettemp_bullet;

在MainScene.cpp中的updatePosition裡添加測試代碼

//測試子彈代碼temp_bullet.m_Free=false;temp_bullet.updatePosition();

在MainScene.cpp中的paintEvent裡添加測試代碼

//測試子彈代碼painter.drawPixmap(temp_bullet.m_X,temp_bullet.m_Y,temp_bullet.m_Bullet);

運行程序,此時會有一發子彈從屏幕中射出

測試完畢後,測試代碼刪除或注釋即可

相關焦點

  • 摺紙海豚步驟詳細教程
    大家好,今天小編帶給大家的是立體海豚摺紙步驟教程。大家都知道海豚是大海的寵物,更是人類的朋友。我們超市裡也賣各種各樣的海豚玩具,小朋友也很喜歡。現在我們只要一張紙就能折出一個可愛的立體海豚,再也不用花錢買了,現在就讓我們一起來學習海豚教程吧!
  • CAD動態塊餐桌實例製作教程,最詳細的動態塊教程
    1-3分鐘學習CAD小技巧,粉絲數到達一萬「有豪禮相送」,責任、擔當、使命-華雲旭教育!丨餐桌動態塊丨教程詳細操作步驟:(溫馨提示該文章需要花費大量的時間來進行學習,如果有不懂的可以私信我)1,找到我們成塊的餐桌,這裡尺寸為1200*2000,2,雙擊進入塊編輯器,3,點擊左側參數面板,線性參數
  • 詳細教程:自己如何組裝48V鋰電池組?
    詳細教程:自己如何組裝48V鋰電池組?對於如何自行組裝48V鋰電池組這一問題,是許多想要自行組裝卻又沒有經驗不懂專業知識的人最大的困惑。組裝成功的鋰電池組也可以稱之為鋰電池包,但真正的鋰電池包除了鋰電池組還需要更多的材料,然後再次進行組裝。
  • RomanDiaz的摺紙教程長尾鳥折法詳細圖解
    RomanDiaz的摺紙教程長尾鳥折法詳細圖解RomanDiaz的長尾鳥摺紙完成效果圖這是一款非常漂亮的小鳥摺紙,它的尾巴很長,我們就叫它長尾鳥吧。RomanDiaz的摺紙教程長尾鳥折法詳細圖解的詳細摺紙步驟如下所示:
  • 中秋節製作一個五顏六色的燈籠賀卡步驟教程,真的太美了
    大家好,今天小編帶給大家的是一個迷你五顏六色的燈籠賀卡詳細步驟教程。中秋節是中國的傳統節日,在中國古代,每逢中秋節家家戶戶門口都掛著紅色的燈籠,以示喜慶。到了晚上大家都出來賞月,街上更是張燈結彩,人來人往熱鬧非凡。人們拿著燈籠,這樣的美好情景瞬間把我們帶到了古代。
  • 鳥簡筆畫怎麼畫 鳥的簡筆畫步驟圖解教程
    今天和萬年曆小編學習一下鳥簡筆畫怎麼畫吧,以下是鳥的簡筆畫步驟圖解教程,一步一步畫好可愛的鳥簡筆畫。鳥簡筆畫怎麼畫 鳥的簡筆畫步驟圖解教程1、先畫個半圓做鳥的頭部9、嘴圖上黃色就完成了以上是萬年曆小編整理的「鳥簡筆畫怎麼畫,鳥的簡筆畫步驟圖解教程
  • 折一把可愛精緻的小勺子給孩子玩吧,摺紙調羹圖紙詳細教程
    而且折法也是非常的簡單,喜歡的朋友可以收藏,現在就讓我們一起來學習小勺子的詳細摺紙教程吧。步驟1:我們先拿一張寬7.5,長15釐米的正方形紙,折出以上一橫兩豎三條虛線。折三條虛線折法很簡單,看一遍就會了。步驟2:把上面向下對摺。步驟3:第二步不動的情況下,第三步再對摺出一條虛線。步驟4:把兩條虛線相疊,就是圖2兩個箭頭的虛線。
  • 聯想Y480筆記本拆機詳細圖文教程
    Y480史上最詳細拆機教程第二步當然就是拆下背面那個最大的背板,有兩顆螺絲,很容易搞定。,光碟機只有一個螺絲固定,拆下螺絲後,往外一脫就搞定。,然後輕輕往上一提,硬碟就可以拆下來了。  Y480史上最詳細拆機教程螺絲都拆完之後我們就可以拆鍵盤了,小編建議從F12按鍵的上方,用一字的螺絲刀,輕輕一翹
  • 簡筆畫小青蛙圖文教程:親子繪畫步驟詳細,寶爸寶媽給孩子收著
    #簡筆畫教程#兒童簡筆畫圖文教程小青蛙的圖文教程,步驟詳細,拿起馬克筆和小朋友一起畫!繪畫名稱:小青蛙繪畫人群:少兒繪畫用時:30分鐘工具:鉛筆、橡皮、勾線筆、馬克筆或水彩筆等第一步 畫出兩隻大的的眼睛(小朋友可以用鉛筆按步驟起草稿)
  • 摺紙一款飛出去可以原地返回的紙飛機步驟教程
    各位朋友大家好,今天我們來學習一款飛出去可以原地返回的紙飛機教程,很多人都不相信,但是這款紙飛機確實做到了。步驟1:我們先拿一張21*28釐米的長方形紙,長度左右對摺後打開。步驟2:我們把上下進行對摺後打開,上下對摺的時候只要在中間壓出一點痕跡就可以了。
  • 企鵝電競直播手遊的詳細教程
    首先來看一看企鵝電競直播平臺怎麼使用傲軟投屏直播手遊,以直播王者榮耀遊戲為例,以下是詳細教程:打開傲軟投屏APP和PC端,並參考此教程完成投屏操作;打開企鵝電競直播助手,點擊「窗口」;在彈出來的窗口中,選擇「ApowerMirror Livestream」並點擊確定按鈕。
  • Pokemon go安卓開飛機教程 安卓虛擬定位步驟詳解
    Pokemon go安卓版怎麼開飛機?眼看著鎖區了但是大家無能為力,怎能不使用一些黑科技呢?那麼口袋妖怪go安卓版怎麼開飛機呢?小編給大家帶來了虛擬定位開飛機的詳細教程,不過大家小心使用不要被封號。
  • 《我的世界》怎麼製作飛機 紅石飛機製作教程
    導 讀 在我的世界中可以造出能動的飛機嗎?
  • CAD教程之路徑陣列操作教程
    cad教程操作步驟:1、命令行輸入陣列命令ARRAY,實際輸入時,只需要輸入cad教程3、選擇路徑曲線,空格,然後點擊曲線終點,即需要陣列的終點。cad教程cad教程命令行輸入行數,空格,進入如下圖,再輸入行間距,空格,完成
  • 南方CASS教程附下載
    \南方CASS教程\1、CASS9.0視頻教程\CASS9.0視頻教程\7、橫斷面法土方計算\視頻學習\19x.dwgCAD\南方CASS教程\1、CASS9.0視頻教程\CASS9.0視頻教程\7、橫斷面法土方計算\視頻學習\19剖面線數據.datCAD\南方CASS教程\1、CASS9.0
  • 水彩教程 | 可愛兔子繪畫教程(內含詳細步驟)
    今天開始畫畫每一個出發的今天都不會太晚陽光明媚,微風和煦地吹拂著田間的草梗
  • 【妖權樹出品】大嘴鳥含教程
    第一期4到6歲年齡段一學期課程設計,共18次課,16個課題引發設計以及繪畫內容結果設計及運用。並指導老師們如何使用課題引導教學。每周一次課,每次2小時。學完老師們可以自己設計課程進行教學。將大家的思維打開。要報名的抓緊嘍!
  • 「CG原畫插畫教程」超詳細衣服褶皺教程
    藝學繪小編收集整理了超詳細衣服褶皺教程服裝基本的褶皺的走向經常出現的動畫褶皺,例如手臂上的褶皺有點過於深了,在這當中很難打上線條,可以用陰影來想辦法鬆弛褶皺個布料中最容易出現的,處理時感到困惑的時候可以做下參考,要考慮重力的作用流動皺褶,動畫中會經常使用皺褶的變形,頭髮也是這樣的淚水流動變形素材源於網絡,侵刪藝學繪 超級多的繪畫插畫漫畫動漫教程
  • 花藝教程|一款自然靈動的鮮花桌花小教程!
    今天給大家製作了一個桌花設計小教程,花友們一起來學吧~先看成品:花材:製作步驟:△剪一小塊鐵絲網,用手按壓揉作一團,放在玻璃花器裡,以往是拿防水膠帶固定,但玻璃表面太滑,粘不住。這次創意想到用粗鐵絲勾著邊緣固定鐵絲網。
  • MDI Jade完整教程,快速玩轉XRD數據分析!
    5、Photoshop安裝軟體+視頻教程+PDF教程詳細信息公眾號回覆:PS安裝軟體:PS 2015/2017/2018/2019;視頻教程:初級教程+中級教程+高級教程+案例教程+PS科研繪圖教程;PDF教程:設計電子書+模板+插件6、國自然等申請輔助資料