Qt5.x-小游戏-翻金币

前言

    事情的起因需要从一只蝙蝠说起,那是2020年过年时,没有携带所有娱乐性工具的我回到老家后,经过麻将、电影、电视的洗礼,终于掏出来mac想学习一下c++。

    c++基础学完后,发现了Qt这门语言,经过了解是一门c++编写的跨平台桌面程序开发的框架,就继续进行学习观看,这个demo也是Qt教学视频中的老师最后带着一起完成的翻金币小游戏,日常生活中我从事的方向时J2EE方向,并不是过多的使用到学习到的东西,记录到简书中便于以后观看查阅。


    视频学习网站:B站

    视频路径:B站-Qt学习视频

    *素材是在评论中翻找好多以后某位大哥的,很多链接都失效了

    *如有侵权,请联系我进行删除及修改

    个人建议有兴趣的同学最好还是自己来一遍,如果实在敲的过程中有问题,也可以去我Github下载成品的所有代码。Github地址

    在学习的最后老师也提到过新加一些功能,我要立一个Flag:在闲暇的时候也会对这个成品进行一定程度的优化和修改。


1.代码结构说明

项目结构

主窗体-mainscene

选择关卡-chooseselevelscene

翻金币-playscene

金币封装-mycoin

关卡数据封装-dataconfig

自定义按钮类-mypushbutton

2.难点记录

    01.跳转设置新窗打开位置属性

        跳转时设置新窗体的geometry属性和本窗体相同,这样设置会解决窗体移动过后,打开的新窗体和旧窗体位置不同的bug;

    02.创建新窗体,初始化属性

        //设置固定大小,并且让窗体无法被更改

        setFixedSize(320, 588);

        //设置应用图标

        setWindowIcon(QPixmap(":/res/Coin0001.png"));

        //设置窗口标题

        setWindowTitle("选择关卡");

        //设置菜单栏

        QMenuBar * qMenuBar = menuBar();

        QAction * qAction = qMenuBar->addMenu("开始")->addAction("退出");

        this->setMenuBar(qMenuBar);

        //点击退出完成程序退出

        connect(qAction , &QAction::triggered, [=](){

            this->close();

        });

    重写窗体的画家事件,绘制窗体的背景图

    void ChooseLevelScene::paintEvent(QPaintEvent *event)   

    {

        //绘制背景图

        QPainter qPainter(this);

        QPixmap qPixmap;

        qPixmap.load(":/res/PlayLevelSceneBg.png");

        //绘制背景图

        qPainter.drawPixmap(0,0,this->width(),this->height(),qPixmap);

        //绘制左上角游戏名称

        qPixmap.load(":/res/Title.png");

        qPainter.drawPixmap(20,30,qPixmap.width(),qPixmap.height(),qPixmap);

    }

03.定时器QTimer使用

    Qt的定时器实现有两种,一个是重写定时事件(没使用过不清楚),另一个就是使用QTimer的静态方法:

    //500是延迟多少时间执行代码,单位是毫秒

    //[=](){ ... }    Lamda表达式(很屌,推荐学习而且使用不难)

    QTimer::singleShot(500, this, [=](){

        //operator code

    });

04.事件穿透设置上下对齐居中

    选择关卡时绘制关卡是通过自定义按钮MyPushButton进行绘制,显示关卡名称是通过QLabel相同大小覆盖在自定义按钮上。

    此时点击时无法触发自定义按钮上选择关卡后的操作,可使用鼠标点击事件穿透设置到QLabel上,label->setAttribute(Qt::WA_TransparentForMouseEvents);这时鼠标点击后QLabel不会阻拦点击事件,可以正常触发自定义按钮。

    在QLabel中设置text后默认时居左,设置上下左右对齐居中,label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);

05.设置开始游戏按钮的点击下沉弹回的动画

    //图标下沉

    void MyPushButton::zoom1()

    {

        QPropertyAnimation * animation1 = new QPropertyAnimation(this, "geometry");

        //设置事件间隔

        animation1->setDuration(200);

        //设置起始位置

        animation1->setStartValue(QRect(this->x(), this->y(), this->width(), this->height()));

        animation1->setEndValue(QRect(this->x(), this->y()+10, this->width(), this->height()));

        //设置动画,弹跳式,类似弹性球

        animation1->setEasingCurve(QEasingCurve::OutBounce);

        animation1->start();

    }

    //图标上浮

    void MyPushButton::zoom2()

    {

        QPropertyAnimation * animation1 = new QPropertyAnimation(this, "geometry");

        //设置事件间隔

        animation1->setDuration(200);

        //设置起始位置

        animation1->setStartValue(QRect(this->x(), this->y()+10, this->width(), this->height()));

        animation1->setEndValue(QRect(this->x(), this->y(), this->width(), this->height()));

        //设置动画,弹跳式,类似弹性球

        animation1->setEasingCurve(QEasingCurve::OutBounce);

        animation1->start();

    }

    //给start按钮绑定点击事件

    connect(btn_start, &QPushButton::clicked, [=](){

        btn_start->zoom1();

        btn_start->zoom2();

        //点击音效

        startSound->play();

        //延时0.5秒执行切换,展示start按钮的动效

        QTimer::singleShot(500, this, [=](){

            chooseLevel->setGeometry(this->geometry());

            this->hide();

            chooseLevel->show();

        });

    });

06.绘制一个4*4的选择关卡矩阵,不使用双层for循环的前提下,一个for循环完成绘制

    //创建关卡选择icon

    for(int i = 0; i < 20 ; i++)

    {

        MyPushButton * levelIcon = new MyPushButton(":/res/LevelIcon.png");

        levelIcon->setParent(this);

        levelIcon->move(25 + (i%4)*70 , 160 + (i/4)*70);

    }

* x轴:25 + (i%4)*70    25为偏移量,70是每个矩阵x轴大小,i%4在第一行0、1、2、3四列,每一行计算的值是0*70、1*70、2*70、3*70;

*y轴:160 + (i/4)*70    160为偏移量,70是每个矩阵y轴大小,i/4在第一列0、1、2、3四行,每一行计算的值是0*70、1*70、2*70、3*70;

*在记录其中每一个金币的坐标时,构建了新的二维数组保存位置信息,因为这种构建不太好保存位置信息

成品截图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容