C++(qt)游戏实战项目:坦克大战(四)

原创 2017年06月03日 07:13:55

屏幕上光有地图也不行,还需要我们的坦克加入其中
新建tank.h和tank.cpp
tank.h里加入

#ifndef TANK_H
#define TANK_H
#include"wanwu.h"
#include"main.h"
#include"gamemap.h"

class Tank : public Wanwu
{
protected:

   int steps[8]={4,8,8,16,16,32,32,64};
  float lifes[8]={200,400,600,800,900,1100,1300,1500};
   float wulis[8]={20,40,80,160,160,320,320,640};
   float fashus[8]={20,40,80,160,160,320,320,640};
   float hujias[8]={50,70,90,110,130,150,170,190};
   float mokangs[8]={50,70,90,110,130,150,170,190};
   int gongjijianges[8]={8,7,6,5,4,3,2,2};

   int  group;//坦克所在组,同一组不能相互伤害
public:

    Tank();
    Tank(int iIndex,int jIndex,Dir dir=UP,int style=0,int group=1);
    // 计算势力范围
    virtual void CalculateSphere();

    // 绘图
    void Display(QPainter &paint);

    // 移动
    void Move();
    //设置移动状态为开
    void startmove(){ismove=true;}
    //设置移动状态为关
    void stopmove(){ismove=false;}
    //
   // void fire();
    //void startfire();
    //void stopfire();
    //设置方向
    void setdir(Dir dir){m_dir=dir;}
private:
    int style;
    bool ismove;
   // bool isfire;
    int gongjijiange;

};

#endif // TANK_H

tank.cpp

#include "tank.h"

Tank::Tank()
{
    this->m_pos.setX(10*CELLWIDTH+CELLWIDTH/2);
    this->m_pos.setY(8*CELLHEIGHT+CELLHEIGHT/2);
    this->wuli=200;
    this->group=0;//0玩家组,1敌人组
    m_step=16;
    gongjijiange=3;
    this->style=0;
    ismove=false;
    m_dir=UP;
    //isfire=false;
    m_bDisappear=false;
    life=1000;
    CalculateSphere();//计算实力范围
}


Tank::Tank(int iIndex,int jIndex,Dir dir,int style,int group){
    this->m_pos.setX(jIndex*CELLWIDTH+CELLWIDTH/2);
    this->m_pos.setY(iIndex*CELLHEIGHT+CELLHEIGHT/2);
    this->m_dir=dir;z
    this->style=style;
    this->group=group;
    //isfire=false;
    wuli=wulis[style];
    fashu=fashus[style];
    hujia=hujias[style];
    mokang=mokangs[style];
    m_step=steps[style];
    gongjijiange=gongjijianges[style];
    m_bDisappear=false;
    life=lifes[style];
    CalculateSphere();
}




void Tank::Display(QPainter &paint){

    QRect xm_rectSphere=m_rectSphere;
    if(m_bDisappear)return;//消失的不画
    switch(m_dir){
        case UP:

           paint.drawImage(m_rectSphere,*glo.tankimage,QRect(2*PICTANKWIDTH,style*2*PICTANKHEIGHT,PICTANKWIDTH,PICTANKHEIGHT));//身体
           paint.drawImage(xm_rectSphere,*glo.tankimage,QRect(2*PICTANKWIDTH,(style*2+1)*PICTANKHEIGHT,PICTANKWIDTH,PICTANKHEIGHT));//炮塔
            break;
        case DOWN:
            paint.drawImage(m_rectSphere,*glo.tankimage,QRect(0*PICTANKWIDTH,style*2*PICTANKHEIGHT,PICTANKWIDTH,PICTANKHEIGHT));//身体
            paint.drawImage(xm_rectSphere,*glo.tankimage,QRect(0*PICTANKWIDTH,(style*2+1)*PICTANKHEIGHT,PICTANKWIDTH,PICTANKHEIGHT));//炮塔
            break;
        case LEFT:
            paint.drawImage(m_rectSphere,*glo.tankimage,QRect(1*PICTANKWIDTH,style*2*PICTANKHEIGHT,PICTANKWIDTH,PICTANKHEIGHT));//身体
            paint.drawImage(xm_rectSphere,*glo.tankimage,QRect(1*PICTANKWIDTH,(style*2+1)*PICTANKHEIGHT,PICTANKWIDTH,PICTANKHEIGHT));//炮塔
            break;
        case RIGHT:
            paint.drawImage(m_rectSphere,*glo.tankimage,QRect(3*PICTANKWIDTH,style*2*PICTANKHEIGHT,PICTANKWIDTH,PICTANKHEIGHT));//身体
            paint.drawImage(xm_rectSphere,*glo.tankimage,QRect(3*PICTANKWIDTH,(style*2+1)*PICTANKHEIGHT,PICTANKWIDTH,PICTANKHEIGHT));//炮塔
            break;
      }

}//此段代码可以优化简洁
void Tank::Move()
{
   if(ismove==true){
    switch(m_dir){
        case UP:
            m_pos.setY(m_pos.y()-m_step);
            break;
        case DOWN:
            m_pos.setY(m_pos.y()+m_step);
            break;
        case LEFT:
            m_pos.setX(m_pos.x()-m_step);
            break;
        case RIGHT:
            m_pos.setX(m_pos.x()+m_step);
            break;
      }
    CalculateSphere();
    qDebug("move on");
 }
qDebug("move off");
}

void Tank::CalculateSphere(){

this->m_rectSphere.setRect(m_pos.x()-TANKWIDTH/2,m_pos.y()-TANKHEIGHT/2,TANKWIDTH,TANKHEIGHT);

}

main.h结构体Glo中加入选项Tank *player.

