2

XNAを使用して単純なタイルベースのゲームを作成する方法を学び始めていますが、問題がありました。OpenGLを使用して、たとえば長方形を描画する座標を定義すると、それらの座標は、作成したビューポート(オルソまたはパースペクティブ)を参照します。したがって、例として、座標0,0のポイントが画面の中央に配置されました。

XNAでは、すべての寸法と座標がピクセルで表されるため、10x10の長方形を描画すると、10ピクセルx 10ピクセルの長方形になり、原点の座標についても同じことが言えます。このように、解像度を変更すると、比率が変更されます(OpenGLでは、変更されませんでした。すべて同じサイズです)。ピクセルの比率に縛られることなくXNAを使用するにはどうすればよいですか?誰かが私が間違っているところやこれについてどうやって行くことができるか教えてもらえますか?

4

1 に答える 1

0

Spritebatch.Draw(Texture2D texture、Vector2 position、Color color)を使用して、タイルを表す2Dスプライトを描画していると仮定します。はい、この場合、「Vector2の位置」は実際にウィンドウ空間の座標のペアです。ただし、OpenGLで行っていたのとまったく同じように、つまりポリゴンを作成し、ワールド/ビューマトリックスを使用して変換するなど、XNAで描画する方法は他にもたくさんあります。たとえば、MSDNのこのチュートリアルを参照してください。

そうは言っても、Spritebatchを使い続け、 Spritebatch.Draw(Texture2D texture、Rectangle destinationRectangle、Color color)を使用して「手動で」スケーリングを実行することができます。タイルは常に画面の幅の5%、画面の高さの6%を占める必要があるとすると、スケーリングは次のようになります。

var destinationRectangle = new Rectangle(
    positionX, 
    positionY, 
    0.05 * screenWidth, 
    0.06 * screenHeight);
spritebatch.Draw(tileTexture, destinationRectangle, Color.White);

GraphicsDevice.Viewport.Width / Heightを使用して、画面の幅と高さを取得できます。

より一般的に言えば、座標をスケーリングすることを妨げるものは何もありませんが、シェーダーまたはCPUを介して計算を実行するか、カスタムを介して変換を実行するかにかかわらず、 MatrixクラスとVector2/3.Transformメソッドを使用して適切と思われます線形代数か何か。

于 2012-04-28T01:57:43.413 に答える