- 1. Звук у структурі проекту
- 2. трикутник.h
- 3. triangle.cpp
- 4. віджет.h
- 5. widget.cpp
- 6. Підсумок
- 7. Відеоурок
Приступаємо до п'ятого та заключного уроку з написання гри на Qt, у якому додамо звук за допомогою класу QMediaPlayer . Пропоную додати три види звуків: Поїдання яблук, дзижчання Мухи , яка дзижчатиме при пересуванні і несамовитий крик, коли Муху з'їдять.
Звук у структурі проекту
Звук у структурі проекту міститься у файл ресурсів, як показано на скріншоті структури проекту.
Для цього створюємо папку resource і в ній папку game. Далі в папці resources створюємо файл ресурсів, у якому прописуємо префікс "/" та додаємо аудіо файли, які попередньо помістили до папки game.
А далі звуки необхідно підключити до проекту за допомогою класу QMediaPlayer.
У разі звуки підключаються у трьох місцях програмного коду.
трикутник.h
У заголовному файлі необхідно підключити бібліотеки класів QMediaPlayer та QMediaPlaylist. А також оголосити за об'єктом цих класів.
- #ifndef TRIANGLE_H
- #define TRIANGLE_H
- #include <QObject>
- #include <QGraphicsItem>
- #include <QPainter>
- #include <QGraphicsScene>
- #include <QMediaPlayer>
- #include <QMediaPlaylist>
- /** Подключаем библиотеку, отвечающую за использование WinAPI
- * Данная библиотека необходима для асинхронной проверки состояния клавиш
- * */
- #include <windows.h>
- class Triangle : public QObject, public QGraphicsItem
- {
- Q_OBJECT
- public:
- explicit Triangle(QObject *parent = 0);
- ~Triangle();
- // Программный код из прошлых уроков
- QMediaPlayer * m_player; // Аудио плеер
- QMediaPlaylist * m_playlist; // Плейлист
- };
- #endif // TRIANGLE_H
triangle.cpp
Ініціалізація об'єкта QMediaPlayer буде проводиться в конструкторі класу, але управління програвання звуку буде реалізовано в ігровому слоті Мусі , оскільки Муха повинна дзижчати лише тоді, коли пересувається по ігровій сцені.
- #include "triangle.h"
- Triangle::Triangle(QObject *parent) :
- QObject(parent), QGraphicsItem()
- {
- angle = 0; /// Задаём угол поворота графического объекта
- steps = 1; /// Задаём стартовое положение ножек мухи
- countForSteps = 0; /// Счётчик для отсчета тиков таймера, при которых мы нажимали на кнопки
- setRotation(angle); /// Устанавливаем угол поворота графического объекта
- m_player = new QMediaPlayer(this); // Инициализация плеера
- m_playlist = new QMediaPlaylist(m_player); // Инициализация плейлиста
- m_player->setPlaylist(m_playlist); // Установка плейлиста в аудио плеер
- m_playlist->addMedia(QUrl("qrc:/game/bzzz.wav")); // Добавление трека в плейлист
- m_playlist->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop); // Зацикливание трека
- }
- Triangle::~Triangle()
- {
- }
- QRectF Triangle::boundingRect() const
- {
- return QRectF(-40,-50,80,100); /// Ограничиваем область, в которой лежит треугольник
- }
- void Triangle::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
- {
- // Программный код из прошлых уроков
- }
- void Triangle::slotGameTimer()
- {
- /* Проверяем, нажата ли была какая-либо из кнопок управления объектом.
- * Прежде чем считать шажки
- * */
- if(GetAsyncKeyState(VK_LEFT) ||
- GetAsyncKeyState(VK_RIGHT) ||
- GetAsyncKeyState(VK_UP) ||
- GetAsyncKeyState(VK_DOWN))
- {
- // Программный код из прошлых уроков
- m_player->play(); // Плеер играет только тогда, когда муха движется
- } else {
- m_player->stop(); // Если Муха не движется, то отключаем плее
- }
- // Программный код из прошлых уроков
- }
віджет.h
У заголовному файлі класу, який відіграє роль ядра гри, необхідно лише підключити бібліотеки, які відповідають за класи QMediaPlayer та QMediaPlaylist.
widget.cpp
У цьому класі немає глобального оголошення об'єкта QMediaPlayer, оскільки об'єкти створюються динамічно, наприклад, для кожного з'їденого яблука. Через те, що яблука можуть з'їдатися дуже швидко і практично одночасно, то і звуки поїдання яблук будуть звучати разом, а один плеєр не впорається з таким завданням, тому доведеться запускати по плеєрі на кожен звук. Також окремим плеєром програватиметься загибель Мухи .
- #include "widget.h"
- #include "ui_widget.h"
- Widget::Widget(QWidget *parent) :
- QWidget(parent),
- ui(new Ui::Widget)
- {
- // программный код из прошлых уроков
- }
- 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++); /* Увеличиваем счёт на единицу
- * и отображаем на дисплее
- * */
- // Звук поедания яблока
- QMediaPlayer * m_player = new QMediaPlayer(this); // Инициализируем плеер
- QMediaPlaylist * m_playlist = new QMediaPlaylist(m_player); // Создаём плейлист
- m_player->setPlaylist(m_playlist); // Устанавливаем плейлист в плеер
- m_playlist->addMedia(QUrl("qrc:/game/hrum.wav")); // Добавляем аудио в плеер
- m_playlist->setPlaybackMode(QMediaPlaylist::CurrentItemOnce); // Проигрываем один раз
- m_player->play(); // Запускаем плеер
- }
- }
- }
- void Widget::slotCreateApple()
- {
- // программный код из прошлых уроков
- }
- void Widget::on_pushButton_clicked()
- {
- // программный код из прошлых уроков);
- ui->pushButton->setEnabled(false);
- gameState = GAME_STARTED;
- }
- void Widget::slotGameOver()
- {
- /* Если игра окончена
- * Отключаем все таймеры
- * */
- timer->stop();
- timerCreateApple->stop();
- // Если Муха Погибла, то запускаем предсмертный крик
- 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(); // Запускаем трек
- // программный код из прошлых уроков
- }
- void Widget::slotPause()
- {
- // программный код из прошлых уроков
- }
Підсумок
Ось і закінчено роботу над нашою першою грою. Тепер у Вас є уявлення про те, як створити просту гру на Qt C++.
Усі, хто цікавиться вихідниками гри, можуть завантажити їх за цим посиланням: Source
Всі, хто цікавиться самою грою і просто хоче в неї зіграти, можуть завантажити її за цим посиланням: [/Muha_Setup]
Повний список статей цього циклу:
- Урок 1. Як написати гру на Qt. Управління об'єктом
- Урок 2. Як написати гру на Qt. Анімація героя ігри (2D)
- Урок 3. Як написати гру на Qt. Взаємодія з іншими об'єктами
- Урок 4. Як написати гру на Qt. Ворог - сенс у виживанні
- Урок 5. Як написати гру на Qt. Додаємо звук із QMediaPlayer
Из кьюта приложение не хочет запускаться, аварийно завершается, но каких-либо ошибок не выдаёт. Оно открывается, после нажатия "старт" зависает и завершается. Если не из кьюта запускать дебаг - та же ерунда. Релиз вообще отказывается работать, ошибки на картинках. Все dll и libs доложила и в дебаг, и в релиз. В чём может быть проблема?
А windeployqt вообще динамит, открывает консоль на секунду - и всё. Удаление qmakes и pro.user тоже не помогает
Ну может бибилотеки не те положили? У вас сборка для MinGW, а либы для MSVC.