R
RevoltJuly 5, 2016, 7:28 a.m.

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

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

Я первый раз работаю в QT (и знаний в ООП нет). Я читал и смотрел уроки с данного сайта, но столкнулся с 2 проблемами реализация кнопки старта и сам мячик с его движением, без этого программа работает (т.е. есть блоки и платформа). Дальше у меня никак не получается. Кто знает и может подсказать как это все реализовать помогите пожалуйста.
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

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

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

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

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

        R
        • July 6, 2016, 3 p.m.

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

        arkanoid.rar

          Evgenii Legotckoi
          • July 7, 2016, 2:48 a.m.

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

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

                arkanoid13.rar

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

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

                      arkanoid-new.rar

                        iG
                        • July 7, 2016, 1:14 p.m.
                        Нужно создать игру с поддержкой: уровней, ботов, масштабируемую с гибким кодом? Или просто плеер, мячик и объекты которые будут уничтожаться?
                          R
                          • July 7, 2016, 1:28 p.m.
                          Просто плеер самый простой (и насчет последней ошибки я так понимаю я не объявил ее (точнее не там))
                          А как сделать нужным образом не выходит.
                            R
                            • July 7, 2016, 1:41 p.m.
                            • The answer was marked as a solution.

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

                            arkanoid-last.rar

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

                                    Comments

                                    Only authorized users can post comments.
                                    Please, Log in or Sign up
                                    AD

                                    C ++ - Test 004. Pointers, Arrays and Loops

                                    • Result:50points,
                                    • Rating points-4
                                    m

                                    C ++ - Test 004. Pointers, Arrays and Loops

                                    • Result:80points,
                                    • Rating points4
                                    m

                                    C ++ - Test 004. Pointers, Arrays and Loops

                                    • Result:20points,
                                    • Rating points-10
                                    Last comments
                                    i
                                    innorwallNov. 12, 2024, 6:12 a.m.
                                    Django - Tutorial 055. How to write auto populate field functionality Freckles because of several brand names retin a, atralin buy generic priligy
                                    i
                                    innorwallNov. 12, 2024, 2:23 a.m.
                                    QML - Tutorial 035. Using enumerations in QML without 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
                                    innorwallNov. 11, 2024, 11:50 p.m.
                                    Qt/C++ - Lesson 052. Customization Qt Audio player in the style of 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
                                    innorwallNov. 11, 2024, 10:19 p.m.
                                    Heap sorting algorithm The role of raloxifene in preventing breast cancer priligy precio
                                    i
                                    innorwallNov. 11, 2024, 9:55 p.m.
                                    PyQt5 - Lesson 006. Work with QTableWidget buy priligy 60 mg 53 have been reported by Javanovic Santa et al
                                    Now discuss on the forum
                                    i
                                    innorwallNov. 12, 2024, 4:56 a.m.
                                    добавить qlineseries в функции buy priligy senior brother Chu He, whom he had known for many years
                                    i
                                    innorwallNov. 11, 2024, 6:55 p.m.
                                    Всё ещё разбираюсь с кешем. 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
                                    9AnonimOct. 25, 2024, 4:10 p.m.
                                    Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                                    Follow us in social networks