Evgenii Legotckoi
Evgenii LegotckoiҚыр. 23, 2015, 11 Т.Ж.

Qt тілінде ойынды қалай жазу керек - 5-сабақ. QMediaPlayer көмегімен дыбыс қосу

Qt тілінде ойын жазудың бесінші және соңғы сабағына көшейік, онда QMediaPlayer сыныбы арқылы дыбыс қосамыз. Мен дыбыстың үш түрін қосуды ұсынамын: алма жеу, қозғалғанда ызылдаған Шыбын және Шыбын жегенде жүректі ауыртатын айқай.

Жоба құрылымындағы дыбыс

Жоба құрылымындағы дыбыс жоба құрылымының скриншотында көрсетілгендей ресурстық файлға орналастырылады.

Ол үшін ресурс қалтасын және ондағы ойын қалтасын жасаңыз. Содан кейін ресурстар қалтасында біз "/" префиксі қойылатын ресурс файлын жасаңыз және аудио файлдарды қосыңыз. бұрын қалта ойынында орналастырылған.

Содан кейін дыбыстар QMediaPlayer. класы арқылы жобаға қосылуы керек

Бұл жағдайда дыбыстар бағдарлама кодында үш жерде қосылады.


үшбұрыш.сағ

Тақырып файлында 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 нысанын инициализациялау сынып конструкторында орындалады, бірақ дыбысты ойнатуды басқару Fly ойын ұяшығында жүзеге асырылады, өйткені Fly қозғалған кезде ғана шырылдауы керек. ойын сахнасы.

#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

Осы сериядағы мақалалардың толық тізімі:

Бейне оқулық

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

ВН
  • Наурыз 22, 2019, 7:08 Т.Ж.
  • (өңделген)

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


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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
Г

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:66ұпай,
  • Бағалау ұпайлары-1
t

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:33ұпай,
  • Бағалау ұпайлары-10
t

Qt - Тест 001. Сигналы и слоты

  • Нәтиже:52ұпай,
  • Бағалау ұпайлары-4
Соңғы пікірлер
G
GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrАқп. 8, 2024, 6:43 Т.Қ.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
FynjyШілде 22, 2024, 4:15 Т.Ж.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCTМаусым 25, 2024, 1 Т.Ж.
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCTМамыр 5, 2024, 5:46 Т.Ж.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

Бізді әлеуметтік желілерде бақылаңыз