11

XNAを使用して、 Day of the TentacleSam&Max Hit the Roadのように、90年代初頭から脱落したように見えるゲームを作成できるアドベンチャーゲームエンジンを作成しようとしています。したがって、ゲームを実際に320x240で実行したいのですが(おそらく320x200になるはずですが、shh)、ユーザー設定に応じてスケールアップする必要があります。

今は問題なく動作しますが、実際には現在よりもピクセル化されたように見せたいという問題が発生しています。

これが私が今していることです:

ゲームの初期化:

    public Game() {
        graphics = new GraphicsDeviceManager(this);
        graphics.PreferredBackBufferWidth = 640;
        graphics.PreferredBackBufferHeight = 480;
        graphics.PreferMultiSampling = false;

        Scale = graphics.PreferredBackBufferWidth / 320;
    }

Scaleはパブリック静的変数であり、320x240に対してゲームをどの程度スケーリングする必要があるかをいつでも確認できます。

私の描画関数では:

spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.NonPremultiplied, SamplerState.PointClamp, DepthStencilState.Default, RasterizerState.CullNone, null, Matrix.CreateScale(Game.Scale));

このように、すべてが320x240で描画され、現在の解像度(デフォルトでは640x480)に合うように拡大されます。そしてもちろん、私はマウスの実際の座標を320x240の座標に変換するなどの計算を行います。

さて、これは素晴らしいことですが、今では、スプライトのスケーリングを開始したり、遠くまで歩いてもらいたいなどのポイントに到達しています。

下の画像を見てください。左上の画像は、ゲームが640x480で実行されているときのスクリーンショットの一部です。その右側の画像は、320x240で「あるべき」外観です。画像の一番下の行は、一番上の行が300%まで拡大されているため(Photoshopで、エンジン内ではありません)、私が話していることを確認できます。

解像度の変化に伴うスケーリングの違いを示す画像

640x480の画像では、さまざまな「線の太さ」を確認できます。太い線は実際の外観ですが(1ピクセル= 2x2、これは640x480で実行されているため)、細い線(1x1ピクセル)も、スケーリングのために表示されるべきではない場合に表示されます(右の画像を参照) )。

基本的に私は320x240のディスプレイをエミュレートしようとしていますが、XNAを使用して任意の解像度に拡大し、行列変換はうまくいきません。これを行う方法はありますか?

4

1 に答える 1

18

ネイティブ解像度のすべてをバックバッファーではなくRenderTargetにレンダリングします。

        SpriteBatch targetBatch = new SpriteBatch(GraphicsDevice);
        RenderTarget2D target = new RenderTarget2D(GraphicsDevice, 320, 240);
        GraphicsDevice.SetRenderTarget(target);

        //perform draw calls

次に、このターゲット(画面全体)をバックバッファーにレンダリングします。

        //set rendering back to the back buffer
        GraphicsDevice.SetRenderTarget(null);

        //render target to back buffer
        targetBatch.Begin();
        targetBatch.Draw(target, new Rectangle(0, 0, GraphicsDevice.DisplayMode.Width, GraphicsDevice.DisplayMode.Height), Color.White);
        targetBatch.End();
于 2011-09-29T20:37:16.667 に答える