广告位联系
返回顶部
分享到

基于Qt实现电子木鱼小游戏的方法

C语言 来源:互联网 作者:佚名 发布时间:2023-01-04 21:35:37 人浏览
摘要

今年最火爆的解压小游戏电子木鱼,现在许多软件都上架了这个小程序。我在网上看了一下基本上都是用py和Java写的,所以我用QT重新写了一下,作为小白练手项目非常适合 一、界面展

今年最火爆的解压小游戏电子木鱼,现在许多软件都上架了这个小程序。我在网上看了一下基本上都是用py和Java写的,所以我用QT重新写了一下,作为小白练手项目非常适合

一、界面展示

二、功能模块

功能设计

鼠标点击和释放事件,模拟敲打木鱼动作

每一次的敲打木鱼都会缩小和放大一次

并且在木鱼上方显示出"功德+1"字样和播放一次敲打木鱼的声音

背景音乐一直播放

设置一个按钮为自动敲击木鱼

设置一个按钮为背景音乐的开关

1) 木鱼缩放

我是使用的一个label来放图片

缩小的原理是在现有木鱼图片大小上长和宽都同时缩小一个比例m

因为是按照中心点不变的缩小

所以左上点pos的坐标下降m/2

放大同理

1

2

3

4

5

6

7

8

9

10

11

12

13

14

// m =  10 图签放大,pos点上移.

// m =  -10 图签缩小,pos点下移.

void Widget::MuYu(int m)

{

    //获取当前label图片宽

    int currentWidth = ui->label->width();

    //获取当前label图片高

    int currentHeight = ui->label->height();

    //改变图片大小

    currentWidth += m;

    currentHeight += m;

    //在标签上重新设置图片大小和图片起始位置

    ui->label->setGeometry(ui->label->pos().x()-m/2,ui->label->pos().y()-m/2,currentWidth, currentHeight);

}

2) 功德+1 显示

用一个label设置文字 “功德+1”

这里文字出现的位置可以是随机的也可以定点出现

随机出现可以跟踪鼠标点击的位置

定点出现要提前写一个QPoint指定地点 (示例这个方式)

每一次出现后先上移一定位置(会使用QT动画函数 QPropertyAnimation ),然后消失

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

void Widget::gongde()

{

    ui->label_2->setText("功德+1");

    //QPropertyAnimation *m_TopPropertyAnimation;

    //绑定要移动的label对象

    m_TopPropertyAnimation->setTargetObject(ui->label_2);

    //设置按pos属性移动

    m_TopPropertyAnimation->setPropertyName("pos");

    // set 动画的起点、终点、持续时间

    m_TopPropertyAnimation->setDuration(600);

    m_TopPropertyAnimation->setStartValue(pos);

    m_TopPropertyAnimation->setEndValue(pos+QPoint(0, -120));

    // 启动和结束

    m_TopPropertyAnimation->start();

    //这里加一个延时函数避免,避免动画没有结束直接清除文字

    Delay(600);

    //清除文字

    ui->label_2->clear();

}

3) 音乐

背景音乐BGM<<大悲咒>>直接功德加满

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

void Widget::bgMusice()

{

    //QMediaPlayer *bg_player;

    qDebug()<<"dmz";

    //BACKMUSICE 宏定义文件路径

    bg_player->setMedia(QUrl::fromLocalFile(BACKMUSICE));

    bg_player->setVolume(10);

    bg_player->play();

    // 槽函数 监听QMediaPlayer::mediaStatusChanged信号 实现背景音乐循环播放

    connect(bg_player, &QMediaPlayer::mediaStatusChanged,this,&Widget::initStatus);

}

void Widget::initStatus(QMediaPlayer::MediaStatus status)

{

    if(status == QMediaPlayer::EndOfMedia)

        {

            bg_player->setPosition(0);

            bg_player->play();

        }

}

敲击木鱼声音

1

2

3

4

5

6

7

8

9

10

11

void Widget::MuYuMusice()

{

    //QMediaPlayer *MuYu_player;

    //设置要播放的媒体

    //MUYUMUSICE宏定义文件路径

    MuYu_player->setMedia(QUrl::fromLocalFile(MUYUMUSICE));

    //设置音量

    MuYu_player->setVolume(50);

    //播放

    MuYu_player->play();

}

4) 自动

写个槽函数,定时器定时触发,可以绑定滑杆设置一个敲打频率,同理可以调节背景音乐大小

1

2

3

4

5

6

7

8

9

10

11

12

void Widget::Auto()

