我正在使用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);
答案 0 :(得分:1)
我想你可能想看看Qt的chip example(链接到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();
}
这有帮助吗?