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だけで動作させることができます。どのオブジェクトが実際に画面に表示されているかを知ることができなくなります。