gpt4 book ai didi

c++ - 缩放项目和渲染

转载 作者:太空狗 更新时间:2023-10-29 23:02:46 24 4
gpt4 key购买 nike

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

我的 map 的背景是一张图片。该图像的每个像素代表一个方 block ,主角可以在上面行走,敌人/医疗包可以在上面。

为了设置图 block 的大小,我像这样计算最大值(其中 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);

这一切都很好,除了在大 map 上图像被缩放一次(高度可以说是 2 像素),并且当放大该项目时它不会变得更清晰,但仍然是一个大像素。这里有一个例子:左边的是一张小 map ,pixSize 很大,第二个的 pixSize 很小。

Image on a small map Same QGraphicsPixMapItem on a large map

那我应该怎么解决呢?一般来说,根据屏幕分辨率设置 pixSize 并不是很有用,因为 QGrapicsScene 会调整大小以适应 QGraphicsView它在里面,所以最终 View 仍然决定了屏幕上显示的像素有多大。

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

最佳答案

我想你可能想看看 chip example来自 Qt(链接到 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();
}

这有帮助吗?

关于c++ - 缩放项目和渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27589381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com