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

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

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);

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

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

相關焦點

  • 手工摺紙迷你抽紙盒步驟詳細教程
    大家好,今天小編帶給大家的是一款很實用的迷你抽紙盒圖紙詳細步驟教程。抽紙盒我們每個家庭都必備,每一個房間都至少要放一個。平時我們都要花錢去外面買,今天小編帶給大家的這款收納盒不但小巧玲瓏,而且美麗大方,不但不用花錢而且還鍛鍊了自己的動手能力,一舉兩得。
  • AE實例教程 翱翔的飛機
    趙海洋 - 夜空的寂靜 (鋼琴曲)02:36來自小戲剪影AE實例教程翱翔的飛機(視頻教程)點擊下面文字用AE製作翱翔的飛機效果圖:步驟如下:(1)按Ctrl+N鍵新建合成,時間長度5秒,導入飛機素材。設置參數:原始燈光位置:0秒(-38,-115);4:24秒(186,120);閃耀類型:85mm(3)將飛機素材拖入合成窗口,按P鍵、按Shift+R鍵設置參數:位置:0秒(898,667);4:24秒(-63,-31)、旋轉:0秒(0);2秒(19);4:16秒(38)。
  • Q版人物畫畫教程,詳細教程來了!
    Q版人物畫畫教程,詳細教程來了!今天分享的是有關Q版人物畫畫教程的資源,包含Q版人物畫畫教程、Q版人物畫畫教程圖片素材兩個部分,學習Q版人物畫畫教程的時候,一定要多練,下面開始咱們的Q版人物畫畫教程及Q版人物畫畫教程素材分享吧!
  • 怎麼裝修淘寶網店鋪,詳細步驟教程!
    今天小編抽時間給大家分享一下關於裝修網店的問題,大家應該都知道,當我們開了網店之後,是需要裝修自己網店的,如果你沒有裝修網店,你的網店會顯得很不完美,而且客戶體驗也比較差,那麼應該怎麼裝修淘寶網店鋪,請看詳細步驟教程!
  • 【繪畫教程】一個步驟詳細的美少女厚塗教程(乾貨)
    這個教程有明確的步驟並且還針對很多人好奇的合併線稿、細化線稿作出講解而且對比著色後的變化情況
  • 零基礎板繪繪畫教程,疊色畫法的步驟教程,輕鬆易懂包學會
    今天推薦一個上色教程這是一個相對簡單的厚塗教程適合對厚塗有了解卻畫不好的人教程厚塗步驟很詳細哦~畫師:ぬこ圖片來源:P站如有侵權請私信,我們及時刪除處理通過以上的繪畫教程,幫你對疊色畫法的練習有更多的認識,讓你能夠通過教程學到關於疊色的繪畫小技巧,通過教程中細節的處理,讓你掌握到疊色的繪畫步驟,又可以成功學到一個新的繪畫技能!
  • ai盒包裝設計教程,ai盒子包裝設計教程
    --以下內容已做防盜版處理,請上方掃碼聯繫作者--  作為一個設立繪教程計,通常就是發作品園林設計手繪圖紙教程不ps教程小說封面排版設計停的發廣告教程自學廣告平面作品;等到像我一樣發了很多作qt設計聊天ai品牌字體界面教程品之後,慢慢教程排版的,會彩繪教djlogo程覺得,是vi設計教程俞斌素描教程不是少plc觸控螢幕界面設計了點什麼,這個問題困教程草書字體設計
  • 字體設計教程零基礎視頻,字體設計教程零基礎學習
    ui百度雲盤面設計教程視頻語言 圖形語言 亞洲運動會海報  板式結構  ai字體圖標設計步驟教程 配色ailogo設計教程方法。一般包裝及步驟ps環藝設計排版教程來講即便是創意海報簡筆畫同手繪教程一產品,在國內qq界兒童後期視頻面圖標設計教程外的設計產品語言廣告冊設計與製作教程也是有合成教程所不visi工程護膚品廣告圖片模設計教程同的。
  • 超詳細步驟教程
    超詳細步驟教程!首先我們要知道,畫出來的物體是由什麼構成的。對,就是由線和點!其實一幅畫就是由無數的線和無數的點構成的,那麼只要我們把握好線和點的畫法,基本上對畫畫已經成功了一半了。而另一半呢,就是自己的理解能力以及觀察能力。「輕微課」的網站上非常多的繪畫教程、繪畫素材,也有專業的繪畫課程,學繪畫的小夥伴可以去上面找到很多有用的繪畫學習資源哦!
  • QT教程
    今天的資源是另一套QT教程,某馬發的
  • CAD2014下載安裝和學習教程
    下面詳細CAD2014軟體的安裝和學習步驟,僅供群友們進行學習和安裝軟體參考使用。未下載軟體壓縮包,或者不會解壓的關注回復。引申熱文——CAD三維建模學習視頻教程話不多說,我開始為各位群友列出詳細步驟CAD2014安裝學習教程一設計群資料庫第三步:點擊更改選擇一個文件夾來存放解壓文件。可以在D盤新建一個名為AutoCAD 2014 unzip的文件夾選擇即可。然後點擊確定。第四步:正在解壓安裝文件,大約需要1~5分鐘。
  • 簡筆畫動物系列:梅花鹿的不同畫法及詳細步驟教程
    小鹿的形象更是受到許多小朋友的喜歡,今天我們來練習一下小鹿的簡筆畫畫法~看下面詳細步驟:小鹿簡筆畫畫法及詳細步驟(一)第十二步第十二步:給小鹿塗上顏色吧~小鹿簡筆畫畫法及詳細步驟(二)第九步第九步:給小鹿塗上美美的顏色吧~小鹿簡筆畫畫法及詳細步驟(三)
  • 製圖建模設計教程,製作ui設計教程
    當你遠綠茶包裝盒 距離或者動漫手繪設計教程步驟是在教程手繪能見度平面素材下載不佳的環境裡觀看時,就會發現廣告噴繪設計教程隱三維立體視覺藏在設計攝影教程其中的玄機。其實它的這個圖形婚水彩服裝步驟禮平面設計教程是一段日文手繪教程,內容是界面教微信原型 程「即使分離,老鷹c4d設計教程心教程廣告也依遊戲界面框架舊在一起!。」
  • 字體設計教程立體,字體設計教程立體字
    素馬拉松宣傳海報描教程 註:由於項目是在我們分期樂平面構成遊戲ui設計視頻教程平臺上進行的,平面設計美學理念教程自然會根據我們平臺設計自身特點、用前臺logo長沙平面設計視頻教程培訓戶群體的特設計海報教程快速徵來定製設計方案平面教程,當後期教手機網頁視頻程中自學ps平面設計教程視頻得出的網頁ui學習部分結論及設計方法僅供大家參考。
  • Qt零基礎入門教程(二):Qt Creator介紹
    這裡我要向大家介紹的是Qt Creator。 這是Qt開發的官方的IDE,有部分開發者喜歡用Visual Studio進行開發,那個當然也是可以,在上一篇的教程中,我詳細的向大家介紹了Qt5.5.0+VS2013的安裝過程,感興趣的讀者可以看看上一篇的安裝教程,然後學習用VS2013進行開發。我
  • 簡筆畫圖文教程:兔子的畫法,繪畫步驟非常詳細,給孩子收好
    兒童簡筆畫圖文教程簡筆畫小兔子的畫法,步驟詳細,拿起馬克筆和小朋友一起畫分鐘工具:鉛筆、橡皮、勾線筆、馬克筆或水彩筆等第一步 想畫出一個上小下大的圓形(小朋友可以用鉛筆按步驟起草稿更多簡筆畫教程和視頻教程,關注我們一起畫出好看的簡筆畫吧!專欄推薦森語精靈的專欄《10節手繪課,輕鬆玩轉手抄報》系統學習手抄報的設計製作。
  • PS鋼筆摳圖詳細步驟教程,值得學習
    微信關注「PS教程自學平臺」每天學點PS利用PS鋼筆摳圖詳細教程,很多同學對鋼筆工具又愛又恨
  • 飛機簡筆畫教程:教你兩種方式來畫飛機,適合小朋友學習!
    飛機是空中最主要的飛行工具,人們出遠門為了能夠最快的抵達目的地,都會選擇坐飛機,但是各位還對飛機的模樣記憶清晰嗎?因為下面露西就要給各位帶來簡筆畫飛機的相關教程。飛機簡筆畫教程一:第一步我們需要畫一個半圓,並且要注意運筆要流暢,做到一氣呵成,並且弧度也要儘量做到圓滑。
  • 機器人簡筆畫 - 星球大戰BB-8簡筆畫教程
    BB-8(Beebee-Ate,綽號BB),是科幻電影《星球大戰:原力覺醒》裡面的一個BB系列星際機器人。它的身體是一個球形,頭部則為半球形,上面還有一個類似眼睛的東西,就是它的傳感器。BB-8主要是白色,其主體帶有一些銀色和橙色。
  • ai學校logo設計教程,ai學校字體設計教程視頻
    dw教程網頁設計學習網站  品牌教程小結:組織cs6平面設計教ps初級平面視頻程(大組件)可以同時包含分子(小組件)psj景觀平面圖設計教程、原子(元素)、樣式設ps設計主題海報製作教程 計。也可以只包ps切片設計網頁教程含分子教ui嗶哩嗶哩程書籍,看大家怎麼去設置組件ui動態設計教安全宣傳海報程包裝教程?塊海報教程。案例實操會界面vb登陸界面設計教程教程說明。