基于QT的C++的坦克大战游戏

本文介绍了如何使用C++和QT库开发一款坦克大战游戏。通过主驱动部分、坦克类和炮弹类的详细代码,展示了游戏的基本逻辑和图形绘制。包括坦克的移动、开火、碰撞检测以及界面的实时更新等功能。
摘要由CSDN通过智能技术生成

近期培训期间做的基于C++的坦克小游戏,欢迎评论。

首先是主驱动部分:tankclient.h,和tankclient.cpp

tankclient.h部分

#ifndef TANKCLIENT_H

#define TANKCLIENT_H
#include <QtGui/QMainWindow>
class Tank;//前置申明
class Missile;
class explode;
class TankClient : public QMainWindow
{
    Q_OBJECT
public:
    TankClient(QWidget *parent = 0);
    ~TankClient();
    //画出图形的方法
    void paintEvent(QPaintEvent *);
    //定义坦克初始坐标
    //static const int才能初始化
    //int x,y;
    //定义定时器的方法
    void timerEvent(QTimerEvent *);
    //定义键盘事件(压下)方法
    void keyPressEvent(QKeyEvent *);
    //定义键盘事件(松开)方法
    void keyReleaseEvent(QKeyEvent *);
    //持有一枚主站坦克
    Tank* tank;
    //持有装在子弹的集合(模板)
    QList<Missile*> missiles;
    //持有10辆敌军坦克
    QList<Tank*> etanks;
    //持有爆炸的集合
    QList<explode*> explodes;
    //定义游戏的分辨率
    static const int GAME_W=500;
    static const int GAME_H=400;
};

#endif // TANKCLIENT_H

tankclient.cpp部分

#include "tankclient.h"
#include <QtGui>  //总的GUI函数的库文件
#include "tank.h"
#include "missile.h"
#include"explode.h"


TankClient::TankClient(QWidget *parent)
    : QMainWindow(parent)
{
    //创建窗体 ALT+/自动补全
    //默认快捷方式ctrl+space
    //设置标题
     setWindowTitle(tr("坦克大战"));
     //设置大小
     setFixedSize(GAME_W,GAME_H);
     //设置背景
     setStyleSheet("background-color:black");
     //初始化坐标
     //x=200;
     //y=200;
     //启动定时器
     startTimer(50);//参数:long(毫秒)
     //初始化主站坦克
     tank=new Tank(200,200,30,30,this,true);
     //初始化敌军坦克
          for(int i=0;i<10;++i){
               Tank* t=
                       new Tank(30+40*i,350,30,30,this,false);
               etanks.push_back(t);
          }
 }
//实现画图的方法
//当界面刷新的时候被系统自己调用
void TankClient::paintEvent(QPaintEvent *){
    //输出
    qDebug("paint...");
    //创建画布对象
    QPainter p(this);
    //显示子弹的个数
        p.setPen(Qt::white);
        p.drawText(0,15,tr("子弹的个数:")+QString::number(missiles.size()));
    //画出主站坦克
    tank->draw(p);


    //画出子弹
    for(int i=0;i<missiles.size();i++){
        //取出每一个子弹依次画出来
        Missile* m=missiles[i];
        m->draw(p);
        //调用hitTanks
        m->hitTanks(etanks);
        m->hitTank(tank);
    }
    //画出敌军坦克
    for(int i=0;i<etanks.size();i++){
        Tank* t = etanks[i];
        t->draw(p);
    }
    //画出爆炸效果
    for(int i=0;i<explodes.size();i++){
        explode* e = explodes[i];
        e->draw(p);
    }




    //假设界面刷新的时候向右移动
    //采用定时器或者多线程Thread
    //x+=1;
}


//定义定时器的方法
void TankClient::timerEv

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值