日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

VS/Qt C++ 入门项目飞机大战(内含全部源代码,素材,项目工程,项目祥解)可直接运行

發布時間:2023/12/29 c/c++ 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VS/Qt C++ 入门项目飞机大战(内含全部源代码,素材,项目工程,项目祥解)可直接运行 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

零、說在前面

最近做了個qt/c++的小項目飛機大戰,主要是邊玩邊做,主要講解一下設計思路,各個模塊的實現原理,非常適合初學者拿來練手。需要源碼、素材、項目詳解、打包軟件等整個項目用到的全部內容,可以加我wx公眾號:酷玩軟件樂園,后臺回復:飛機大戰,即可獲取全部資源。話不多說一起來看看吧。

一、項目目錄

1 項目簡介
2 創建項目
3 設置主場景
4 資源導入
5 地圖滾動
6 英雄飛機
7 子彈制作
8 玩家發射子彈
9 敵機制作
10 碰撞檢測
11 爆炸效果
12 音效添加
13 打包發布

二、項目講解

1 項目簡介
飛機大戰是我們都比較熟悉的小游戲,想必大家都有玩過,那你有沒有想過去自己制作一個飛機大戰的小項目呢,玩自己做的游戲會不會別有一番風味呢。下面就給大家講解一下飛機大戰的實現原理,只要照著教程做,每個人都可以是飛機大戰的開發者。
首先來看一下效果圖

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

2 創建項目

window端推薦用vs開發,下載qt插件開發qt項目,具體請直接百度一下,這里不再詳解
linux只能用qt進行開發了,為了統一,這里直接使用qt開發,qt版本qt5,qt creator 4.0及以上

打開Qt Creator按照向導創建項目,基類選擇 QWidget

3 設置主場景

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

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

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

在mainScene.h中定義initScene函數, 用來初始化游戲場景在mainScene.cpp中實現如下代碼

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

4 資源導入

生成qrc文件,生成res文件夾,生成res.qrc文件,將準備好的資源全部粘貼進res文件夾下,最后將res中的資源全部導進res.qrc中
qrc生成 rcc二進制文件
先配置好rcc.exe的文件路徑:在系統環境變量中添加qt中rcc.exe的文件路徑。
然后利用cmd打開終端,定位到res.qrc的目錄下,輸入命令

rcc -binary .\res.qrc -o plane.rcc

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

注冊二進制文件
在config.h中追加配置數據

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

在main.cpp中修改代碼

#include “mainscene.h”
#include
#include
#include “config.h”

int main(int argc, char *argv[]) {QApplication a(argc, argv);//注冊外部的二進制資源文件QResource::registerResource(GAME_RES_PATH);MainScene w;w.show();return a.exec(); }

5 地圖滾動

添加map.h和map.cpp文件
在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; }void Map::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;} }

在MainScene.cpp中實現成員函數

void MainScene::playGame() {//啟動定時器m_Timer.start();//監聽定時器connect(&m_Timer,&QTimer::timeout,[=](){//更新游戲中元素的坐標updatePosition();//重新繪制圖片update();}); }void MainScene::updatePosition() {//更新地圖坐標m_map.mapPosition(); }void MainScene::paintEvent(QPaintEvent *event) {QPainter painter(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 英雄飛機

創建HeroPlane類以及生成對應的文件,和創建地圖的步驟一樣。
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);}void HeroPlane::setPosition(int x, int y) {m_X = x;m_Y = y;m_Rect.moveTo(m_X,m_Y); }void HeroPlane::shoot() {}

拖拽飛機,在MainScene類中重寫鼠標事件

void MainScene::mouseMoveEvent(QMouseEvent *event) {int x = event->x() - m_hero.m_Rect.width()*0.5; //鼠標位置 - 飛機矩形的一半int y = 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 子彈制作
創建Bullet類以及生成對應的文件
在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); } void Bullet::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;} }

8 玩家發射子彈
之前在英雄飛機類中預留的一個shoot函數我們進行實現,代碼如下:

