Getting to the fifth and final lesson on writing games on Qt, which will add sound using QMediaPlayer class. I propose to add the three types of sounds: Eating apples, buzzing flies that will be buzzing when moving and heartbreaking cry when Fly will eaten.
The sound in the project structure
The sound in the project structure is placed in a resource file, as shown in the screenshot of the project structure.
To do this, create a resource directory and folder game . Further, in the resources folder, create a resource file, which prescribes the prefix "/" and add audio files that are pre-placed in the game folder.
And then the sound must be connected to the project using QMediaPlayer class.
In this case, the sounds are connected in three places of the code.
triangle.h
In the header file, you must connect the class library and QMediaPlayer QMediaPlaylist. And also announce at the object of these classes.
- #ifndef TRIANGLE_H
- #define TRIANGLE_H
- #include <QObject>
- #include <QGraphicsItem>
- #include <QPainter>
- #include <QGraphicsScene>
- #include <QMediaPlayer>
- #include <QMediaPlaylist>
- #include <windows.h>
- class Triangle : public QObject, public QGraphicsItem
- {
- Q_OBJECT
- public:
- explicit Triangle(QObject *parent = 0);
- ~Triangle();
- // The code from the previous lessons
- QMediaPlayer * m_player; // Audio player
- QMediaPlaylist * m_playlist; // Playlist
- };
- #endif // TRIANGLE_H
triangle.cpp
Initialization QMediaPlayer object is made in the constructor of the class, but the management of audio playback will be realized in the slot game Fly as fly should buzz only when the game moves on stage.
- #include "triangle.h"
- Triangle::Triangle(QObject *parent) :
- QObject(parent), QGraphicsItem()
- {
- angle = 0;
- steps = 1;
- countForSteps = 0;
- setRotation(angle);
- m_player = new QMediaPlayer(this); // Init player
- m_playlist = new QMediaPlaylist(m_player); // Init playlist
- m_player->setPlaylist(m_playlist); // Set playlist into player
- m_playlist->addMedia(QUrl("qrc:/game/bzzz.wav")); // Adding of track to playlist
- m_playlist->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop); // track loop
- }
- Triangle::~Triangle()
- {
- }
- QRectF Triangle::boundingRect() const
- {
- return QRectF(-40,-50,80,100);
- }
- void Triangle::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
- {
- // The code from the previous lessons
- }
- void Triangle::slotGameTimer()
- {
- if(GetAsyncKeyState(VK_LEFT) ||
- GetAsyncKeyState(VK_RIGHT) ||
- GetAsyncKeyState(VK_UP) ||
- GetAsyncKeyState(VK_DOWN))
- {
- // The code from the previous lessons
- m_player->play(); // The player plays only when the fly moves
- } else {
- m_player->stop();
- }
- // The code from the previous lessons
- }
widget.h
The class header file, which acts as the core of the game, you only need to connect the library, which are responsible for classes and QMediaPlayer QMediaPlaylist.
widget.cpp
In this class, there is no global ad QMediaPlayer object because objects are created dynamically, for example, for every apple eaten. Due to the fact that apples can be eaten very quickly and almost simultaneously, and the sounds of eating apples will sound together, one player can not cope with such a task, so you have to run on the player at every sound. Also individual player will play death of Fly.
- #include "widget.h"
- #include "ui_widget.h"
- Widget::Widget(QWidget *parent) :
- QWidget(parent),
- ui(new Ui::Widget)
- {
- // The code from the previous lessons
- }
- Widget::~Widget()
- {
- delete ui;
- }
- void Widget::slotDeleteApple(QGraphicsItem *item)
- {
- foreach (QGraphicsItem *apple, apples) {
- if(apple == item){
- scene->removeItem(apple);
- apples.removeOne(apple);
- delete apple;
- ui->lcdNumber->display(count++);
- // The sound eating apple
- QMediaPlayer * m_player = new QMediaPlayer(this); // Initialize player
- QMediaPlaylist * m_playlist = new QMediaPlaylist(m_player); // create a playlist
- m_player->setPlaylist(m_playlist); // set playlist to player
- m_playlist->addMedia(QUrl("qrc:/game/hrum.wav")); // Add audio to player
- m_playlist->setPlaybackMode(QMediaPlaylist::CurrentItemOnce); // play one time
- m_player->play(); // run player
- }
- }
- }
- void Widget::slotCreateApple()
- {
- // The code from the previous lessons
- }
- void Widget::on_pushButton_clicked()
- {
- // The code from the previous lessons
- ui->pushButton->setEnabled(false);
- gameState = GAME_STARTED;
- }
- void Widget::slotGameOver()
- {
- timer->stop();
- timerCreateApple->stop();
- // If Fly was Killed, then run death cry
- QMediaPlayer * m_player = new QMediaPlayer(this);
- QMediaPlaylist * m_playlist = new QMediaPlaylist(m_player);
- m_player->setPlaylist(m_playlist);
- m_playlist->addMedia(QUrl("qrc:/game/scream.wav"));
- m_playlist->setPlaybackMode(QMediaPlaylist::CurrentItemOnce);
- m_player->play();
- // The code from the previous lessons
- }
- void Widget::slotPause()
- {
- // The code from the previous lessons
- }
Result
That's finished work on our first game. Now you have an idea of how to create a simple game on the Qt C ++.
Full source code: Source
Game: Muha_Setup
A full list of articles in this series:
- Lesson 1. How to make game using Qt. Control of object
- Lesson 2. How to make game using Qt. Animation game hero (2D)
- Lesson 3. How to make game using Qt. Interaction with other objects
- Lesson 4. How to make game using Qt. Enemy – meaning in the survival
- Lesson 5. How to make game using Qt. Adding sound QMediaPlayer
Из кьюта приложение не хочет запускаться, аварийно завершается, но каких-либо ошибок не выдаёт. Оно открывается, после нажатия "старт" зависает и завершается. Если не из кьюта запускать дебаг - та же ерунда. Релиз вообще отказывается работать, ошибки на картинках. Все dll и libs доложила и в дебаг, и в релиз. В чём может быть проблема?
А windeployqt вообще динамит, открывает консоль на секунду - и всё. Удаление qmakes и pro.user тоже не помогает
Ну может бибилотеки не те положили? У вас сборка для MinGW, а либы для MSVC.