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 Т.Қ.
                                  Вот уж не знаю, что у вас там в программном коде, поскольку в последнем варианте я вообще не увидел условий проигрыша или выигрыша. Но это уже вопрос действительно проектирования приложения.
                                  Распишите для себя на листке бумаги, при каких условиях игра запускается и останавливается (Это, кстати, всего лишь вопрос остановки и запуска игровых таймеров в объектах) и уже отталкиваясь от всех условий, планомерно реализуйте их обработку.

                                    Пікірлер

                                    Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                                    Кіріңіз немесе Тіркеліңіз
                                    OI
                                    • Ora Iro
                                    • Жел. 24, 2024, 3:38 Т.Ж.

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

                                    • Нәтиже:40ұпай,
                                    • Бағалау ұпайлары-8
                                    AD

                                    C++ - Тест 004. Указатели, Массивы и Циклы

                                    • Нәтиже:50ұпай,
                                    • Бағалау ұпайлары-4
                                    m
                                    • molni99
                                    • Қаз. 25, 2024, 10:37 Т.Қ.

                                    C++ - Тест 004. Указатели, Массивы и Циклы

                                    • Нәтиже:80ұпай,
                                    • Бағалау ұпайлары4
                                    Соңғы пікірлер
                                    ИМ
                                    Игорь МаксимовҚар. 22, 2024, 8:51 Т.Ж.
                                    Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                    Evgenii Legotckoi
                                    Evgenii LegotckoiҚаз. 31, 2024, 11:37 Т.Ж.
                                    Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                    A
                                    ALO1ZEҚаз. 19, 2024, 5:19 Т.Ж.
                                    Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                    ИМ
                                    Игорь МаксимовҚаз. 5, 2024, 4:51 Т.Ж.
                                    Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                    d
                                    dblas5Шілде 5, 2024, 8:02 Т.Ж.
                                    QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                    Енді форумда талқылаңыз
                                    Evgenii Legotckoi
                                    Evgenii LegotckoiМаусым 24, 2024, 12:11 Т.Қ.
                                    добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                    t
                                    tonypeachey1Қар. 15, 2024, 3:04 Т.Ж.
                                    google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                                    NSProject
                                    NSProjectМаусым 4, 2022, 12:49 Т.Ж.
                                    Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                                    9
                                    9AnonimҚаз. 25, 2024, 6:10 Т.Ж.
                                    Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

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