5000*5000のサイズの領域に多くのオブジェクトを含むマップがあります。私の画面サイズは800*600です。
マップをスクロールするにはどうすればよいですか。すべてのオブジェクトを左右に移動したくないので、「カメラ」を移動したいのですが、残念ながら、移動する方法が見つかりませんでした。
ありがとう
(このオーバーロードtransformMatrix)へのパラメータを探していると思います。SpriteBatch.Begin
オブジェクトを動かしたくないが、カメラを動かしたいということです。しかし、最低レベルでは、2Dレンダリングと3Dレンダリングの両方で、「カメラ」の概念はありません。レンダリングは常に同じ領域で行われます。頂点/スプライトをその領域に配置するには、変換を使用する必要があります。
カメラの効果が必要な場合は、世界全体を反対方向に動かして実装する必要があります。
もちろん、実際に移動したデータを保存するわけではありません。データをレンダリングするときにオフセットを適用するだけです。Emartelの答えは、スプライトごとにそれを行うことです。ただし、すべてのコードを複製する必要がないため、マトリックスを使用する方がクリーンです。GPUに複製Drawさせるだけです。
例を終了するには:カメラを(100、200)に配置するとします。これを実現するには、に渡しMatrix.CreateTranslation(-100, -200, 0)ますSpriteBatch.Begin。
(エマルテルの答えに従って、自分で錐台カリングを実行することは、あなたの世界が本当に巨大でない限り、おそらく時間の無駄です。パフォーマンスの考慮事項の説明については、この回答を参照してください。)
ビューポート
まず、カメラのビューポートを作成します。2Dゲームの場合、レンダリングを開始する左下の位置を定義し、画面の解像度を使用して拡大するのと同じくらい簡単です800x600。
Rectangle viewportRect = new Rectangle(viewportX, viewportY, screenWidth, screenHeight);
これは、オフセットされた場合のカメラの外観の例です300,700(図面は非常に近似的であり、より良いアイデアを提供するためのものです)。

可視性チェック
ここで、と交差するすべてのスプライトを見つけたいと思います。red squareこれは、として理解できますViewport。これは、次のようなもので行うことができます(これはテストされていないコードであり、どのように見えるかのサンプルにすぎません)
List<GameObject> objectsToBeRendered = new List<GameObject>();
foreach(GameObject obj in allGameObjects)
{
Rectangle objectBounds = new Rectangle(obj.X, obj.Y, obj.Width, obj.Height);
if(viewportRect.IntersectsWith(objectBounds))
{
objectsToBeRendered.Add(obj);
}
}
グラフィカルに表示されるのは次のとおりです。緑色のスプライトはに追加されたものobjectsToBeRenderedです。オブジェクトを別のリストに追加すると、レンダリングする前にBackオブジェクトをからに並べ替える場合に簡単になります。Front

レンダリング
どのオブジェクトが交差しているかがわかったので、画面のどこに到達するかを把握する必要があります。
spriteBatch.Begin();
foreach(GameObject obj in objectsToBeRendered)
{
Vector2 pos = new Vector2(obj.X - viewportX, obj.Y - viewportY);
spriteBatch.Draw(obj.GetTexture(), pos, Color.White);
}
spriteBatch.End();
ご覧のとおり、ビューポートのXとY位置を推定して、オブジェクトのワールド位置をScreen Coordinatesビューポート内に取り込みます。これは、ここにあるビューポートを指定すると、中にある可能性のある小さな正方形が400, 800画面上World Coordinatesにレンダリングされることを意味します。100, 100
編集:
「正解」の変更には同意しますが、ここに投稿した内容は、処理するアニメーションや更新するAIなどを決定する際に非常に役立つことを覚えておいてください。カメラとGPUだけで動作させることができます。どのオブジェクトが実際に画面に表示されているかを知ることができなくなります。