2014-12-21 4 views
3

Я делаю небольшую игру на 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 довольно маленький.

Image on a small map Same QGraphicsPixMapItem on a large map

Так как я должен решить эту проблему? В общем, с pixSize на основе разрешения экрана не очень полезно, так как размер QGrapicsScene изменяется, чтобы соответствовать QGraphicsView, в котором он находится, поэтому в конечном итоге представление все еще определяет, насколько большие пиксели отображаются на экране.

MyGraphicsView w; 
w.setScene(gameScene); 
w.fitInView(gameScene->sceneRect(), Qt::KeepAspectRatio); 

ответ

1

Я думаю, что вы, возможно, захотите посмотреть на chip example от Qt (ссылка на Qt5, но и работает на Qt4).

То, что могло бы помочь вам, в chip.cpp file:

в методе paint:

const qreal lod = option->levelOfDetailFromTransform(painter->worldTransform()); 

где painter просто QPainter и option имеет тип QStyleOptionGraphicsItem. Эта величина возвращает вам текущий уровень масштабирования вашего QGraphicsView и, таким образом, как в примере, вы можете настроить то, что делается на каком уровне, например.

if (lod < 0.2) { 
    if (lod < 0.125) { 
     painter->fillRect(QRectF(0, 0, 110, 70), fillColor); 
     return; 
    } 

    QBrush b = painter->brush(); 
    painter->setBrush(fillColor); 
    painter->drawRect(13, 13, 97, 57); 
    painter->setBrush(b); 
    return; 
} 

[...]

if (lod >= 2) { 
    QFont font("Times", 10); 
    font.setStyleStrategy(QFont::ForceOutline); 
    painter->setFont(font); 
    painter->save(); 
    painter->scale(0.1, 0.1); 
    painter->drawText(170, 180, QString("Model: VSC-2000 (Very Small Chip) at %1x%2").arg(x).arg(y)); 
    painter->drawText(170, 200, QString("Serial number: DLWR-WEER-123L-ZZ33-SDSJ")); 
    painter->drawText(170, 220, QString("Manufacturer: Chip Manufacturer")); 
    painter->restore(); 
} 

ли эта помощь?

Смежные вопросы