{

    qDebug()<<"Auto";

    //图片缩小

    MuYu(-10);

    //敲到木鱼声音

    MuYuMusice();

    //功德+1文字

    gongde();

    //图片放大

    MuYu(10);

}

5) 延时

1

2

3

4

5

6

void Widget::Delay(int delay_time)

{

    QEventLoop loop;

    QTimer::singleShot(delay_time,&loop,SLOT(quit()));

    loop.exec();

}

三、完整代码

widget.h

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

#ifndef WIDGET_H

#define WIDGET_H

 

#include <QWidget>

#include <QPainter>

#include <QRect>

#include <QPropertyAnimation>

#include <QMediaPlayer>

#include <QTime>

#include <QTimer>

#include <QSystemTrayIcon>

#include <QLabel>

#include <QPainter>

#include <QRect>

 

#define WIDTH 480

#define HEIGH 640

#define MUYUMUSICE "C:\\Users\\Liu\\Desktop\\code\\QT\\muyu\\untitled\\musice\\muyu.mp3"

#define BACKMUSICE "C:\\Users\\Liu\\Desktop\\code\\QT\\muyu\\untitled\\musice\\bg.mp3"

#define ICON ":/img/muy.ico"

 

QT_BEGIN_NAMESPACE

 

namespace Ui { class Widget; }

QT_END_NAMESPACE

 

class Widget : public QWidget

{

    Q_OBJECT

 

public:

    Widget(QWidget *parent = nullptr);

    ~Widget();

 

    void mousePressEvent(QMouseEvent *event);   //点击

    void mouseReleaseEvent(QMouseEvent *event); //释放

    void MuYu(int);

    void gongde();

    void MuYuMusice();

    void bgMusice();

    void Delay(int);

    void tray();

    void initStatus(QMediaPlayer::MediaStatus status); // 槽函数 监听QMediaPlayer::mediaStatusChanged信号

private slots:

    void on_toolButton_2_clicked(bool checked);

    void on_toolButton_clicked(bool checked);

    void Auto();

 

private:

    Ui::Widget *ui;

    QMediaPlayer *MuYu_player;

    QMediaPlayer *bg_player;

    QPoint pos;

    QPropertyAnimation *m_TopPropertyAnimation;

    QTimer *timer;

    QSystemTrayIcon *m_systemTray;

    int conut=0;

};

#endif // WIDGET_H

widget.cpp

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

#include "widget.h"

#include "ui_widget.h"

#include <QDebug>

#include <QMouseEvent>

 

Widget::Widget(QWidget *parent)

    : QWidget(parent)

    , ui(new Ui::Widget)

{

    setMouseTracking(true);

    ui->setupUi(this);

    bg_player = new QMediaPlayer;

    MuYu_player = new QMediaPlayer;

 

    this->setWindowTitle("电子木鱼");

    this->setFixedSize(WIDTH,HEIGH);

    this->setWindowIcon(QIcon(ICON));

    m_TopPropertyAnimation = new QPropertyAnimation(this);

    pos=ui->label_2->pos();

 

    timer = new QTimer;

    connect(timer,SIGNAL(timeout()),this,SLOT(Auto()));

    bgMusice();

    tray();

 

}

 

Widget::~Widget()

{

    delete ui;

}

 

void Widget::tray()

{

    m_systemTray = new QSystemTrayIcon(this);

    m_systemTray->setIcon(QIcon(ICON));

    m_systemTray->setToolTip("SystemTray Program");

    m_systemTray->show();

}

 

// m=10 图签放大 pos点上移

// m=-10 图签缩小 pos点下移

void Widget::MuYu(int m)

{

    //获取当前label图片宽

    int currentWidth = ui->label->width();

    //获取当前label图片高

    int currentHeight = ui->label->height();

    //改变图片大小

    currentWidth += m;

    currentHeight += m;

    //在标签上重新设置图片大小和图片起始位置

    ui->label->setGeometry(ui->label->pos().x()-m/2,ui->label->pos().y()-m/2,currentWidth, currentHeight);

}

void Widget::MuYuMusice()

{

    //设置要播放的媒体

    MuYu_player->setMedia(QUrl::fromLocalFile(MUYUMUSICE));

    //设置音量

    MuYu_player->setVolume(50);

    //播放

    MuYu_player->play();

}

 

void Widget::bgMusice()

{

    qDebug()<<"dmz";

    bg_player->setMedia(QUrl::fromLocalFile(BACKMUSICE));

    bg_player->setVolume(10);

    bg_player->play();

    // 槽函数 监听QMediaPlayer::mediaStatusChanged信号 实现背景音乐循环播放

    connect(bg_player, &QMediaPlayer::mediaStatusChanged,this,&Widget::initStatus);

}

