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

6 篇文章 3 订阅

前言

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

实现

玩家类,敌人类都继承于坦克类,所以我们先来了解一下坦克类,坦克类继承于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

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chasentech

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值