R
Revolt5 июля 2016 г. 17:28

Создание игры в QT Арканойд

gamedev, Qt, арканоид

Я первый раз работаю в QT (и знаний в ООП нет). Я читал и смотрел уроки с данного сайта, но столкнулся с 2 проблемами реализация кнопки старта и сам мячик с его движением, без этого программа работает (т.е. есть блоки и платформа). Дальше у меня никак не получается. Кто знает и может подсказать как это все реализовать помогите пожалуйста.
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

17
Evgenii Legotckoi
  • 5 июля 2016 г. 19:30
Реализуйте для начала движение мячика в пространстве, ограниченном какой-нибудь областью.
К примеру в пределах прямоугольника.
Чтобы он отражался от границ этого прямоугольника. Почитайте про угол падения и отражения.
А также про их расчёт, сюда же формулы косинуса и синуса угла пойдут.
Что касается изменения положения мячика, то пересчитывать его соответственно по срабатыванию игрового таймера.
    R
    • 6 июля 2016 г. 23:09
    Насчет мяча я разобрался и перенес, но теперь не выходит реализовать взаимодействие с блоками что бы они удалялись и мяч отскакивал (все блоки у меня реализованы отдельными файлами).
    P.S. Пытался по принципу взаимодействия мухи с яблоками из урока “Как написать игру на Qt — Урок 3. Взаимодействие с другими объектами”, но не вышло.
      Evgenii Legotckoi
      • 6 июля 2016 г. 23:36

      все блоки у меня реализованы отдельными файлами

      Это как вообще?
      Приведите примеры кода и конкретизируйте проблему. Как именно не выходит, что происходит или не происходит. Поскольку высказывание “Не выходит” Вообще не несёт никакой информации.

      По идее, по игровому таймеру нужно проверять, есть ли в месте нахождения мячика, какой-нибудь из блоков. Если есть, то либо снижать его жизненный ресурс, если это предусмотрено, либо уничтожать его вовсе.

        R
        • 7 июля 2016 г. 1:00

        Реализация блоков отдельными файлами это каждому прямоугольнику на сцене соответствуют свой заголовочный и исходный файлы т.к. когда я в начале пытался реализовать несколько от одних и тех же файлов отображался всего 1 поэтому я решил исправить эту проблему таким образом. Как я говорил я впервые сталкиваюсь с графикой и классами поэтому мне тяжело понять и объяснить что здесь не так, я всю программу по образу игры с мухой строил т.к. нас этому не обучали, но сейчас дали задание сделайте и я как-то пытаюсь понять и разобраться в этом. Я приложил файлы мяча, widget.h и widget.cpp. Может быть это даст понять что я делаю не так.

        arkanoid.rar

          Evgenii Legotckoi
          • 7 июля 2016 г. 12:48

          С файлами, конечно, жесть полная получилась. Так ни в коем случае делать нельзя.
          Нужно делать один класс, а потом от него делать экземпляры этого класса.
          Я немного модифицировал класс Widget.
          Сравните его с вашим вариантом.
          widget.h

          #ifndef WIDGET_H
          #define WIDGET_H
           
          #include <QWidget>
          #include <QGraphicsScene>
          #include <QShortcut>
          #include <QTimer>
           
          #include <platforma.h>
          #include <ball.h>
          #include <blok1.h>
           
          namespace Ui {
          class Widget;
          }
           
          class Widget : public QWidget
          {
              Q_OBJECT
           
          public:
              explicit Widget(QWidget *parent = 0);
              ~Widget();
           
          private:
              Ui::Widget      *ui;
              QGraphicsScene  *scene;     /// Объявляем графическую сцену
              Platforma       *platforma; /// Платформу отбивающую мячик
              Ball            *ball;      /// сам мячик
              QTimer          *timer;
              QList<QGraphicsItem *> bloks;
           
          private slots:
              void slotDeleteBloks(QGraphicsItem * item);
              void slotCreateBloks();
           
          };
           
          #endif // WIDGET_H

          widget.cpp

          #include "widget.h"
          #include "ui_widget.h"
           
          Widget::Widget(QWidget *parent) :
              QWidget(parent),
              ui(new Ui::Widget)
          {
              ui->setupUi(this);
              this->resize(860,660);          /// Задаем размеры окна
              this->setFixedSize(860,660);
           
              scene = new QGraphicsScene();
              platforma = new Platforma();
              ball = new Ball();              /// Инициализируем мячик
           
              ui->graphicsView->setScene(scene);
              ui->graphicsView->setRenderHint(QPainter::Antialiasing);
              ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
              ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
           
              scene->setSceneRect(-400,-300,800,600);
           
              scene->addItem(platforma);   /// Добавляем платформу
              platforma->setPos(0,290);    /// Устанавливаем платформа внизу окна
           
              ///Создадим решетку из кубиков
           
              scene->addItem(ball);   /// Добавляем на сцену мячик
              ball->setPos(0,250);
           
              timer = new QTimer();
              connect(timer, &QTimer::timeout, platforma, &Platforma::slotGameTimer);
              timer->start(4);
           
              timer = new QTimer();
              connect(timer, &QTimer::timeout, ball, &Ball::slotGameTimer);
              timer->start(25);
           
              slotCreateBloks();
              connect(ball, &Ball::signalCheckItem, this, &Widget::slotDeleteBloks);
          }
           
          Widget::~Widget()
          {
              delete ui;
          } 
          void Widget::slotDeleteBloks(QGraphicsItem *item)
          {
           
              foreach (QGraphicsItem *b, bloks) {
                  if(b == item){
                      scene->removeItem(b);
                      bloks.removeOne(item);
                      delete b;
                  }
              }
              scene->update();
          }
           
          void Widget::slotCreateBloks()
          {
              for (int i = 0; i < 8; i++) {
                  Blok1 *block = new Blok1();
                  scene->addItem(block);
                  bloks.append(block);
                  block->setPos(-250 + i*70, - 255);
              }
           
          }

          Предлагаю Вам пока самостоятельно реализовать отскок от блоков.
          Даю наводку. Отскок нужно рассчитывать в том месте где, находится проверка столкновения с блоками.
          То есть ориентировочно в этом месте кода в классе Ball

          foreach (QGraphicsItem *item, foundItems) {
              if (item == this)
                  continue;
              emit signalCheckItem(item);
          }

            R
            • 7 июля 2016 г. 13:53
            Спасибо большое сейчас буду разбираться. А насчет той версии с множеством файлов я даже придумал как можно это реализовать, но чем больше блоков тем сложнее (если интересно я могу свой вариант чуть позже доделать и скинуть). И да я понял почему у меня не выходила реализация 1 файлом.
              Evgenii Legotckoi
              • 7 июля 2016 г. 14:31
              Ни в коем случае не доделывайте вариант со множеством файлов.
              Вам за такое руки оторвут. Это в корне не правильно. Усложнение проекта на пустом месте.
              Польза ООП как раз и в том, чтобы подобного подхода не было.
                R
                • 7 июля 2016 г. 16:09

                Теперь я опять столкнулся со своей проблемой в добавлении возможной победы или проигрыша, а так же кнопки что бы программа запускалась не сразу. Я просто не могу понять в чем ошибка, если не сложно можете опять указать на мои ошибки. Вот последний вариант программы.

                arkanoid13.rar

                  iG
                  • 7 июля 2016 г. 21:20
                  Советую изучить ООП. иначе проблемы будут возникать на каждом шагу.
                  Главная ОШИБКА: пропущена фаза проектирования!!!!
                    R
                    • 7 июля 2016 г. 22:37
                    Нам его не преподавали, а на практике дали программу и сказали сделайте сейчас я пытаюсь как то ее сделать, а времени что бы хорошо разобраться абсолютно нету. А т.к. я впервые сталкиваюсь с графикой и ооп то пропущена фраза проектирования мне очень мало говорит можно как-то конкретнее.
                      R
                      • 7 июля 2016 г. 23:13

                      В данный момент выдает только 1 ошибку: ‘signalCheckGameWin’ was not declared in this scope
                      emit signalCheckGameWin();

                      arkanoid-new.rar

                        iG
                        • 7 июля 2016 г. 23:14
                        Нужно создать игру с поддержкой: уровней, ботов, масштабируемую с гибким кодом? Или просто плеер, мячик и объекты которые будут уничтожаться?
                          R
                          • 7 июля 2016 г. 23:28
                          Просто плеер самый простой (и насчет последней ошибки я так понимаю я не объявил ее (точнее не там))
                          А как сделать нужным образом не выходит.
                            R
                            • 7 июля 2016 г. 23:41
                            • Ответ был помечен как решение.

                            Вот все вроде разобрался все получилось. Всем спасибо за помощь. Вот последний рабочий вариант вдруг кому-то понадобиться.

                            arkanoid-last.rar

                              R
                              • 8 июля 2016 г. 0:23
                              Хотя при проигрыше при повторном запуске игра выдает сообщение о проигрыше сразу, не получаешться исправить, если не трудно подскажите.
                                R
                                • 8 июля 2016 г. 0:28
                                Не знаю почему но при одной и той же процедуре только раза с 10 вышло
                                  Evgenii Legotckoi
                                  • 8 июля 2016 г. 22:06
                                  Вот уж не знаю, что у вас там в программном коде, поскольку в последнем варианте я вообще не увидел условий проигрыша или выигрыша. Но это уже вопрос действительно проектирования приложения.
                                  Распишите для себя на листке бумаги, при каких условиях игра запускается и останавливается (Это, кстати, всего лишь вопрос остановки и запуска игровых таймеров в объектах) и уже отталкиваясь от всех условий, планомерно реализуйте их обработку.

                                    Комментарии

                                    Только авторизованные пользователи могут публиковать комментарии.
                                    Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                    Ua

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

                                    • Результат:84баллов,
                                    • Очки рейтинга4
                                    Ua

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

                                    • Результат:42баллов,
                                    • Очки рейтинга-8
                                    ОК

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

                                    • Результат:47баллов,
                                    • Очки рейтинга-6
                                    Последние комментарии
                                    ИМ
                                    Игорь Максимов22 ноября 2024 г. 21:51
                                    Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                    Evgenii Legotckoi
                                    Evgenii Legotckoi31 октября 2024 г. 23:37
                                    Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                    A
                                    ALO1ZE19 октября 2024 г. 17:19
                                    Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                    ИМ
                                    Игорь Максимов5 октября 2024 г. 16:51
                                    Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                    d
                                    dblas55 июля 2024 г. 20:02
                                    QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                    Сейчас обсуждают на форуме
                                    f
                                    firstlunoxod15 февраля 2025 г. 13:46
                                    Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
                                    Дмитрий
                                    Дмитрий3 февраля 2025 г. 16:24
                                    Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
                                    NW
                                    Nayo Wai30 января 2025 г. 19:22
                                    не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
                                    n
                                    nkly3 января 2025 г. 12:52
                                    Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
                                    M
                                    Marsel17 августа 2023 г. 0:26
                                    OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

                                    Следите за нами в социальных сетях