Evgenii Legotckoi
Evgenii LegotckoiSept. 23, 2015, 11 a.m.

How to make game using Qt - Lesson 5. Adding sound QMediaPlayer

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:

Video

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

ВН
  • March 22, 2019, 7:08 a.m.
  • (edited)

Из кьюта приложение не хочет запускаться, аварийно завершается, но каких-либо ошибок не выдаёт. Оно открывается, после нажатия "старт" зависает и завершается. Если не из кьюта запускать дебаг - та же ерунда. Релиз вообще отказывается работать, ошибки на картинках. Все dll и libs доложила и в дебаг, и в релиз. В чём может быть проблема?
А windeployqt вообще динамит, открывает консоль на секунду - и всё. Удаление qmakes и pro.user тоже не помогает


Ну может бибилотеки не те положили? У вас сборка для MinGW, а либы для MSVC.

Comments

Only authorized users can post comments.
Please, Log in or Sign up
B

C++ - Test 002. Constants

  • Result:16points,
  • Rating points-10
B

C++ - Test 001. The first program and data types

  • Result:46points,
  • Rating points-6
FL

C++ - Test 006. Enumerations

  • Result:80points,
  • Rating points4
Last comments
k
kmssrFeb. 8, 2024, 6:43 p.m.
Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVADec. 25, 2023, 10:30 a.m.
Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJoDec. 25, 2023, 8:38 a.m.
Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
GvozdikDec. 18, 2023, 9:01 p.m.
Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Now discuss on the forum
AC
Alexandru CodreanuJan. 19, 2024, 11:57 a.m.
QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…
BlinCT
BlinCTDec. 27, 2023, 8:57 a.m.
Растягивать Image на парент по высоте Ну и само собою дял включения scrollbar надо чтобы был Flickable. Так что выходит как то так Flickable{ id: root anchors.fill: parent clip: true property url linkFile p…
Дмитрий
ДмитрийJan. 10, 2024, 4:18 a.m.
Qt Creator загружает всю оперативную память Проблема решена. Удалось разобраться с помощью утилиты strace. Запустил ее: strace ./qtcreator Начал выводиться весь лог работы креатора. В один момент он начал считывать фай…
Evgenii Legotckoi
Evgenii LegotckoiDec. 12, 2023, 6:48 a.m.
Побуквенное сравнение двух строк Добрый день. Там случайно не высылается этот сигнал textChanged ещё и при форматировани текста? Если решиать в лоб, то можно просто отключать сигнал/слотовое соединение внутри слота и …

Follow us in social networks