【问题标题】:Scaling items and rendering缩放项目和渲染
【发布时间】:2015-08-28 21:01:17
【问题描述】:

我正在用 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 相当小。

那么我应该如何解决这个问题?一般来说,基于屏幕分辨率的 pixSize 并不是很有用,因为 QGrapicsScene 的大小被调整为适合它所在的 QGraphicsView,所以最终视图仍然决定了屏幕上显示的像素有多大。

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

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

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

    chip.cpp file 中可能对您有所帮助:

    paint 方法中:

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

    其中painter 只是QPainteroptionQStyleOptionGraphicsItem 类型。此数量为您提供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();
    }
    

    这有帮助吗?

    【讨论】:

      猜你喜欢
      • 2013-05-06
      • 1970-01-01
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      • 2021-02-19
      • 2014-09-11
      相关资源
      最近更新 更多