0

ゲームのコンテキスト内で一連のビジュアルコンポーネント(スプライト)を表示する必要がある場合、それぞれがターゲットデバイスのビューポートの高さと幅(必ずしもアスペクト比ではない)に相対的である必要がある文字通りの高さと幅を取ります。

  • 現在のデバイスのビューポートサイズに基づいて動的にスケーリング比を考え出すのに役立つスケーリングクラスはありますか?
  • 独自のスケーリング比アルゴリズムをロールする必要がありますか?
  • 知っておくべきクロスプラットフォームの問題はありますか?

これは、ターゲットデバイスに基づくアセットの読み込みに関する質問でも、スプライトのスケーリングの実行方法に関する質問でもありません(ここで説明されています:http://msdn.microsoft.com/en-us/library /bb194913.aspx)、ビューポートのサイズに基づいてスプライトのスケールを決定する方法の問題。

4

2 に答える 2

2

スケーリングの独自の実装をいつでも作成できます。

たとえば、デフォルトのターゲットビューポートの寸法は次のとおりです。

const int defaultWidth = 1280, defaultHeight = 720;

そして、現在の画面サイズはです。これにより、( 2つのフロートの代わりに800×600使用しましょう):Vector2

int currentWidth  = GraphicsDevice.Viewport.Width,
    currentHeight = GraphicsDevice.Viewport.Height;

Vector2 scale = new Vector2(currentWidth  / defaultWidth,
                            currentHeight / defaultHeight);

これにより、が得られます{0.625; 0.83333}。これを、スケーリング変数を受け取る便利なSpriteBatch.Draw() オーバーロードで使用できるようになりました。Vector2

public void Draw (
     Texture2D texture,
     Vector2 position,
     Nullable<Rectangle> sourceRectangle,
     Color color,
     float rotation,
     Vector2 origin,
     Vector2 scale,
     SpriteEffects effects,
     float layerDepth
)

または、すべてのものをに描画し、RenderTarget2Dそこから結果の画像をメイン画面の引き伸ばされたテクスチャにコピーすることもSpriteBatch.Draw()できますが、描画呼び出しが多い場合は時間を節約できる可能性がありますが、それでも上記のオーバーロードが必要になります。

于 2013-02-08T10:58:07.513 に答える
1

スケールを生成する別のオプションは、以下を活用することです。

var scaleMatrix = Matrix.CreateScale(
           (float)GraphicsDevice.Viewport.Width / View.Width,
           (float)GraphicsDevice.Viewport.Width / View.Width, 1f);

http://msdn.microsoft.com/en-gb/library/bb195692.aspx

しかし、これは私のニーズを満たしていませんでした。タッチ入力の場所を「変換された」スプライト(ユーザーのタッチ入力に応答して自分の位置とサイズを知る)にマップするために、自分の変換をロールする必要があったからです。

結局、私はパーセンテージベースのアプローチを使用しました。

基本的にビューポートの高さと幅を取得しました...

GraphicsDevice.Viewport.Width  
GraphicsDevice.Viewport.Height

...次に、パーセンテージを使用して、画面に対する相対的なサイズに基づいて、スプライトの高さと幅を計算しました(注:「問題で述べたように、文字通りの高さと幅を取ります」)。

//I want the buttons height and width to be 20% of the viewport 
var x, y = GraphicsDevice.Viewport.Width * 0.2f; //20% of screen width
var btnsize = new Vector(x,y);
var button = new GameButton(btnsize);

次に、ボタンのサイズを取得したら、パーセンテージに基づいた相対位置での作業に対して、ボタンのサイズと使用可能なビューポートサイズに基づいてボタンをレンダリングするための画面上の位置を計算できます。

于 2013-02-09T14:14:32.247 に答える