class QImage;
class GameMap;
class Tank;
typedef struct{
unsigned int framei;
QImage *blockimage;
GameMap *gamemap;
Tank *player;
}Glo;//实列化Glo类型变量,能实列化出来,所有的指针变量所占空间daxiao一样。

mainwindow.h里加入

#include"tank.h"

mainwindow.cpp构造函数里加入

glo.player=new Tank();

mainwindow.cpp paintEvent函数变更如下

void MainWindow::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

setFixedSize(WIDTH,HEIGHT);

paint.begin(this);
glo.gamemap->Display(paint);
glo.player->Display(paint);
paint.end();
}

mainwindow.cpp keyPressEvent变更如下

void MainWindow::keyPressEvent(QKeyEvent *event){
    qDebug("key:--------------------------%d ",event->key());
//当按键为M时设置游戏状态为mapedit
    if(event->key()==Qt::Key_M)
        {
            gamestatus=mapedit;
        }else if(event->key()==Qt::Key_G){
            gamestatus=gameing;
        }

    if(gamestatus==mapedit){
        if(event->key()==Qt::Key_S)
            {

                 glo.gamemap->savemap("1.dat");
             }
        else if(event->key()==Qt::Key_L)
            {

                glo.gamemap->loadmap("1.dat");
             }

     }else if(gamestatus==gameing){
          if(event->key()==Qt::Key_S)
             {

                 glo.player->setdir(DOWN);glo.player->startmove();
             }
          else if(event->key()==Qt::Key_A)
            {

                 glo.player->setdir(LEFT);glo.player->startmove();
             }
          else if(event->key()==Qt::Key_W)
             {
               glo.player->setdir(UP);glo.player->startmove();
             }
          else if(event->key()==Qt::Key_D)
          {
              glo.player->setdir(RIGHT);glo.player->startmove();

          }else if(event->key()==Qt::Key_J){

                 glo.player->startfire();

          }


     }
update();
}

到此你将有了一个可以移动穿墙的tank,还可以移动到游戏外界

后面C++(qt)游戏实战项目:坦克大战(五)将用到之前基类的碰撞函数来约束坦克遇到墙停止
本文章为作者原创
转载请标明本系列文章地址:http://blog.csdn.net/qq_26046771/article/details/72643740

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26046771/article/details/72849908

Message Driven Beans Tutorial(新增的EJB类型,绝对精彩!!!!!)

The following tutorial illustrates how a Message Driven Bean is written and deployed in an Enterpris...
  • xxcc
  • xxcc
  • 2001-10-10 10:44:00
  • 835

Qt游戏编程——飞机大战

效果图: 源码下载: 这篇文章记录了我用一周的时间从零Qt基础到制作出飞机大战的过程。 Qt相比MFC封装好了大量函数,而且非常有条理。飞机大战的实现主要用到了Qt的信号与槽机制、事件响应机制、计时器...
  • hao_zong_yin
  • hao_zong_yin
  • 2017-07-06 16:02:58
  • 3025

【游戏制作】 从零开始的Qt5贪吃蛇代码分析

Qt5游戏开发
  • Ken_Kun
  • Ken_Kun
  • 2016-12-11 15:16:30
  • 2475

Qt小游戏开发:五子棋(带AI功能)

写了一个带AI的五子棋小游戏,AI的表现还可以~ 预览 步骤 整体的代码结构,一个游戏逻辑类,一个UI类 1 定义游戏数据结构 // 游戏类型,双人还是AI(目前固定让AI下...
  • u012234115
  • u012234115
  • 2016-12-25 18:22:12
  • 6280

Qt实现推箱子小游戏

学习Qt有一个月了,想要实现一个推箱子的游戏来检验一下自己。今天先设计一下将要完成的具体表现,因为是第一次做,所以设计的稍微简单点,以后逐渐修改。首先要创建菜单栏,分为三个主菜单,第一个主菜单为开始游...
  • q5512049
  • q5512049
  • 2015-08-05 16:52:38
  • 3195

使用QT实现2048游戏

2048前言 总体的执行流程是 初始化背景->随机生成数字->绘制->滑动-》归零,计算,归零->随机生成数字->绘制。 绘制是根据一个二位数组来存储的数值来进行绘制的,为了方便逻辑计算,我...
  • hengqiaqia
  • hengqiaqia
  • 2017-09-27 10:58:58
  • 616

C++(qt)游戏实战项目:坦克大战(前言)

坦克游戏,儿时的经典,同样是练手的经典小项目之一! 准备好开发环境 必须 备注1 备注2 window或linux系统 推荐window QT5.5以上 百度一下...
  • qq_26046771
  • qq_26046771
  • 2017-05-23 08:11:07
  • 3848

用Qt写的一个坦克大战游戏

学习C++有一段时间了,于是想做点项目练练手,苦于MFC学起来比较困难,就用Qt写了一个简单的坦克大战游戏,没有用复杂的算法,而是用的Qt库提供的库函数实现碰撞检测,这里的主要实现方法依靠getRec...
  • u010101067
  • u010101067
  • 2014-10-14 16:45:10
  • 2759

[QT creator] 坦克大战!

首先!感谢大家试玩如此糟糕的游戏。辛苦大家乐!我不得不承认自己的不足,真是我第一次真正意义上写2D游戏!(以前用java 写的拼图,用虚幻三弄得简单的3D游戏应该不算吧!)          其次我...
  • nmnnbn
  • nmnnbn
  • 2014-04-16 14:36:44
  • 2323

QT下实现的简单坦克大战

  • 2014年07月29日 22:15
  • 8.07MB
  • 下载
收藏助手
不良信息举报
您举报文章:C++(qt)游戏实战项目:坦克大战(四)
举报原因:
原因补充:

(最多只允许输入30个字)