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

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

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

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

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

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

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

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

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

        R
        • 6 июля 2016 г. 15:00

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

        arkanoid.rar

          Evgenii Legotckoi
          • 7 июля 2016 г. 2: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 г. 3:53
            Спасибо большое сейчас буду разбираться. А насчет той версии с множеством файлов я даже придумал как можно это реализовать, но чем больше блоков тем сложнее (если интересно я могу свой вариант чуть позже доделать и скинуть). И да я понял почему у меня не выходила реализация 1 файлом.
              Evgenii Legotckoi
              • 7 июля 2016 г. 4:31
              Ни в коем случае не доделывайте вариант со множеством файлов.
              Вам за такое руки оторвут. Это в корне не правильно. Усложнение проекта на пустом месте.
              Польза ООП как раз и в том, чтобы подобного подхода не было.
                R
                • 7 июля 2016 г. 6:09

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

                arkanoid13.rar

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

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

                      arkanoid-new.rar

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

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

                            arkanoid-last.rar

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

                                    Комментарии

                                    Только авторизованные пользователи могут публиковать комментарии.
                                    Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                    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
                                    Последние комментарии
                                    i
                                    innorwall11 ноября 2024 г. 22:12
                                    Django - Урок 055. Как написать функционал auto populate field Freckles because of several brand names retin a, atralin buy generic priligy
                                    i
                                    innorwall11 ноября 2024 г. 18:23
                                    QML - Урок 035. Использование перечислений в QML без C++ priligy cvs 24 Together with antibiotics such as amphotericin B 10, griseofulvin 11 and streptomycin 12, chloramphenicol 9 is in the World Health Organisation s List of Essential Medici…
                                    i
                                    innorwall11 ноября 2024 г. 15:50
                                    Qt/C++ - Урок 052. Кастомизация Qt Аудио плеера в стиле AIMP It decreases stress, supports hormone balance, and regulates and increases blood flow to the reproductive organs buy priligy online safe Promising data were reported in a PDX model re…
                                    i
                                    innorwall11 ноября 2024 г. 14:19
                                    Алгоритм сортировки кучей The role of raloxifene in preventing breast cancer priligy precio
                                    i
                                    innorwall11 ноября 2024 г. 13:55
                                    PyQt5 - Урок 006. Работа с QTableWidget buy priligy 60 mg 53 have been reported by Javanovic Santa et al
                                    Сейчас обсуждают на форуме
                                    i
                                    innorwall11 ноября 2024 г. 20:56
                                    добавить qlineseries в функции buy priligy senior brother Chu He, whom he had known for many years
                                    i
                                    innorwall11 ноября 2024 г. 10:55
                                    Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                                    9
                                    9Anonim25 октября 2024 г. 9:10
                                    Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                                    ИМ
                                    Игорь Максимов3 октября 2024 г. 4:05
                                    Реализация навигации по разделам Спасибо Евгений!

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