1

以下の私のコードでは、正しく行われていると思います。しかし、idk、_bg によって呼び出された画像は表示されません。画面には白のみが表示されます。奇妙なことに、実行するとエラーメッセージが0です。

(RenderTarget2D は、ビューを横向きモードにデフォルト設定するためのものです)

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace GameName2
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Game
    {
        GraphicsDeviceManager _graphics;
        SpriteBatch _spriteBatch;
        Texture2D _bg;
        RenderTarget2D finalImageTarget;

        public Game1()
        {
            _graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()
        {
            // TODO: Add your initialization logic here

            base.Initialize();
        }

        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            _spriteBatch = new SpriteBatch(GraphicsDevice);

            _bg = Content.Load<Texture2D>(@"background");
            finalImageTarget = new RenderTarget2D(GraphicsDevice, 1280, 720);
            // TODO: use this.Content to load your game content here
        }

        /// <summary>
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }

        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Update(GameTime gameTime)
        {
            // TODO: Add your update logic here

            base.Update(gameTime);
        }

        /// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.SetRenderTarget(finalImageTarget);
            GraphicsDevice.Clear(Color.White);

            // TODO: Add your drawing code here
            _spriteBatch.Begin();
            _spriteBatch.Draw(_bg,
                new Rectangle(0, 0, Window.ClientBounds.Width, Window.ClientBounds.Height),
                null,
                Color.White,
                0,
                Vector2.Zero,
                SpriteEffects.None,
                0);
            _spriteBatch.End();

            GraphicsDevice.SetRenderTarget(null);
            _spriteBatch.Begin();
            _spriteBatch.Draw(finalImageTarget,
                    new Vector2(720,0),
                    null,
                    Color.White,
                    MathHelper.PiOver2,
                    Vector2.Zero,
                    Vector2.One,
                    SpriteEffects.None,
                    0f);
            _spriteBatch.End();

            base.Draw(gameTime);


        }
    }
}

xnbファイルを使用しています。そして、プロジェクトのContentフォルダーに入れました。ファイル プロパティに「コンテンツ」と「新しい場合はコピー」を設定しました。

これは、xnb に変換する前に使用する .png ファイルです: https://imageshack.us/scaled/large/15/loadingo.png

それとも、私の .png ファイルに問題があるのでしょうか?

何か案が?ありがとう

4

4 に答える 4

1

その 2 番目のスプライト バッチ コールはかなり興味深いものです。画面外で画像を移動および/または回転しているように見えます。

このdraw のオーバーロードを使用しているので、効果的にこれを行っています:

Texture2D texture =          finalImageTarget;
Vector2 position =           new Vector2(720,0);
Rectangle? sourceRectangle = null;
Color color =                Color.White;
float rotation =             MathHelper.PiOver2;
Vector2 origin =             Vector2.Zero;
Vector2 scale =              Vector2.One;
SpriteEffects effects =      SpriteEffects.None;
float layerDepth =           0f;

_spriteBatch.Draw (texture,position,sourceRectangle,color,rotation,origin,scale,effects,layerDepth,layerDepth);

つまり、画像を画面の左上隅の右に 720 ピクセル配置し、画像の左上隅を中心に 90 度回転させます。

私の提案は、単純なものから始めて、達成したいものまで徐々に作業を進めることです。レンダー ターゲットなしで単一のスプライト バッチ呼び出しを使用し、回転なしでソースと宛先の四角形を使用します。

編集: デバッガーを使用して、すべての変数が期待どおりの値で出力されていることを確認します。たとえば、Window.ClientBounds.Width / Height がゼロになることがあります。Android への移植時にこれを一度見たことがあり、ビューポートの幅と高さを使用するように変更する必要があったと思います。

于 2013-04-28T23:34:24.683 に答える
0

なぜ Render2D を使用しているのですか? 具体的な理由はありますか?

そうでない場合は、使用してウィンドウの解像度を変更します

_graphics.PreferredBackBuffer.Width = 720;
_graphics.PreferredBackbuffer.Height = 1280;

あなたのコンストラクタで。次に、以下を使用して Texture2D 画像を自由に配置できます。

_spriteBatch.Begin();
        _spriteBatch.Draw(_bg,
            new Rectangle(0, 0, Window.ClientBounds.Width, Window.ClientBounds.Height),
            null,
            Color.Black,
            0,
            Vector2.Zero,
            SpriteEffects.None,
            0);
        _spriteBatch.End();

背景画像の上と下の配置が心配な場合は、spriteBatch 呼び出しでレイヤーを使用してみてください。

私が言ったように、なぜあなたがこのようにしたいのかわからないので、間違っているかもしれませんが、この簡単な方法でそれを行うと、テクスチャファイルであるかどうかに関係なくうまくいきます。

編集

あなたのコメントに基づいて、座標を介して texture2D を配置するだけで試してみてください。

_spriteBatch.Draw(_bg, new vector2(0,0), color.black);

また

_spriteBatch.Draw(_bg, new vector2(screen.width/2,screen.height/2), color.black);

それでも表示されない場合は、ファイルのプロパティを確認するか、テストのためにファイルを jpg に変更することをお勧めします。

于 2013-04-29T12:55:32.907 に答える
0
        GraphicsDevice.SetRenderTarget(finalImageTarget);
        GraphicsDevice.Clear(Color.White);

        // TODO: Add your drawing code here
        _spriteBatch.Begin();
        _spriteBatch.Draw(_bg,
            new Rectangle(0, 0, Window.ClientBounds.Width, Window.ClientBounds.Height),
            null,
            Color.White,
            0,
            Vector2.Zero,
            SpriteEffects.None,
            0);
        _spriteBatch.End();

このコードは、表示されている画面に描画されていません。finalImageTargetレンダー ターゲットに描画されています。レンダー ターゲットとは、画面に表示されない描画先のことです。これを に設定すると、GraphicsDevice.SetRenderTarget(null);XNA が表示されている画面に描画するように指示されます。

于 2013-04-28T21:49:19.663 に答える