我很难进行正确的计算,以便在 2D 坐标中放大屏幕中心,同时将所有内容保持在正确的比例。
我有一个向量,我用它来处理在我的地图编辑器中移动,如下所示:
scroll = sf::Vector2<float>(-640.0f, -360.0f);
它设置为 -640.0f、-360.0f 以使 0,0 在初始化时成为屏幕的中心(基于我的窗口为 1280x720)。
我的缩放值范围从 0.1f 到 2.0f,并且以 0.05 的增量增加或减少:
zoomScale = zoomScale + 0.05;
当在屏幕上绘制元素时,它们是使用以下代码绘制的:
sf::Rect<float> dRect;
dRect.left = (mapSeg[i]->position.x - scroll.x) * (layerScales[l] * zoomScale);
dRect.top = (mapSeg[i]->position.y - scroll.y) * (layerScales[l] * zoomScale);
dRect.width = (float)segDef[mapSeg[i]->segmentIndex]->width;
dRect.height = (float)segDef[mapSeg[i]->segmentIndex]->height;
sf::Sprite segSprite;
segSprite.setTexture(segDef[mapSeg[i]->segmentIndex]->tex);
segSprite.setPosition(dRect.left, dRect.top);
segSprite.setScale((layerScales[l] * zoomScale), (layerScales[l] * zoomScale));
segSprite.setOrigin(segDef[mapSeg[i]->segmentIndex]->width / 2, segDef[mapSeg[i]->segmentIndex]->height / 2);
segSprite.setRotation(mapSeg[i]->rotation);
Window.draw(segSprite);
layerScales 是一个用于放大视差滚动的分段层的值。
这在放大和缩小时似乎工作正常,但中心点似乎发生了变化(我知道应该始终位于 0,0 的元素在我放大后将位于不同的坐标处)。我使用以下来计算鼠标的位置来测试如下:
mosPosX = ((float)input.mousePos.x + scroll.x) / zoomScale)
mosPosY = ((float)input.mousePos.y + scroll.y) / zoomScale)
我确信我应该对“滚动”向量进行计算以考虑到这种缩放,但我似乎无法让它正常工作。
我尝试实现类似下面的东西,但它没有产生正确的结果:
scroll.x = (scroll.x - (SCREEN_WIDTH / 2)) * zoomScale - (scroll.x - (SCREEN_WIDTH / 2));
scroll.y = (scroll.y - (SCREEN_HEIGHT / 2)) * zoomScale - (scroll.y - (SCREEN_HEIGHT / 2));
任何想法我做错了什么?