qt 坦克大战游戏 GUI绘制

关于本章节中使用的图形绘制类,如QGraphicsView、QGraphicsScene等的详细使用说明请参见我的另一篇文章:

《图形绘制QGraphicsView、QGraphicsScene、QGraphicsItem、Qt GUI-CSDN博客》

本文将模仿坦克大战游戏,目前只绘制出一辆坦克,并能发射炮弹

源代码下载地址:https://download.csdn.net/download/zhouhui1982/88784330

main.cpp文件中代码

#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QKeyEvent>
#include <QTimer>

//坦克类对象,构建坦克主体
class Tank : public QGraphicsRectItem {
public:
    Tank() {
        // 坦克身体
        setRect(0, 0, 30, 50);
        setBrush(Qt::blue);

        // 炮塔
        turret = new QGraphicsRectItem(10, -20, 10, 30);
        turret->setParentItem(this);

        // 设置炮塔颜色
        turret->setBrush(Qt::red);
    }

    //重写键盘事件,判断上下左右、空格按钮
    void keyPressEvent(QKeyEvent *event) override {
        // Handle key presses to control the tank
        switch (event->key()) {
        case Qt::Key_Left:
            moveBy(-10, 0);
            break;
        case Qt::Key_Right:
            moveBy(10, 0);
            break;
        case Qt::Key_Up:
            moveBy(0, -10);
            break;
        case Qt::Key_Down:
            moveBy(0, 10);
            break;
        case Qt::Key_Space: //如果是空格键,发射炮弹
            //绘制第一发炮弹
            QGraphicsEllipseItem *bulletItem = new QGraphicsEllipseItem(0, 0, 5, 10);
            bulletItem->setPos(mapToScene(12, -50));
            bulletItem->setBrush(Qt::red);
            scene()->addItem(bulletItem);

            //记录第一发炮弹位置
            QPointF pos = bulletItem->pos();

            //每隔500ms,发射下一发炮弹,看着像连续的动画效果
            QTimer::singleShot(500, [=]() {
                //移除第一发炮弹
                scene()->removeItem(bulletItem);

                //绘制第二发炮弹
                QGraphicsEllipseItem *bulletItem1 = new QGraphicsEllipseItem(0, 0, 5, 10);
                bulletItem1->setPos(pos.x(), pos.y() - 30);
                bulletItem1->setBrush(Qt::red);
                scene()->addItem(bulletItem1);

                QTimer::singleShot(500, [=]() {
                    //移除第二发炮弹
                    scene()->removeItem(bulletItem1);

                    //绘制第三发炮弹
                    QGraphicsEllipseItem *bulletItem2 = new QGraphicsEllipseItem(0, 0, 5, 10);
                    bulletItem2->setPos(pos.x(), pos.y() - 80);
                    bulletItem2->setBrush(Qt::red);
                    scene()->addItem(bulletItem2);

                    QTimer::singleShot(500, [=]() {
                        //移除第三发炮弹
                        scene()->removeItem(bulletItem2);
                    });
                });
            });

            break;
//        default:
//            break;
        }
    }
private:
    QGraphicsRectItem *turret; // 炮塔

};

//绘制主画布
class TankGame : public QGraphicsView {
public:
    TankGame() {
        scene = new QGraphicsScene(this); // 2D 图形 画布
        setScene(scene);

        //创建tank实例
        tank = new Tank();
        //加载tank实例到画布
        scene->addItem(tank);

        //抗锯齿渲染 减少图形边缘的锯齿状效果 使得图形看起来更加清晰和平滑
        setRenderHint(QPainter::Antialiasing);
        //平滑的像素变换渲染 用于对图片进行变换(如旋转、缩放等)时保持图片的平滑性
        setRenderHint(QPainter::SmoothPixmapTransform);
        //边界框发生变化时进行更新
        setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
        //高质量抗锯齿渲染 与上边的代码类似 但是这个设置更加强调图形的质量而不是性能
        setRenderHint(QPainter::HighQualityAntialiasing);
        //设置了 画布 的大小为 800x600 像素
        setFixedSize(800, 600);

    }

//画布的键盘事件,调用tank类中的键盘事件
protected:
    void keyPressEvent(QKeyEvent *event) override {
        // Forward key events to the tank
        tank->keyPressEvent(event);
    }

private:
    QGraphicsScene *scene; //画布实例
    Tank *tank; //坦克实例
};

//主函数
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //声明画布
    TankGame tankGame;
    //显示画布
    tankGame.show();

    return a.exec();
}
 

tank.pro文件中代码

QT -= core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
        main.cpp

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/433183.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业职能部门员工忙闲不均,如何调动积极性?

案例企业背景&#xff1a; 某企业隶属于中国航天科技集团公司&#xff0c;致力于光纤陀螺系统、微机电惯性系统、光纤传感系统等高新技术产品的研发。公司具有雄厚的新型惯导和光电传感技术基础&#xff0c;多年来开创了我国光纤陀螺技术在武器、卫星和载人飞船等多个任务上的…

