【发布时间】: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);
【问题讨论】: