R
RevoltШілде 5, 2016, 7:28 Т.Ж.

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

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

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

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

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

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

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

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

        R
        • Шілде 6, 2016, 3 Т.Қ.

        Реализация блоков отдельными файлами это каждому прямоугольнику на сцене соответствуют свой заголовочный и исходный файлы т.к. когда я в начале пытался реализовать несколько от одних и тех же файлов отображался всего 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, 1:13 Т.Қ.

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

                      arkanoid-new.rar

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

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

                            arkanoid-last.rar

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

                                    Пікірлер

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

                                    C++ - Тест 001. Первая программа и типы данных

                                    • Нәтиже:66ұпай,
                                    • Бағалау ұпайлары-1
                                    t

                                    C++ - Тест 001. Первая программа и типы данных

                                    • Нәтиже:33ұпай,
                                    • Бағалау ұпайлары-10
                                    t

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

                                    • Нәтиже:52ұпай,
                                    • Бағалау ұпайлары-4
                                    Соңғы пікірлер
                                    G
                                    GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
                                    Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
                                    d
                                    dblas5Шілде 5, 2024, 11:02 Т.Ж.
                                    QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                    k
                                    kmssrАқп. 8, 2024, 6:43 Т.Қ.
                                    Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                    АК
                                    Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
                                    Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                                    Енді форумда талқылаңыз
                                    Evgenii Legotckoi
                                    Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
                                    добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                    F
                                    FynjyШілде 22, 2024, 4:15 Т.Ж.
                                    при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
                                    BlinCT
                                    BlinCTМаусым 25, 2024, 1 Т.Ж.
                                    Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
                                    BlinCT
                                    BlinCTМамыр 5, 2024, 5:46 Т.Ж.
                                    Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
                                    Evgenii Legotckoi
                                    Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
                                    Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

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