У меня есть приложение, в котором вы можете смотреть повторы для данной 2D-игры:
По сути, транспортное средство движется по карте. Изображение сосредоточено на транспортном средстве, поэтому карта прокручивается во время повтора, что-то вроде Micro Machines (просто для понимания, настоящая игра не Micro Machines). ).
(источник: randomracket .com)
В моей сцене карта статична, пока машина движется. Вид прокручивается для каждого кадра повтора, так что транспортное средство находится в центре. По соображениям производительности карта разбита на несколько QGraphicsPixmapItem
s.
Режим обновления области просмотра установлен на QGraphicsView::BoundingRectViewportUpdate
. Метод индексирования элементов установлен на QGraphicsScene::NoIndex
.
В большинстве случаев все работает нормально. Но когда карта больше обычного, транспортное средство не обновляется. Вид прокручивается, а плитки хорошо обновляются; но не транспортное средство, если я не запускаю полное обновление окна просмотра, увеличивая/уменьшая масштаб (поэтому я знаю, что элемент правильно расположен).
boundingRect транспортного средства устанавливается раз и навсегда и является допустимым (см. ниже, дано в логических координатах). Я не рисую внешний прямоугольник, ограничивающий элемент.
некоторый пример вывода отладки (только третья конфигурация не работает):
ok :
vehicle->boundingRect() : QRectF(-1.9391,-1.9391 3.8782x3.8782)
scene->sceneRect() : QRectF(-117.543,-38.3826 138.834x40.3217)
SCENE_CACHING : 85 tiles
ok :
vehicle->boundingRect() : QRectF(-2.88489,-2.88489 5.76979x5.76979)
scene->sceneRect() : QRectF(-68.8843,-18.2202 187.989x119.277)
SCENE_CACHING : 308 tiles
nok : vehicle won't update
vehicle->boundingRect() : QRectF(-3.45546,-3.45546 6.91092x6.91092)
scene->sceneRect() : QRectF(-64.2988,-107.802 188.927x187.445)
SCENE_CACHING : 506 tiles
Я попытался отладить проход обновления, и событие рисования действительно исключает регион, в котором находится транспортное средство...
Кто-нибудь знает, почему обновление может пропустить определенный элемент?
Изменить:
Qt: 4.8.1, и я видел проблему и с предыдущими версиями.
ОС: Windows XP SP3, на других ОС пока не проверял
У меня не получилось воспроизвести проблему на минимальном примере. Минимальный пример просто работает так, как ожидается. В реальной жизни делается вот что:
Карта читается из файла. Он состоит из сотен полигонов, ограничивающих землю/небо (каждый из которых графически состоит из слоев полигонов, ребер и вершин), тысяч изображений и текстур, которые затем обрезаются по земле или небу, и некоторых других элементов.
Я вычисляю все вырезки, а затем визуализирую сцену в QImage. Изображение разбито на несколько
QGraphicsPixmapItem
, добавленных в сцену, в то время как прежние элементы удаляются из сцены и удаляются (кстати, ошибка также возникла, когда я не удалил и не удалил прежние элементы).Повтор запущен
Я думаю, что внутренности Qt Graphics испорчены, но я не могу понять, как его очистить/сбросить.
Вот пример графики (чтобы проиллюстрировать, что я имею в виду под землей/небом). Карта может быть довольно большой.
(источник: kopasite.net а>)
QGraphicsView::centerOn
? - person Stephen Chu   schedule 14.06.2012QGraphicsView
, чтобы сосредоточиться на чем-то, вот так - person azf   schedule 14.06.2012QGraphicsItem::update()
для автомобиля в дополнение кQGraphicsScene::update()
? Кажется, что по какой-то причине представление не думает, что ему нужно перекрашивать элемент, возможно, потому, что его положение рисования не меняется. - person Anthony   schedule 18.06.2012setPos()
? - person Anthony   schedule 18.06.2012setPos()
для перемещения предмета транспортного средства по сцене. - person azf   schedule 19.06.2012QGraphicsScene::invalidate(...)
, чтобы сделать недействительными части сцены, которые должны быть перерисованы? Это работает, когда вы используетеFullViewportUpdate
? Если да, это слишком медленно для вас? - person Johannes S.   schedule 19.06.2012FullViewportUpdate
было бы слишком тяжело. НО ! звонокQGraphicsScene::invalidate(xxx, ItemLayer)
сделал свое дело. Кажется, я неправильно понял документацию Qt по этому методу. Опубликуйте ответ, чтобы я мог принять его. - person azf   schedule 19.06.2012