Я делаю небольшую игру на C++ 11 с Qt. Однако у меня возникают проблемы с масштабированием.Масштабирование элементов и рендеринга
Фон моей карты - изображение. Каждый пиксель этого изображения представляет собой плитку, на которой может ходить главный герой, и враги/медицинские пакеты могут быть.
Для того, чтобы установить размер плитки, я Calculat максимальное количество так, как (где imageRows & imageCols это количество пикселей на х- и у-оси фонового изображения):
QRect rec = QApplication::desktop()->screenGeometry();
int maxRows = rec.height()/imageRows;
int maxCols = rec.width()/imageCols;
if(maxRows < maxCols){
pixSize = maxRows;
} else{
pixSize = maxCols;
}
Теперь, у меня есть размер плитки, добавить фоновое изображение на сцене (в GameScene ctor
, простирается от QGraphicsScene
):
auto background = new QGraphicsPixmapItem();
background->setPixmap(QPixmap(":/images/map.png").scaledToWidth(imageCols * pixSize));
this->addItem(background);
Тогда для добавления врагов (они простираются от QGraphicsPixMapItem
):
Enemy *enemy = new Enemy();
enemy->setPixmap(QPixmap(":/images/enemy.png").scaledToWidth(pixSize));
scene->addItem(enemy);
Это все работает отлично, за исключением того, что на больших картах изображения масштабируются один раз (до высоты позволяет говорить 2 пикселя), а также при увеличении по этому пункту он не получает более ясно, но остается большой пиксель , Вот пример: левый находится на небольшой карте, где pixSize довольно большой, второй имеет pixSize довольно маленький.
Так как я должен решить эту проблему? В общем, с pixSize на основе разрешения экрана не очень полезно, так как размер QGrapicsScene
изменяется, чтобы соответствовать QGraphicsView
, в котором он находится, поэтому в конечном итоге представление все еще определяет, насколько большие пиксели отображаются на экране.
MyGraphicsView w;
w.setScene(gameScene);
w.fitInView(gameScene->sceneRect(), Qt::KeepAspectRatio);