C++20 协程原理与应用

协程 要想了解协程&#xff0c;最好先搞清楚进程&#xff0c;线程&#xff0c;这样才能将三者区分开来&#xff01; 进程 vs 线程 vs 协程 进程线程协程切换者操作系统操作系统用户&#xff08;编程者&#xff09;切换时机根据操作系统自己的切换策略&#xff0c;用户不感知根…

【QT+QGIS跨平台编译】之十二:【libpng+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文件目录 一、libpng介绍二、文件下载三、文件分析四、pro文件五、编译实践一、libpng介绍 PNG(Portable Network Graphics,便携式网络图形),是一种采用无损压缩算法的位图格式,支持索引、灰度、RGB三种颜色方案以及Alpha通道等特性。 PNG使用从LZ77派生的无损数据压缩算…

【JaveWeb教程】(28)SpringBootWeb案例之《智能学习辅助系统》的详细实现步骤与代码示例(1)

目录 SpringBootWeb案例011. 准备工作1.1 需求&环境搭建1.1.1 需求说明1.1.2 环境搭建 1.2 开发规范 2. 部门管理 SpringBootWeb案例01 前面我们已经讲解了Web前端开发的基础知识&#xff0c;也讲解了Web后端开发的基础(HTTP协议、请求响应)&#xff0c;并且也讲解了数据库…

IntelliJ IDEA 快捷键大全

IntelliJ IDEA 快捷键大全 一、文本编辑二、构建、编译项目 一、文本编辑 CtrlN 查找类 CtrlN 查找文件 CtrlF 查找文本 可以根据需求去选择红框内的选项 CtrlX 剪切 剪切选中文本&#xff0c;如果未选中则剪切当前行CtrlC 复制 复制选中文本&#xff0c;如果未选中则复制当前…

WEB安全渗透测试-pikachuDVWAsqli-labsupload-labsxss-labs靶场搭建(超详细)

目录 phpstudy下载安装 一&#xff0c;pikachu靶场搭建 1.下载pikachu 2.新建一个名为pikachu的数据库 3.pikachu数据库配置 ​编辑 4.创建网站 ​编辑 5.打开网站 6.初始化安装 二&#xff0c;DVWA靶场搭建 1.下载DVWA 2.创建一个名为dvwa的数据库 3.DVWA数据库配…

单片机学习笔记---矩阵键盘

目录 矩阵键盘的介绍 独立按键和矩阵按键的相同之处&#xff1a; 矩阵按键的扫描 代码演示 代码模块化移植 Keil自定义模板步骤&#xff1a; 代码编写 矩阵键盘就是开发板上右下角的这个模块 这一节的代码是基于上一节讲的LCD1602液晶显示屏驱动代码进行的 矩阵键盘的介…

QGIS编译(跨平台编译)之十五:libbz2编译(Windows、Linux、MacOS环境下编译)

文章目录 1、libbz2介绍2、文件下载3、Linux下编译4、MacOS下编译5、Windows下编译1、libbz2介绍 bzip2是一个基于Burrows-Wheeler 变换的无损压缩软件,压缩效果比传统的LZ77/LZ78压缩算法来得好。它是一款免费软件。可以自由分发免费使用。 bzip2能够进行高质量的数据压缩。…

六、VTK创建平面vtkPlaneSource

vtkPlaneSource创建位于平面中的四边形数组 先看看效果图: vtkPlaneSource 创建一个 m x n 个四边形数组,这些四边形在平面中排列为规则平铺。通过指定一个原点来定义平面,然后指定另外两个点,这两个点与原点一起定义平面的两个轴。这些轴不必是正交的 - 因此您可以创建平行…

python安装socketio一直安装不成功

系统一直显示系统的pip的版本不匹配&#xff0c; ERROR: Could not find a version that satisfies the requirement python-socketio (from versions: none) ERROR: No matching distribution found for python-socketio 最后解决方案 这个目录下创建pip.ini文本写入第三方源…

Java复习系列之阶段三:框架原理

1. Spring 1.1 核心功能 1. IOC容器 IOC&#xff0c;全称为控制反转&#xff08;Inversion of Control&#xff09;&#xff0c;是一种软件设计原则&#xff0c;用于减少计算机代码之间的耦合度。控制反转的核心思想是将传统程序中对象的创建和绑定由程序代码直接控制转移到…

【Java与网络6】实现一个自己的HTTP浏览器

前面我们讨论了HTTP协议的基本结构和Socket编程的基本原理&#xff0c;本文我们来整个大活&#xff1a;自己实现一个简单的浏览器。 目录 1.主线程循环体 2.readHostAndPort()方法的实现 3.readHttpRequest()方法的实现 4.sendHttpRequest()方法的实现 5.readHttpRespons…