Evgenii Legotckoi
Evgenii Legotckoi23. September 2015 11:00

So erstellen Sie ein Spiel mit Qt - Lektion 5. Hinzufügen von Sound QMediaPlayer

Fahren wir mit der fünften und letzten Lektion über das Schreiben eines Spiels in Qt fort, in der wir mit der Klasse QMediaPlayer Sound hinzufügen. Ich schlage vor, drei Arten von Geräuschen hinzuzufügen: Äpfel essen, Fly summen, das bei Bewegung summt und ein herzzerreißender Schrei, wenn Fly gegessen wird.

Sound in der Projektstruktur

Das Audio in der Projektstruktur wird in einer Ressourcendatei platziert, wie im Screenshot der Projektstruktur gezeigt.

Erstellen Sie dazu einen Ressourcenordner und einen Spieleordner darin. Als nächstes erstellen Sie im Ressourcenordner eine Ressourcendatei, in der wir das Präfix "/" voranstellen und hinzufügen die Audiodateien, die zuvor im Ordner game abgelegt wurden.

Und dann müssen die Sounds über den QMediaPlayer mit dem Projekt verbunden werden. klasse

In diesem Fall werden Töne im Programmcode an drei Stellen verbunden.


dreieck.h

In die Headerdatei müssen Sie die Klassenbibliotheken QMediaPlayer und QMediaPlaylist einschließen. Und deklarieren Sie auch nach Objekten dieser Klassen.

#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

Dreieck.cpp

Das Objekt QMediaPlayer wird im Klassenkonstruktor initialisiert, die Steuerung der Soundwiedergabe wird jedoch im Spielslot Fly implementiert, da das Fly nur summen sollte, wenn es sich in der Spielszene bewegt .

#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();   // Если Муха не движется, то отключаем плее
    }

    // Программный код из прошлых уроков
}

widget.h

In der Header-Datei der Klasse, die den Kern des Spiels spielt, müssen Sie nur die Bibliotheken anbinden, die für die Klassen QMediaPlayer und QMediaPlaylist zuständig sind.

widget.cpp

In dieser Klasse gibt es keine globale Deklaration des QMediaPlayer Objekts, da die Objekte dynamisch erzeugt werden, zB für jeden gegessenen Apfel. Aufgrund der Tatsache, dass Äpfel sehr schnell und praktisch gleichzeitig gegessen werden können, klingen die Geräusche beim Essen von Äpfeln zusammen, und ein Spieler kann diese Aufgabe nicht bewältigen, sodass Sie für jedes Geräusch einen Spieler ausführen müssen. Außerdem spielt ein separater Spieler den Tod von Fly .

#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()
{
    // программный код из прошлых уроков
}

Ergebnis

Damit ist die Arbeit an unserem ersten Spiel abgeschlossen. Jetzt haben Sie eine Idee, wie Sie ein einfaches Qt-C++-Spiel erstellen können.

Jeder, der sich für den Quellcode des Spiels interessiert, kann ihn unter diesem Link herunterladen: Quelle

Wer sich für das Spiel selbst interessiert und es einfach nur spielen möchte, kann es unter diesem Link herunterladen: Muha_Setup

Vollständige Liste der Artikel dieser Serie:

Videoanleitung

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

ВН
  • 22. März 2019 07:08
  • (bearbeitet)

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


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

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken