XNAメモ – テクスチャアの背景の透化処理(コード編)

Posted: 2012年1月23日 カテゴリー: プログラミングメモ, XNA, XNAメモ
タグ:, , , , , , ,

今回はテクスチャアの背景色をコード内の処理で透明化する方法をメモします。

ゲームのテクスチャにはよく、物が描かれていない部分が真っ白だったり真っ黒だったりすることがあります。その場合、画像をそのまま描画したのでは余分な部分まで描画されてしまうので、出来ればいらない部分は透明化した方が便利です。消さないとこうなります(画像が小さすぎました・・・)。

なので、今回はその実装方法の一つを紹介します。ちなみに、紹介はしませんが、実質一番楽なのはPaint.Netなどの適当なソフトでいらない色を消してしますことです(じゃあこんなの書くなよって気もしますね)。

まず、テクスチャアをプロジェクトに追加して、Texture2Dに読み込んでください。その後に、指定した色を透明化するメソッドをGame1内に実装します。

行う処理は

       元の色と、変化後の色を保存する配列を宣言する

       テクスチャアのデータを獲得する

       画像のサイズ(全てのピクセルと同じ数)ループする

       ループ内で、もし現在のピクセルが指定された色の場合、無色透明にする

       配列に保存された色のデータをテクスチャに写す

以上です。これをコードで実装するとこうなります。

private void SetAlpha(Texture2D texture, Color toClear)
{
// テクスチャアと同じサイズに配列を作る
Color[] original = new Color[texture.Width * texture.Height];
Color[] newColour = new Color[texture.Height * texture.Width];

// テクスチャアの色を全て獲得
texture.GetData<Color>(original);

for (int i = 0; i < newColour.Length; ++i)
{
// もし現在の色が消すと指定された色の場合
if (original[i] == toClear)
{
// 色を無色透明に変える
newColour[i] = Color.Transparent;
}
else
{
// 違う場合は、そのままコピーする
newColour[i] = original[i];
}
}

// 背景色を消した画像をテクスチャに保存する
texture.SetData<Color>(newColour);
}
 

後は、読み込んだテクスチャアをこのメソッドに渡すだけです。

protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);

// テクスチャアの読み込み
mouse = Content.Load<Texture2D>("mouse");

// 白色のピクセルを透明化する
SetAlpha(mouse, Color.White);
}
 

実行結果。

以上です。今回のサンプルでは、白いピクセル(R255, G255, B255)は全て無色透明になります。

ちなみに、この処理方法の利点は、メソッド一つ呼ぶだけで背景を透明化でき、実行中にも出来ることですが、実行中に行われるので事前にテクスチャア自体をいじった方が速度はでます。

コメント
  1. […] XNAメモ – テクスチャアの背景の透化処理(コード編) […]

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中