void HeroPlane::shoot() {//累加時間間隔記錄變量m_recorder++;//判斷如果記錄數字 未達到發射間隔,直接returnif(m_recorder < BULLET_INTERVAL){return;}//到達發射時間處理//重置發射時間間隔記錄m_recorder = 0;//發射子彈for(int i = 0 ; i < BULLET_NUM;i++){//如果是空閑的子彈進行發射if(m_bullets[i].m_Free){//將改子彈空閑狀態改為假m_bullets[i].m_Free = false;//設置發射的子彈坐標m_bullets[i].m_X = m_X + m_Rect.width()*0.5 - 10;m_bullets[i].m_Y = m_Y - 25 ;break;}} }

主場景中實現發射子彈
在MainScene.cpp的updatePosition成員函數中追加如下代碼

//發射子彈m_hero.shoot();//計算子彈坐標for(int i = 0 ;i < BULLET_NUM;i++){//如果子彈狀態為非空閑,計算發射位置if(!m_hero.m_bullets[i].m_Free){m_hero.m_bullets[i].updatePosition();}}

在MainScene.cpp的paintEvent成員函數中追加如下代碼:

//繪制子彈for(int i = 0 ;i < BULLET_NUM;i++){//如果子彈狀態為非空閑,計算發射位置if(!m_hero.m_bullets[i].m_Free){painter.drawPixmap(m_hero.m_bullets[i].m_X,m_hero.m_bullets[i].m_Y,m_hero.m_bullets[i].m_Bullet);}}

9 敵機制作
創建EnemyPlane類以及生成對應的文件
在enemyPlane.cpp中實現成員函數,代碼如下:

EnemyPlane::EnemyPlane() {//敵機資源加載m_enemy.load(ENEMY_PATH);//敵機位置m_X = 0;m_Y = 0;//敵機狀態m_Free = true;//敵機速度m_Speed = ENEMY_SPEED;//敵機矩形m_Rect.setWidth(m_enemy.width());m_Rect.setHeight(m_enemy.height());m_Rect.moveTo(m_X,m_Y); }void EnemyPlane::updatePosition() {//空閑狀態,不計算坐標if(m_Free){return;}m_Y += m_Speed;m_Rect.moveTo(m_X,m_Y);if(m_Y >= GAME_HEIGHT + m_Rect.height()){m_Free = true;} }

10 碰撞檢測

在MainScene.cpp中添加collisionDetection并實現該成員函數

void MainScene::collisionDetection() {//遍歷所有非空閑的敵機for(int i = 0 ;i < ENEMY_NUM;i++){if(m_enemys[i].m_Free){//空閑飛機 跳轉下一次循環continue;}//遍歷所有 非空閑的子彈for(int j = 0 ; j < BULLET_NUM;j++){if(m_hero.m_bullets[j].m_Free){//空閑子彈 跳轉下一次循環continue;}//如果子彈矩形框和敵機矩形框相交,發生碰撞,同時變為空閑狀態即可if(m_enemys[i].m_Rect.intersects(m_hero.m_bullets[j].m_Rect)){m_enemys[i].m_Free = true;m_hero.m_bullets[j].m_Free = true;}}} }

11 爆炸效果
創建Bomb類以及生成對應的文件
實現成員函數

Bomb::Bomb() {//初始化爆炸圖片數組for(int i = 1 ;i <= BOMB_MAX ;i++){//字符串拼接,類似 ":/res/bomb-1.png"QString str = QString(BOMB_PATH).arg(i);m_pixArr.push_back(QPixmap(str));}//初始化坐標m_X = 0;m_Y = 0;//初始化空閑狀態m_Free = true;//當前播放圖片下標m_index = 0;//爆炸間隔記錄m_Recoder = 0; }void Bomb::updateInfo() {//空閑狀態if(m_Free){return;}m_Recoder++;if(m_Recoder < BOMB_INTERVAL){//記錄爆炸間隔未到,直接return,不需要切圖return;}//重置記錄m_Recoder = 0;//切換爆炸播放圖片m_index++;//注:數組中的下標從0開始,最大是6//如果計算的下標大于6,重置為0if(m_index > BOMB_MAX-1){m_index = 0;m_Free = true;} }

在 MainScene.cpp的updatePosition中追加代碼

//計算爆炸播放的圖片for(int i = 0 ; i < BOMB_NUM;i++){if(m_bombs[i].m_Free == false){m_bombs[i].updateInfo();}}

在 MainScene.cpp的paintEvent 中追加繪制爆炸代碼

//繪制爆炸圖片for(int i = 0 ; i < BOMB_NUM;i++){if(m_bombs[i].m_Free == false){painter.drawPixmap(m_bombs[i].m_X,m_bombs[i].m_Y,m_bombs[i].m_pixArr[m_bombs[i].m_index]);}}

測試,實現爆炸效果

12 音效添加
在工程文件planeWar.pro 中修改代碼

QT += core gui multimedia

在PlayGame中添加背景音樂

//啟動背景音樂QSound::play(SOUND_BACKGROUND);

在爆炸時候添加爆炸音效

//播放音效QSound::play(SOUND_BOMB);

13 打包發布
(1)確定環境變量配置好 PATH: C:\Qt\Qt5.x.x\5.x.x\mingw53_32\bin
(2)在QT中把運行模式切換成 release 模式, 編譯。 在外層目錄中會有 release 版本的目錄.
(3)將目錄中的 rcc 二進制資源文件、可執行程序文件(.exe) 拷貝到另外一個單獨的文件夾中.
(4)進入 cmd 命令模式,切換到可執行程序所在的目錄. 執行以下命令,將可執行程序所需的庫文件拷貝到當前目錄:c windeployqt PlaneWar.exe
(5)額外可以將 ico 圖標也拷貝到當前可執行程序所在的目錄.
(6)利用第三方打包軟件將exe文件進行打包

三、說在最后

這里只放了一下主要代碼,基本的實現函數都在文章中了,需要源碼、素材、項目詳解、打包軟件等整個項目用到的全部內容,可以加我wx公眾號:酷玩軟件樂園,后臺回復:飛機大戰,即可獲取全部資源,公號中分享了很多特別使用的軟件,都是免費贈送。

總結

以上是生活随笔為你收集整理的VS/Qt C++ 入门项目飞机大战(内含全部源代码,素材,项目工程,项目祥解)可直接运行的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。