2012-04-27 18 views
2

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

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

+0

可能な複製http://stackoverflow.com/questions/10298046/wp7-xna-game-how-to-adapt-to-different-phone-resolutions/10300282#10300282 – Ani

答えて

0

Spritebatch.Draw(Texture2D texture, Vector2 position, Color color)を使用して、タイルを表す2dスプライトを描画すると仮定します。はい、この場合、「ベクトル2の位置」は実際にウィンドウ空間内の座標のペアです。しかし、OpenGLで行っていたことを正確に行うこと、すなわちポリゴンを作成してワールド/ビューマトリックスを使って変換することを含む、XNAで描画する他の多くの方法があります。 MSDNのthis tutorialを参照してください。

つまり、Spritebatchをそのまま使用して、Spritebatch.Draw(Texture2D texture, Rectangle destinationRectangle, Color color)を使用して「手動で」スケーリングを実行できます。あなたはGraphicsDevice.Viewport.Width /高さを使用して、画面の幅と高さを取得することができます

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

:タイルが常に画面の幅の5%と、画面の高さの6%を占めている必要があり、その後、スケーリングは次のようになりますと言います。

さらに一般的に言えば、シェーダまたはCPUを使用して計算を実行するかどうかにかかわらず、MatrixクラスとVector2/3.Transformメソッドを使用して適切に調整することはできません。カスタム線形代数などによる変換。

+0

非常に良い答え。私はOPがReimers XNAのチュートリアルを通して学習していると感じていますが、それ自体はそれほど悪くはありませんが、XNAのOO機能を実証していません(これは*もっと簡単に*できます) –