0

すべてを正しいスケールに保ちながら、2D座標で画面の中心にズームインするための正しい計算を行うのに苦労しています。

次のように、マップ エディター内の移動を処理するために使用するベクトルがあります。

scroll = sf::Vector2<float>(-640.0f, -360.0f);

初期化時に画面の中心を 0,0 にするために -640.0f、-360.0f に設定されています (私のウィンドウは 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));

私が間違っていることはありますか?

4

1 に答える 1