#include "widget.h"
#include "ui_widget.h"
#include "config.h"
#include "enemyPlane.h"
#include <QIcon>
#include <QImage>
#include <QString>
#include <QPainter>
#include <QKeyEvent>
#include <QDebug>
Widget::Widget(QWidget *parent) //构造函数
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
initGame(); //调用初始化游戏的函数
playGame(); //开始游戏
}
Widget::~Widget() //析构函数
{
delete ui;
}
void Widget::initGame() //游戏初始化函数
{
setWindowTitle(GAME_TITLE); //设置窗口标题
setFixedSize(WINDOW_WIDTH,WINDOW_HEIGHT); //设置窗口的宽和高
setWindowIcon(QIcon(":/res/favicon.ico")); //加载图标
timer.setInterval(GAME_REFRESH_RATE); //控制背景图运动的定时器
planeInTimer.setInterval(30);//设置飞机的一个进场效果 的定时器
keyBoradTimer.setInterval(10);
enemyPlaneFrequencyRecord = ENEMYPLANE_NUM_FREQUENCY; //敌机此时的record为 ENEMYPLANE_NUM_FREQUENCY 也就是立刻会出现敌机
}
void Widget::playGame()
{
timer.start(); //启动定时器
planeInTimer.start(); // 启动进场定时器
keyBoradTimer.start();
//设置飞机的一个进场效果
connect(&planeInTimer,&QTimer::timeout,[&](){
if(WINDOW_HEIGHT - 2 * PLANE_HEIGHT >= myPlane.getY() ){ //飞机距离底部一段距离的时候停下
planeInTimer.stop();
}
myPlane.setXY(myPlane.getX(),myPlane.getY() - 5);
myPlane.planeRect.moveTo(myPlane.getX() ,myPlane.getY() -5);
}); //监听定时器的发送信号 使用信号槽来进行连接
connect(&timer,&QTimer::timeout,[=](){
enemyToMainWindow(); //敌机出场
updatePosition(); //更新游戏中所有元素的坐标
update(); //绘制到屏幕中
collisionDetection();//检测碰撞
}); //监听定时器的发送信号 使用信号槽来进行连接
}
void Widget::keyPressEvent(QKeyEvent *event)
{
//检测上下左右键 或者是 wasd键是否被按下 如果按下 就执行移动选项
switch (event->key()) {
case Qt::Key_A:
case Qt::Key_Left:
connect(&keyBoradTimer,&QTimer::timeout, &myPlane ,&Plane::left); //监听定时器的发送信号 使用信号槽来进行连接
break;
case Qt::Key_W:
case Qt::Key_Up:
connect(&keyBoradTimer,&QTimer::timeout, &myPlane ,&Plane::up); //监听定时器的发送信号 使用信号槽来进行连接
break;
case Qt::Key_D:
case Qt::Key_Right:
connect(&keyBoradTimer,&QTimer::timeout, &myPlane ,&Plane::right ); //监听定时器的发送信号 使用信号槽来进行连接
break;
case Qt::Key_S:
case Qt::Key_Down:
connect(&keyBoradTimer,&QTimer::timeout, &myPlane ,&Plane::down); //监听定时器的发送信号 使用信号槽来进行连接
break;
}
}
void Widget::keyReleaseEvent(QKeyEvent *event)
{
//检测上下左右键 或者是 wasd键是否被松开 如果松开 就执行断开连接操作
switch (event->key()) {
case Qt::Key_A:
case Qt::Key_Left:
disconnect(&keyBoradTimer,&QTimer::timeout, &myPlane ,&Plane::left); //监听定时器的发送信号 使用信号槽来进行连接
break;
case Qt::Key_W:
case Qt::Key_Up:
disconnect(&keyBoradTimer,&QTimer::timeout, &myPlane ,&Plane::up); //监听定时器的发送信号 使用信号槽来进行连接
break;
case Qt::Key_D:
case Qt::Key_Right:
disconnect(&keyBoradTimer,&QTimer::timeout, &myPlane ,&Plane::right ); //监听定时器的发送信号 使用信号槽来进行连接
break;
case Qt::Key_S:
case Qt::Key_Down:
disconnect(&keyBoradTimer,&QTimer::timeout, &myPlane ,&Plane::down); //监听定时器的发送信号 使用信号槽来进行连接
break;
}
}
void Widget::updatePosition()
{
// 检测是否出现越界的情况 如果出现 立即矫正
if(myPlane.getX() <= 0 )
myPlane.setXY(0,myPlane.getY());
if(myPlane.getY() <= 0 )
myPlane.setXY(myPlane.getX(),0);
if(myPlane.getX() >= WINDOW_WIDTH -PLANE_WIDTH )
myPlane.setXY(WINDOW_WIDTH -PLANE_WIDTH ,myPlane.getY());
if(myPlane.getY() >= WINDOW_HEIGHT -PLANE_HEIGHT )
myPlane.setXY(myPlane.getX(), WINDOW_HEIGHT -PLANE_HEIGHT);
map.mapPosition(); //更新地图的坐标
//敌机出场
for(int i=0;i<ENEMYPLANE_NUM;i++){
if(enmeyPlaneArray[i].isFreeOrNot() == false) {// 说明非空闲
enmeyPlaneArray[i].updatePosition();
}
}
//发射子弹
myPlane.shoot();
//计算所有非空闲子弹的当前坐标
for(int i=0;i<BULLET_CAPACITY;i++){
//如果非空闲 , 计算发射位置
if(myPlane.clips[i] .isFreeOrNot() == false){
myPlane.clips[i].updatePosition();
}
}
//爆炸效果
for(int i=0;i<BOMB_NUM ;i++){
if(bombs[i].isFreeOrnot() == false){
bombs[i].updateInfo();
}
}
// planeBullet.setFree( false);
// planeBullet.updatePosition();
}
void Widget::enemyToMainWindow()
{
enemyPlaneFrequencyRecord++;
if(enemyPlaneFrequencyRecord < ENEMYPLANE_NUM_FREQUENCY)
return;
enemyPlaneFrequencyRecord = 0;
for(int i=0;i<ENEMYPLANE_NUM ;i++){
EnemyPlane *enemy = &enmeyPlaneArray[i] ;
//如果是空闲的敌机 那就出场
if(enemy->isFreeOrNot()){
enemy->setFree(false);
//坐标
if(enemy->getInitPosition()) //1 是从底部出发的飞机
{
enemy->EnemyPlaneInit();
enemy->setXY(rand()%(WINDOW_WIDTH - enemy->enemyPlaneRect.width()),WINDOW_HEIGHT-1);}
else
{
enemy->EnemyPlaneInit();
enemy->setXY(rand()%(WINDOW_WIDTH - enemy->enemyPlaneRect.width()),1);
}
break;
}
}
}
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
//两张背景图片 绘制
painter.drawPixmap(0,map.getMap1YPosition(1),map.getMapById(1)); //绘制第一张图
painter.drawPixmap(0,map.getMap1YPosition(2),map.getMapById(2)); //绘制第二张图
painter.drawPixmap(myPlane.getX(),myPlane.getY(), myPlane.getPlanePic()); //绘制自己的飞机图
//绘制所有非空闲的子弹
for(int i=0;i<BULLET_CAPACITY;i++){
//如果非空闲 , 画出来
if(myPlane.clips[i] .isFreeOrNot() == false){
painter.drawPixmap(myPlane.clips[i].getX()
,myPlane.clips[i].getY()
,myPlane.clips[i].getBulletPic()) ;
// painter.setPen(QColor(255,255,255));
// painter.drawRect(myPlane.clips[i].bulletRect);
}
}
//绘制每个非空闲的敌机r
for(int i=0;i<ENEMYPLANE_NUM;i++){
//如果非空闲 , 画出来
if(enmeyPlaneArray[i].isFreeOrNot() == false){
painter.drawPixmap(enmeyPlaneArray[i].getX()
,enmeyPlaneArray[i].getY()
,enmeyPlaneArray[i].getEnemyPlanePic()) ;
// painter.setPen(QColor(255,255,255));
// painter.drawRect(enmeyPlaneArray[i].enemyPlaneRect);
}
//绘制爆炸的图
for(int i=0;i<BOMB_NUM;i++) {
if(bombs[i].isFreeOrnot() == false)
painter.drawPixmap(bombs[i].getX(),bombs[i].getY(),bombs[i].pix_arr[bombs[i].getIndex()]);
}
}
// painter.drawPixmap(planeBullet.getX(),planeBullet.getY(), planeBullet.getBulletPic()); //绘制子弹
}
void Widget::collisionDetect
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
资源包含文件:课程lunwen+项目源码及可执行exe文件 通过键盘的WSAD方向键来控制战机实现上下左右移动,用到的技术是监听键盘按键,整个过程分为 keyPressEvent 和keyReleaseEvent,表示键盘按下和键盘释放信号,通过qt的connect和disconnect函数来将主时钟和战机的上下左右移动函数相绑定,通过检测主时钟的脉冲频率和战机移动函数来控制战机的移动速度,config.h中的 PLANE_SPEED宏 是用来规定战机的移动速度的。 因为要随机产生敌机,所以要用到随机数,在项目中我使用的是rand()函数,敌机有三个随机的地方, 1. enemyPlane类中随机决定该敌机是否是高速敌机 2. enemyPlane类中随机决定该敌机从哪个方向进入选择有两个(上方和下方) 3. 主窗口中enemyToMainWindow() 函数随机决定敌机出现的x坐标。 详细介绍参考:https://biyezuopin.blog.csdn.net/article/details/125359009
资源推荐
资源详情
资源评论
收起资源包目录
基于QT的飞机大战游戏设计与实现.zip (93个子文件)
截图
7~VU123R`B)W`B@KWPR1)L8.png 165KB
M@KUV78WSMC0V~V)HXCM7ZO.png 163KB
))X[8{T8TOJZ1XA$5_G1GB5.png 31KB
DHMGX_{PED5}QFJ]@G{@XXB.png 52KB
~`GA5{J}M5_[1ISW0669S1I.png 479KB
}8_{Y5Z5PKZ02FOZHL7HQ_2.png 490KB
_XCSM9}}]_EOX[SP~EOOWXN.png 485KB
Y%})N{FX6`J_C$8`I%WT2PL.png 462KB
}3F02AWOANE@F]1SGR1RR9C.png 487KB
}RCD5OFQL}7~J[{0@)V$BCW.png 35KB
Y$UENIG}RIO_2BG%C}UN(XS.png 407KB
XF6T4SVJD$BMUBIUGHORB56.png 477KB
基于QT的飞机大战游戏设计与实现 源码及可执行exe文件
qt飞机大战源程序
main.cpp 164B
planeFightResources.qrc 188B
config.h 2KB
bomb.h 488B
widget.h 1KB
bullet.h 559B
map.h 451B
plane.h 781B
enemyPlane.cpp 2KB
widget.cpp 9KB
planeFight.pro 1KB
plane.cpp 2KB
res.qrc 607B
bullet.cpp 1KB
res
background.jpg 94KB
enemyFromUp.bmp 4KB
bomb5.BMP 13KB
bomb7.BMP 13KB
bomb1.BMP 13KB
bomb8.BMP 13KB
bomb4.BMP 13KB
bomb2.BMP 13KB
enemybullet.BMP 1KB
bomb3.BMP 13KB
bomb6.BMP 13KB
favicon.ico 264KB
me.bmp 3KB
enemyFromDown.bmp 4KB
bullet.bmp 1KB
map.cpp 817B
bomb.cpp 1KB
planeFight.pro.user 22KB
enemyPlane.h 958B
widget.ui 495B
可执行程序
D3Dcompiler_47.dll 3.98MB
libgcc_s_seh-1.dll 73KB
opengl32sw.dll 19.95MB
platforms
qwindows.dll 2.72MB
iconengines
qsvgicon.dll 97KB
imageformats
qtiff.dll 515KB
qgif.dll 77KB
qwbmp.dll 68KB
qjpeg.dll 474KB
qicns.dll 96KB
qico.dll 82KB
qwebp.dll 666KB
qsvg.dll 73KB
qtga.dll 70KB
libstdc++-6.dll 1.36MB
libGLESv2.dll 6.07MB
Qt5Svg.dll 562KB
translations
qt_ca.qm 180KB
qt_da.qm 170KB
qt_ja.qm 127KB
qt_fr.qm 162KB
qt_es.qm 161KB
qt_ru.qm 194KB
qt_zh_TW.qm 125KB
qt_gd.qm 185KB
qt_sk.qm 123KB
qt_pl.qm 159KB
qt_lv.qm 150KB
qt_uk.qm 155KB
qt_en.qm 23B
qt_bg.qm 161KB
qt_cs.qm 171KB
qt_ar.qm 156KB
qt_he.qm 135KB
qt_fi.qm 176KB
qt_ko.qm 128KB
qt_it.qm 157KB
qt_hu.qm 157KB
qt_de.qm 209KB
styles
qwindowsvistastyle.dll 303KB
libwinpthread-1.dll 51KB
Qt5Gui.dll 9.39MB
libEGL.dll 66KB
Qt5Widgets.dll 8.22MB
Qt5Core.dll 7.96MB
planeFight.exe 426KB
基于QT的飞机大战游戏设计与实现 课程论文.docx 84KB
共 93 条
- 1
shejizuopin
- 粉丝: 1w+
- 资源: 1300
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页