C
3 января 2017 г. 18:09

Скорость объекта зависит от размера виджета

qt, qgraphicsscene, qgraphicsitem

Скорость объекта зависит от размера виджета, чем меньше виджет, тем выше скорость. Нажатие клавиш считывается через таймер. Как сделал статическую скорость?

1

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

12
Evgenii Legotckoi
  • 3 января 2017 г. 18:43

Могу пока предложить только пересчёт скорости срабатывания таймера в зависимости от размеров виджета.

Что, кстати, подразумевается под размером виджета? Сам QWidget, где графическая сцена? Или размер одной клетки игрового поля?

Если размер клетки игрового поля, то берём эталонный размер 32x32 и устанавливаем что скорость равна, допустим, 1. Если размер 64x64, то увеличиваем скорость срабатывания таймера в 2 раза. Если размер равен 16x16, то уменьшаем. Передвижение же лучше рассчитывать в пикселях, а не в каких-либо величинах, зависящих от размеров окна или виджета.

    C
    • 3 января 2017 г. 18:50

    Передвижение рассчитывется по пикселям. Размер клетки поля 32px. Вот по такому принципу действует передвижение влево. А так же там проверка на коллизию со стеной.

    this->setX(this->x() - 5);
            setRotation(-90);
    
    
            foreach(QGraphicsItem *item, scene()->collidingItems(this))
            {
                if(item->data(1).toInt() == Objects::WallNoDestroy || item->data(1).toInt() == Objects::WallDestroy)
                {
                    this->setX(this->x() + 5);
                    break;
                }
            }
      C
      • 3 января 2017 г. 18:51

      Таймер срабатывает каждые 5 мс

        Evgenii Legotckoi
        • 3 января 2017 г. 18:55
        this->setX(this->x() + 5);

        Вот этот кусочек тогда нужно подкорректировать. Поставьте переменную вместо 5 и увеличивайте или изменяйте её в зависимости от размера игровой ячейки. Думаю, что это должно помочь.

          C
          • 3 января 2017 г. 19:02

          Так игровая ячейка всегда одного размера 32x32. Или я чего то не понимаю? Вот 2 скрина . На меньшем скорость 500px за секунду. А на большем 300px. P.S. Сайт отказывается прикреплять скрины.

            Evgenii Legotckoi
            • 3 января 2017 г. 21:47

            Тогда я понятия не имею, нужно смотреть код. Так-то всё должно одинаково работать в обоих вариантах.

              Evgenii Legotckoi
              • 3 января 2017 г. 21:59

              Не уверен, что дело в сайте с прикреплением изображений. Я перепроверил возможность прикреплений, работает без нареканий. У вас, кстати, прикрепился битый ZIP-архив. Вам бы проверить работоспособность браузера со своей стороны. Спасибо за отзыв по работоспособности сайта.

                C
                • 5 января 2017 г. 22:35

                Я Zip-архив скачал. Всё нормально. Вот исходники объекта.

                  Evgenii Legotckoi
                  • 6 января 2017 г. 10:05

                  А вот этот slotTimerSpeed Вы добавили уже после моего совета по изменению скорости?
                  И какой результат? Изменяется скорость в этом слоте измерения скорости? Без всего проекта я не могу проверить

                  Вроде бы всё нормально в коде

                    C
                    • 6 января 2017 г. 21:39

                    Этим слотом я просто замерял скорость движения персонажа

                      C
                      • 7 января 2017 г. 19:23
                      • Ответ был помечен как решение.

                      Я решил проблему. Проблема оказалась в таймере. Дело в том, что программа просто не успевала обрабатывать такое количество каждые 5 мс. Поставил вызов каждые 20мс. Всё хорошо.

                        Evgenii Legotckoi
                        • 7 января 2017 г. 19:31

                        Ясно.
                        Можете ещё попробовать увеличить скорость отрисовки с использованием OpenGL. То есть использовать метод QGraphicsView::setupViewport

                        setViewport(new QGLWidget(this));

                          Комментарии

                          Только авторизованные пользователи могут публиковать комментарии.
                          Пожалуйста, авторизуйтесь или зарегистрируйтесь
                          • Последние комментарии
                          • IscanderChe
                            12 апреля 2025 г. 17:12
                            Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
                          • AK
                            1 апреля 2025 г. 11:41
                            Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                          • Evgenii Legotckoi
                            9 марта 2025 г. 21:02
                            К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                          • VP
                            9 марта 2025 г. 16:14
                            Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                          • ИМ
                            22 ноября 2024 г. 21:51
                            Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…