- 1. Жоба құрылымындағы дыбыс
- 2. үшбұрыш.сағ
- 3. triangle.cpp
- 4. виджет.h
- 5. widget.cpp
- 6. Барлығы
- 7. Бейне оқулық
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
Осы сериядағы мақалалардың толық тізімі:
- 1-сабақ. Qt тілінде ойынды қалай жазуға болады. Объектіні басқару
- 2-сабақ. Qt ойынды қалай жазуға болады. Ойын кейіпкерінің анимациясы (2D)
- 3-сабақ. Qt ойынды қалай жазуға болады. Басқа нысандармен әрекеттесу
- 4-сабақ. Qt ойынды қалай жазуға болады. Жау – аман қалудың мәні
- 5-сабақ. Qt ойынды қалай жазуға болады. QMediaPlayer көмегімен дыбыс қосу
Из кьюта приложение не хочет запускаться, аварийно завершается, но каких-либо ошибок не выдаёт. Оно открывается, после нажатия "старт" зависает и завершается. Если не из кьюта запускать дебаг - та же ерунда. Релиз вообще отказывается работать, ошибки на картинках. Все dll и libs доложила и в дебаг, и в релиз. В чём может быть проблема?
А windeployqt вообще динамит, открывает консоль на секунду - и всё. Удаление qmakes и pro.user тоже не помогает
Ну может бибилотеки не те положили? У вас сборка для MinGW, а либы для MSVC.