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.

Пікірлер

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

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:50ұпай,
  • Бағалау ұпайлары-4
m
  • molni99
  • Қаз. 26, 2024, 1:37 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
m
  • molni99
  • Қаз. 26, 2024, 1:29 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:20ұпай,
  • Бағалау ұпайлары-10
Соңғы пікірлер
ИМ
Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
m
moogoҚар. 22, 2024, 7:17 Т.Ж.
Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectМаусым 4, 2022, 3:49 Т.Ж.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

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