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

6 篇文章 3 订阅

前言

上篇博客讲了整体的一个框架,这次来说一下界面设计,地图的实现,以及玩家坦克的移动。

实现

界面大小设计

根据从手机上获取的截屏,自己在根据一定的比率换算,最终确定了整个界面的大小为1280x960。整个界面如果按大块来算的话是13x13的规格。其他的相关参数见表(这些参数是经历过好几次修改,最终确定下来的,费了不少的时间,建议选取2的倍数的规格):

宏定义说明
SIZE_WIDTH 1280整个界面的宽度
SIZE_HEIGHT 960整个界面的高度
BORDER_LEFT 75左边距
BORDER_UP 45上边距
CELL_WIDTH 10地图中最小单元的宽度
CELL_HEIGHT 8地图中最小单元的高度
CELL_NUMBER 104地图的大小,横(列)数
BULLTE_WIDTH 10子弹的宽度
BULLTE_HEIGHT 16子弹的高度

设计图:
在这里插入图片描述

地图类实现

  • 地图的横列数为104x104,前期设计时,由于地图大小设计的不合理,导致相关功能实现困难,所以,前后经历过过两次重新设计,最终确定下来为104x104。104x104意思是13x8x13x8=104x104,意思就是地图中最大的块,总共被分成8x8=64小块。

  • MyMap类解析,先来看MyMap.h

class MyMap
{
public:
    MyMap();
    ~MyMap();

    static char *m_map;
    static void initMap();
    static void setMap(int x, int y, char value);
    static char getMap(int x, int y);

    static void setWall26(int x, int y);
    static void setWall13(int x, int y);
    static void setBigCell(int x, int y, char value);
    static void setBase();  //设置基地

    static void stageTest();    //Test关卡
    static void stage1();   //第一关
    static void stage2();   //第二关
    static void setStage(int stage);    //设置关卡
};

里面的数据成员和成员函数都是静态的,静态是为了实现数据共享。static char *m_map是一个静态指针类型,用来申请内存,其他成员函数都是对这块内存进行读写操作。

地图中各物体的标识:

标识说明标识说明
0空白1普通敌人
B基地2速度快敌人
I钢铁3子弹快敌人
W墙壁L4BUFF敌人
V墙壁R5护甲敌人
G草地6暂无
R河流7暂无
P玩家18暂无
Q玩家29暂无
  • 关于绘制墙
    坦克大战中的墙不同于其他的障碍物,它是一层一层“砌”起来的,这给我们实现墙的绘制带来了不小的困难,地图的两次修改,基本上都与这问题有关,所以这儿我们得详细说明一下。

如图·,简单明了:
在这里插入图片描述

  • 绘制地图
    有了以上的规定,我们就可以在绘图事件中进行绘制地图了:
    代码参考如下(代码中的75,10,45,8,其实都是宏定义的数值,这里为了方便,也为了代码写短一点,就直接用了数字):
QImage imgWallL(":/object/image/object/objectWallL.png");
QImage imgWallR(":/object/image/object/objectWallR.png");
QImage imgBase(":/player/image/player/base.png");
QImage imgIron(":/object/image/object/objectIronSmall.png");
QImage imgGrass(":/object/image/object/objectGrassSmall.png");

//画地图
for (int y = 0; y < CELL_NUMBER; y += 1)
{
    for (int x = 0; x < CELL_NUMBER; x += 1)
    {
        switch (MyMap::getMap(x, y))
        {
            case 'B': p.drawImage(75+x*10, 45+y*8, imgBase); break;
            case 'W': p.drawImage(75+x*10, 45+y*8, imgWallL); break;
            case 'V': p.drawImage(75+x*10, 45+y*8, imgWallR); break;
            case 'I': p.drawImage(75+x*10, 45+y*8, imgIron); break;
            case 'G': p.drawImage(75+x*10, 45+y*8, imgGrass); break;
            default: break;
        }
    }
}

有了这些准备工作,下一步我们就可以实现坦克的相关操作了,我们下篇博客见。

QT(C++)游戏之坦克大战(三):https://blog.csdn.net/qq_36327203/article/details/86502298
QT(C++)游戏之坦克大战(一):https://blog.csdn.net/qq_36327203/article/details/86326417

  • 7
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

chasentech

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

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

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

打赏作者

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

抵扣说明:

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

余额充值