缩放项目和渲染

时间:2014-12-21 12:33:23

标签: c++ qt

我正在使用Qt在C ++ 11中制作一个小游戏。但是,我在缩放方面遇到了一些问题。

我的地图背景是一张图片。该图像的每个像素代表一个图块,主角可以在其上行走,敌人/保健包也可以。

要设置图块的大小,我会像这样计算最大量(其中imageRows& imageCols是背景图像的x轴和y轴上的像素数量):

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 个答案:

答案 0 :(得分:1)

我想你可能想看看Qt的chip example(链接到Qt5,但也适用于Qt4)。

可能对您有所帮助的是chip.cpp file

paint方法中的

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

其中painter只是QPainteroption的类型为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();
}

这有帮助吗?