0

Texture2Dを画像で埋める最速の方法は何ですか?

/Images/image.pngの下に目的の画像があります。

私の既存のコードは、テクスチャを白い色で塗りつぶすだけです。画像をレンダリングするにはどうすればよいですか?

Texture2D texture = new Texture2D(graphics.GraphicsDevice, this.Width, this.Height, false, SurfaceFormat.Color);
Color[] colors = new Color[this.Width * this.Height];
for (int j = 0; j < colors.Length; j++)
    colors[j] = color;
texture.SetData(colors);

たぶん私はそれを間違った方法で行いますが、画面に画像を動的に表示するための最も簡単/最速の方法は何ですか?

アップデート

ContentManagerを使用するようにコードを変更しました。

ContentManager contentManager = (Application.Current as App).Content;
Texture2D texture = contentManager.Load<Texture2D>("/Images/block.png");

contentManager.Load<Texture2D>(@"Images/block.png")

「ファイルが見つかりません」をスローします。

contentManager.Load<Texture2D>(@"/Images/block.png")

「"\Images\block.png"の読み込み中にエラーが発生しました。ファイルを開くことができません。」をスローします。

4

3 に答える 3

2

最も簡単な方法は、提案されているようにコンテンツパイプラインに依存することです。

XNAプロジェクトを作成するときは、MyGameとMyGame(Content)の2つのプロジェクトが必要です。コンテンツを右クリックして、[ファイルの追加]を選択します。これにより、簡単にパスして.xnb形式にコンパイルできる画像をインポートできます。これは物事を少し加速することを目的としていると思います。

それが済んだら、ContentManagerオブジェクトが必要です。理想的にContentは、すでに設定されているゲームクラスから使用します。ただし、次の方法で作成できます。

ContentMananger content = new ContentManager(Services, "Content");

Servicesゲームクラス(またはでIServiceProvider)はどこにありますかGraphicsDeviceService。2番目の引数は、コンテンツフォルダのルートディレクトリです。

これにより、コンテンツパイプラインから次の方法で任意のデータ形式を読み込むことができます。

content.Load<Texture2D>("myTexture");

(ファイル拡張子は含めないことに注意してください。)

簡単にするために、コンテンツプロジェクトに「画像」フォルダを作成することをお勧めします。これは、最終的には多数のリソースがあり、整理が容易になるためです。また、ゲームに必要なすべてのデータ型を処理するために、SFX、音楽、XMLなどのフォルダーを作成することもできます。

だからあなたはするだろう:

Texture2D myTexture = content.Load<Texture2D>("images/myTexture");
SpriteBatch spriteBatch = new SpriteBatch(graphics.GraphicsDevice);

(これらのオブジェクトは明らかにクラススコープで表示される必要があることに注意してください)。これは、ファイルをロードするための初期化コードで発生します。

その後、Drawメソッドを使用して実際にスプライトを描画します

public override void Draw(SpriteBatch spriteBatch)
{
   spriteBatch.Begin();
   spriteBatch.Draw(myTexture, new Vector2(320, 240), Color.White);
   spriteBatch.End();
}

そして、あなたのスプライトは魔法のように描かれます。

あなたがしていることは、本質的にプログラムで画像を定義し、それを描くことです。彼らはいくつかの点でアプリケーションを持っていますが、おそらくあなたが探しているものではありません。

于 2012-12-12T22:13:47.917 に答える
0

実行時に画像を読み込もうとしている場合は、次のコードを使用できます。

string file = @"Content/images/1.png"; // @ sign is to treat '/' as a character, not a control symbol
FileStream fs = new FileStream(file, FileMode.Open);
Texture2D texture = Texture2D.FromStream(GraphicsDevice, fs);
fs.Dispose();

…そして、次のtextureように使用します。

spritebatch.Draw(texture, new Vector2(123, 456), Color.White);

使用するには、ゲームクラスFileStreamに追加する必要がある場合があります。using System.IO;

この方法は標準的な方法とは見なされていません。アルファチャネルで問題が発生する可能性があり、それらを修正するには、別のアルファブレンディング状態を使用する必要があります。詳細については、この質問をご覧ください。

于 2012-12-12T21:49:24.337 に答える
0

コンテンツ パイプラインを使用してテクスチャを追加していない場合は、次を使用しTexture2D.FromStream()ます。

FileInfo imageFile = new FileInfo("Images\\image.png");
Texture2D image = Texture2D.FromStream(GraphicsDevice, imageFile.OpenRead());

大量のテクスチャをロードしている場合は、不要になったときにそれらを破棄することをお勧めします

于 2012-12-13T02:30:09.830 に答える