- 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.