-1

1つのテクスチャに多くのテクスチャを描画してRTSゲームのマップを作成しようとしています。画面上に個々のテクスチャを描画することはできますが、すべてをレンダリングターゲットに描画しても効果がないようです(デバッグ時にウィンドウはAliceBlueのままです)。 )。レンダリングターゲットに何かが描画されているかどうかを判断しようとしているので、それをJpegとしてファイルに保存し、デスクトップからそのJpegを表示しようとしています。MemoryStreamからそのJpegにアクセスするにはどうすればよいですか?

保護されたオーバーライドvoidLoadContent(){

         spriteBatch = new SpriteBatch(GraphicsDevice);
         gridImage = new RenderTarget2D(GraphicsDevice, 1000, 1000);
         GraphicsDevice.SetRenderTarget(gridImage);
         GraphicsDevice.Clear(Color.AliceBlue);
         spriteBatch.Begin();


         foreach (tile t in grid.tiles)
         {
             Texture2D dirt = Content.Load<Texture2D>(t.texture);
             spriteBatch.Draw(dirt, t.getVector2(), Color.White);
         }
         test = Content.Load<Texture2D>("dirt");


             GraphicsDevice.SetRenderTarget(null);
             MemoryStream memoryStream = new MemoryStream();

            gridImage.SaveAsJpeg(memoryStream, gridImage.Width, gridImage.Height); //Or SaveAsPng( memoryStream, texture.Width, texture.Height )



         //    rt.Dispose();
             spriteBatch.End();
    }
4

1 に答える 1

3

簡単なスクリーンショットの方法を作成しました。

  void Screenie()
            {
                int width = GraphicsDevice.PresentationParameters.BackBufferWidth;
                int height = GraphicsDevice.PresentationParameters.BackBufferHeight;

                //Force a frame to be drawn (otherwise back buffer is empty) 
                Draw(new GameTime());

                //Pull the picture from the buffer 
                int[] backBuffer = new int[width * height];
                GraphicsDevice.GetBackBufferData(backBuffer);

                //Copy to texture
                Texture2D texture = new Texture2D(GraphicsDevice, width, height, false, GraphicsDevice.PresentationParameters.BackBufferFormat);
                texture.SetData(backBuffer);
                //Get a date for file name
                DateTime date = DateTime.Now; //Get the date for the file name
                Stream stream = File.Create(SCREENSHOT FOLDER + date.ToString("MM-dd-yy H;mm;ss") + ".png"); 

                //Save as PNG
                texture.SaveAsPng(stream, width, height);
                stream.Dispose();
                texture.Dispose();
            }

Texture2D dirt = Content.Load<Texture2D>(t.texture);また、すべてのフレームを読み込んでいますか?それのように見えます...それをしないでください!これにより、1秒間に数百回、数百のタイルをロードする際に大きな遅延が発生します。代わりに、グローバルテクスチャTexture2D DirtDextureを作成し、LoadContent()メソッドで実行しDirtTexture = Content.Load<Texture2D>(t.texture); ます。描画するときに実行できます。spriteBatch.Draw(DirtTexture,...

と同じことを spriteBatch = new SpriteBatch(GraphicsDevice);し ます gridImage = new RenderTarget2D(GraphicsDevice, 1000, 1000);

フレームごとに新しいRenderTargetとSpritebatchを作成する必要はありません。Initialize()メソッドでそれを行うだけです!

レンダーターゲットの使用の詳細については、 RenderTarget2DおよびXNARenderTargetサンプルも参照してください。

編集:私はそれがすべてLoadContentにあることに気づきました。フォーマットがめちゃくちゃだったので、DrawメソッドにForeach(タイルなど)を追加することを忘れないでください。

于 2013-01-02T00:43:56.890 に答える