QT(C++)游戏之坦克大战(三)

前言

这篇说一下玩家类,子弹类的实现

实现

玩家类,敌人类都继承于坦克类,所以我们先来了解一下坦克类,坦克类继承于Base。

坦克类(Tank)

坦克类简单来说,就是实现了坦克基本属性,移动速度,碰撞检测,更新地图位置等等。
Tank.h

class Tank : public Base
{
    Q_OBJECT
public:
    Tank();
    ~Tank();

    void setMoveFlag(bool flag);
    bool getMoveFlag() const;

    void setRole(char role);
    char getRole() const;

    void setSpeedX(int speedX);
    char getSpeedX() const;
    void setSpeedY(int speedY);
    char getSpeedY() const;

    int getAngle();        //获取图片旋转的角度

    bool isTouchWall(int x, int y);
    bool isTouchObjectPart(int x, int y);   //是否检测到一部分障碍物
    bool isTouchObject();   //是否检测到障碍物
    bool isTouchBorder();   //是否碰到边界
    void updateBullte();    //更新子弹位置

    void updateTankMap(char value);

    Bullet m_bullet;    //子对象子弹
    bool m_moveFlag;    //是否可移动

    QPoint m_saveLoca[2];


private:
    void swapDirec();
    void swapPoint();

    char m_role;

    int m_speedX;
    int m_speedY;
};

玩家类(Player)

  • Player继承于Tank,它自身包括生命值等一些属性。
class Player : public Tank
{
    Q_OBJECT
public:
    Player();
    ~Player();

    //初始化
    void playerInit(int xx, int yy, Direction ddirec, char role);
    void playerReInit();	//死亡后重新初始化

    void setAlive(int alive);	//生命值
    int getAlive() const;

    void updateLoca();

private:
    int m_alive;	//生命值

    int initX;  //保留初始位置
    int initY;  //保留初始位置
    Direction initDir;//保留初始位置
};

  • 绘制坦克
    用到的知识是Qt的绘图事件,简单示例:
void BattleCity::paintEvent(QPaintEvent *ev)
{
	...
    QImage imgP1(":/player/image/player/p1tankNormal_U1.png");
    p.drawImage(p1.x, p1.y, imgP1);
    ...
}
  • 坦克移动

用到的知识是Qt的键盘事件
刚开始的时候想着是按下按键,让坦克的xy改变,但是实验过后,发现按键检测的速度太慢,导致坦克移动的慢。后来改进了方法,设置一个标志,按下按键,标志设为true,坦克移动;松开按键,标志设为false,坦克停止。用QTimer进行速度控制。

子弹类(Bullet)

首先还是来看Bullet.h
Bullet算是游戏中最核心的类了,它是所有坦克的子对象。它继承于Base,自身属性包括速度,等级,打击墙壁,打击钢铁,打击敌人等等。

class Bullet : public Base
{
    Q_OBJECT
public:
    Bullet();
    virtual ~Bullet();

    void bulletInit(int xx, int yy, Direction ddirec, int grade);

    void setSpeed(int speed);
    int getSpeed() const;

    void setGrade(int grade);
    int setGrade() const;

    void setMoveFlag(int flag);
    bool getMoveFlag() const;

    bool updateLoca(); //更新子弹位置
    void updateGrade();//更新子弹等级

    void getBulletStatus(QMatrix &matrixBullet, QImage &imgBullet);

    bool isWall(int xx, int yy);
    bool attackWall();
    bool attackIron();
    bool attackEnemy(char role);
    bool attackBase();

private:
    int m_speed;
    int m_grade;
    bool m_moveFlag;
};

检测原理

打击检测的思路其实都一样,判断子弹的位置是否为障碍物,注意,将实际地图转化为逻辑地图时,注意地图的存放方式,比如墙壁是每隔一个放一个,钢铁是每隔两个放一个,基地是每隔四个放一个,这里要十分小心。
比如,墙壁的转换方式为:

	int xx = (cenX)/CELL_WIDTH/2*2;
	int yy = (cenY)/CELL_HEIGHT/2*2;

钢铁的转换方式为:

	int xx = (cenX)/CELL_WIDTH/4*4;
	int yy = (cenY)/CELL_HEIGHT/4*4;

下篇我们实现敌人的移动。

坦克大战系列博客:
QT(C++)游戏之坦克大战(四):https://blog.csdn.net/qq_36327203/article/details/86509381
QT(C++)游戏之坦克大战(二):https://blog.csdn.net/qq_36327203/article/details/86499661

你可能感兴趣的:(C/C++,QT)