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:
- Lektion 1. Wie man ein Spiel in Qt schreibt. Objektverwaltung
- Lektion 2. Wie man ein Spiel in Qt schreibt. Animation des Helden des Spiels (2D)
- Lektion 3. Wie man ein Spiel in Qt schreibt. Interaktion mit anderen Objekten
- Lektion 4. Wie man ein Spiel in Qt schreibt. Der Feind ist der Sinn des Überlebens
- Lektion 5. Wie man ein Spiel in Qt schreibt. Ton von QMediaPlayer hinzufügen
Из кьюта приложение не хочет запускаться, аварийно завершается, но каких-либо ошибок не выдаёт. Оно открывается, после нажатия "старт" зависает и завершается. Если не из кьюта запускать дебаг - та же ерунда. Релиз вообще отказывается работать, ошибки на картинках. Все dll и libs доложила и в дебаг, и в релиз. В чём может быть проблема?
А windeployqt вообще динамит, открывает консоль на секунду - и всё. Удаление qmakes и pro.user тоже не помогает
Ну может бибилотеки не те положили? У вас сборка для MinGW, а либы для MSVC.