まず、この件に関連するトピックをいくつか見たので、本当に申し訳ありませんが、理解できませんでした...
カメラ 2D を使用しているときにマップ上でスプライトを移動する方法を学ぶために助けが必要です。
マップは 1800x968 です。カメラなしでスプライトを動かすと、すべて正常に動作します。
説明させてください。移動したいスプライトの現在の位置で vector2d を保持します。
マップの任意の領域をクリックすると、クリックの座標が取得され、そこまでスプライトが移動します。そこで、スプライトの現在位置を更新します。
現在の位置を保持します。たとえば、右側または左側に移動する必要があるかどうかを判断するために使用する必要があるためです。たとえば、x 軸の現在の位置が x 軸のクリック領域よりも大きい場合、左に移動する必要があります。この戦略が正しいかどうかはわかりませんが...
Ok。私の画面は 800x480 で、私のマップは 1800x968 (私の画面領域よりも大きい) です。
位置 750 (x 軸、画面の右側) をクリックすると、そこまでスプライトが正しく移動します。カメラも動きます。すべて問題ありませんが、問題は次のとおりです。
スプライトの現在の位置 (x 軸) は 750 です。しかし、カメラが動いたので、スプライトは画面の中心になりました (カメラが動いたため、x 軸は 750 ではなくなりました)。これは私の問題です。たとえば、今回は700の位置でもう一度クリックして、スプライトを右に移動させる必要がありますが、現在の位置は750(> 700)です。どうすればこれを解決できますか? たぶん、カメラが変わったときに、スプライトの現在の位置を更新する必要がありますが、方法がわかりません...
y 軸でも同じ問題が発生します。
誰でも私を助けることができますか?
以下は、私の camera2d コードで、トピックからコピーしたサンプルです (詳細に感謝します!):
public sealed class Camera2D
{
private const float zoomUpperLimit = 1.5f;
private const float zoomLowerLimit = .5f;
private float _zoom;
private Matrix _transform;
private Vector2 _pos;
private float _rotation;
private int _viewportWidth;
private int _viewportHeight;
private int _worldWidth;
private int _worldHeight;
public Camera2D(Viewport viewport, int worldWidth,
int worldHeight, float initialZoom)
{
_zoom = initialZoom;
_rotation = 0.0f;
_pos = Vector2.Zero;
_viewportWidth = viewport.Width;
_viewportHeight = viewport.Height;
_worldWidth = worldWidth;
_worldHeight = worldHeight;
}
public float Zoom
{
get { return _zoom; }
set
{
_zoom = value;
if (_zoom < zoomLowerLimit)
_zoom = zoomLowerLimit;
if (_zoom > zoomUpperLimit)
_zoom = zoomUpperLimit;
}
}
public float Rotation
{
get { return _rotation; }
set { _rotation = value; }
}
public void Move(Vector2 amount)
{
_pos += amount;
}
public Vector2 Pos
{
get { return _pos; }
set
{
float leftBarrier = (float)_viewportWidth * .5f / _zoom;
float rightBarrier = _worldWidth - (float)_viewportWidth * .5f / _zoom;
float topBarrier = _worldHeight - (float)_viewportHeight * .5f / _zoom;
float bottomBarrier = (float)_viewportHeight * .5f / _zoom;
_pos = value;
if (_pos.X < leftBarrier)
_pos.X = leftBarrier;
if (_pos.X > rightBarrier)
_pos.X = rightBarrier;
if (_pos.Y > topBarrier)
_pos.Y = topBarrier;
if (_pos.Y < bottomBarrier)
_pos.Y = bottomBarrier;
}
}
public Matrix GetTransformation()
{
_transform =
Matrix.CreateTranslation(new Vector3(-_pos.X, -_pos.Y, 0)) *
Matrix.CreateRotationZ(Rotation) *
Matrix.CreateScale(new Vector3(Zoom, Zoom, 1)) *
Matrix.CreateTranslation(new Vector3(_viewportWidth * 0.5f,
_viewportHeight * 0.5f, 0));
return _transform;
}
}