1

sf::View の X および Y オフセットを取得する方法

void LMButtonDown(int mX, int mY)
{
    printf("[%d][%d]\n", mX / TILE_SIZE, mY / TILE_SIZE);
}

これは素晴らしいことですが、カメラを移動するsf::Viewと、予想どおり、sf::View オフセットが考慮されません。ドキュメントに X または Y を取得する関数が表示されない ため、オフセットを考慮することができます。これについての助けをいただければ幸いです。

ありがとう。

4

1 に答える 1

3

sf :: RenderTarget::mapPixelToCoordsとmapCoordsToPixelを見てください。このメソッドを使用して、座標を「ビュー」から「ワールド」スペースに変換したり、元に戻したりすることができます。ドキュメントには、例としてニーズが具体的に記載されています。

この関数は、レンダーターゲットの指定されたピクセルに一致する2D位置を見つけます。つまり、グラフィックカードとは逆の動作を行い、レンダリングされたピクセルの初期位置を見つけます。

ビューを手動で提供することなく、をVector2i取得してRenderTargetに基づいて変換するメソッドのオーバーロードバージョンもあります。view

何らかの理由でRenderTargetを使用できない(またはアクセスできない)場合は、手動で変換を実行できます。sf::Viewスケーリングや回転を実行しない(つまり、変換のみを実行する)限り、非常に単純である必要があります。

ビューの左上隅を取得するには、中央を取り、幅と高さの半分を差し引くだけです。次に、ビューの左上隅を使用してマウスの座標を変換します。

このようなもの:

// Somewhere else...
sf::View view;

void LMButtonDown(int mX, int mY)
{
    sf::Vector2f viewCenter = view.getCenter();
    sf::Vector2f halfExtents = view.getSize() / 2.0f;
    sf::Vector2f translation = viewCenter - halfExtents;

    mX += static_cast<int>(translation.x);
    mY += static_cast<int>(translation.y);

    printf("[%d][%d]\n", mX / TILE_SIZE, mY / TILE_SIZE);
}
于 2012-05-05T00:53:56.513 に答える