void Widget::initStatus(QMediaPlayer::MediaStatus status)

{

    if(status == QMediaPlayer::EndOfMedia)

        {

            bg_player->setPosition(0);

            bg_player->play();

        }

}

 

void Widget::gongde()

{

    ui->label_2->setText("功德+1");

    // bind

    m_TopPropertyAnimation->setTargetObject(ui->label_2);

    m_TopPropertyAnimation->setPropertyName("pos");

    // set 动画的起点、终点、持续时间

    m_TopPropertyAnimation->setDuration(600);

    m_TopPropertyAnimation->setStartValue(pos);

    m_TopPropertyAnimation->setEndValue(pos+QPoint(0, -120));

    // 启动和结束

    m_TopPropertyAnimation->start();

    Delay(600);

    ui->label_2->clear();

}

 

void Widget::mousePressEvent(QMouseEvent *event)

{

    qDebug()<<"press";

    MuYu(-10);

    MuYuMusice();

    gongde();

}

 

void Widget::mouseReleaseEvent(QMouseEvent *event)

{

    qDebug()<<"release";

    MuYu(10);

}

 

void Widget::on_toolButton_clicked(bool checked)

{

    if (checked) {

        timer->start(500);

    }

    else {

        timer->stop();

    }

}

 

void Widget::on_toolButton_2_clicked(bool checked)

{

    if(checked)

    {

        bg_player->stop();

    }else {

        bg_player->play();

    }

}

 

void Widget::Auto()

{

    qDebug()<<"Auto";

    MuYu(-10);

    MuYuMusice();

    gongde();

    MuYu(10);

}

 

//延时

void Widget::Delay(int delay_time)

{

    QEventLoop loop;

    QTimer::singleShot(delay_time,&loop,SLOT(quit()));

    loop.exec();

}


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/qq_51163115/article/details/128499635
相关文章
  • vscode调试gstreamer源码的流程介绍

    vscode调试gstreamer源码的流程介绍
    1. 安装vscode插件 C/C++ C/C++ Extension 2. 配置文件修改 vscode中每个项目都有一套配置文件集合,位于.vscode目录下,其中有: tasks.json:编译的相
  • 基于Qt实现电子木鱼小游戏的方法
    今年最火爆的解压小游戏电子木鱼,现在许多软件都上架了这个小程序。我在网上看了一下基本上都是用py和Java写的,所以我用QT重新写了一
  • C++小游戏教程之猜数游戏的实现

    C++小游戏教程之猜数游戏的实现
    0. 引言 本章主要讲解如何做一个简易的猜数游戏,分为用户猜数和系统猜数。 前置芝士: 「C++小游戏教程」基本技巧(1)随机化 1. 用户猜数
  • C++AVL树4种旋转详讲(左单旋、右单旋、左右双旋、

    C++AVL树4种旋转详讲(左单旋、右单旋、左右双旋、
    引子:AVL树是因为什么出现的? 二叉搜索树可以缩短查找的效率,如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在
  • C++11成员函数作为回调函数的使用方式
    C++11成员函数作为回调函数使用 std::bind()被广泛地应用在新式的回调函数中。 C++11以前类的普通成员函数不能作为回调函数去注册,因为将普
  • C++11, 14, 17对tuple元素的访问介绍
    C++11, 14, 17对tuple元素的访问 std::tuple 作为可以存放任意个数,任意类型的元祖被我个人经常使用。 记得以前看侯捷谈到这个数据结构的时候
  • C++使用easyX库实现三星环绕效果流程介绍

    C++使用easyX库实现三星环绕效果流程介绍
    功能1:使用图形化的方式描述地球围绕着太阳转动,月球围绕着地球转动 功能2:在转动的过程中当用户按下1,2,3,4,5,6,7时它可以变换出7种不
  • C++时间函数整理介绍
    一、 时间概念 格林威治时间GMT(Greenwich Mean Time) 格林威治皇家天文台为了海上霸权的扩张计划,在十七世纪就开始进行天体观测。为了天
  • C++中类的六大默认成员函数的介绍

    C++中类的六大默认成员函数的介绍
    一、类的默认成员函数 二、构造函数Date(形参列表) 构造函数主要完成初始化对象,相当于C语言阶段写的Init函数。 默认构造函数:无参的构
  • C/C++实现遍历文件夹最全方法总结介绍

    C/C++实现遍历文件夹最全方法总结介绍
    一、filesystem(推荐) 在c++17中,引入了文件系统,使用起来非常方便 在VS中,可以直接在项目属性中调整: 只要是C++17即以上都可 然后头文件
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计