绘制透明和半透明 sprite

更新页 :
页面创建日期 :

总结

绘制半透明纹理。

透明・半透明のスプライトを描画する

经营环境

先决条件

支持的 XNA 版本
  • 2.0
  • 3.0
  • 3.1
  • 4.0
支持的平台
  • Windows(XP SP2 或更高版本、Vista、7)
  • Xbox 360 的
  • Windows Phone 7 系列
Windows 所需的顶点着色器版本 2.0
Windows 所需的像素着色器版本 2.0

经营环境

平台
  • 视窗 7
  • Xbox 360 的
  • Windows Phone 7 模拟器

物质

如果使用包含半透明信息(如 Alpha 值)的图像文件,则可以创建具有半透明信息的纹理,并且 Sprite 也可以绘制为半透明。 在本例中,我使用如下所示的 PNG 图像来创建纹理(尽管下面的图像本身具有黑色背景,以便于查看)。

アルファ付き PNG ファイル

虽然它是一个程序,但实际上,即使按原样使用 “Display sprite” 页面上的代码,也可以以半透明的方式绘制 sprite。 最初,除非您指定可以半透明处理的混合状态(例如“SpriteBatch.Begin”方法中的“BlendState.AlphaBlend”),否则无法透明地绘制,但由于这是默认设置的,因此即使使用原样代码,也可以透明地绘制它。

在下面的代码中,我们为“SpriteBatch.Begin”方法显式指定“BlendState.AlphaBlend”。

// BlendState.AlphaBlend(デフォルト) を指定してスプライトを透過させます
this.spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend);

SpriteBatch.Begin 方法

在绘制 sprite 之前调用它。 在内部,我们正在为绘制 sprite 进行必要的设置。

sortMode SpriteSortMode (精灵排序模式) 指定从 SpriteSortMode 枚举中绘制 sprite 的顺序。 默认值为 SpriteSortMode.Deferred,它按调用 SpriteBatch.Draw 方法的顺序绘制。
混合状态 BlendState (混合状态) 如何将要绘制的 sprite 的颜色与背景色混合。 默认情况下,为半透明绘制指定 BlendState.AlphaBlend。

使用 BlendState.AlphaBlend 计算颜色的公式如下: (所有颜色应在 0.0 ~ 1.0 的范围内)

结果 = source.rgb + destination.rgb * (1 - source.a)

  • result : 最终输出颜色
  • source :您尝试绘制的纹理的颜色
  • destination :目的地的背景颜色
  • RGBA:分别是 R(红色)、G(绿色)、B(蓝色)和 A(alpha(不透明度))的分量

所有代码

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
#if WINDOWS_PHONE
using Microsoft.Xna.Framework.Input.Touch;
#endif

namespace AlphaBlendSprite
{
    /// <summary>
    /// ゲームメインクラス
    /// </summary>
    public class GameMain : Microsoft.Xna.Framework.Game
    {
        /// <summary>
        /// グラフィックデバイス管理クラス
        /// </summary>
        private GraphicsDeviceManager graphics = null;

        /// <summary>
        /// スプライトのバッチ化クラス
        /// </summary>
        private SpriteBatch spriteBatch = null;

        /// <summary>
        /// テクスチャー
        /// </summary>
        private Texture2D texture = null;


        /// <summary>
        /// GameMain コンストラクタ
        /// </summary>
        public GameMain()
        {
            // グラフィックデバイス管理クラスの作成
            this.graphics = new GraphicsDeviceManager(this);

            // ゲームコンテンツのルートディレクトリを設定
            this.Content.RootDirectory = "Content";

#if WINDOWS_PHONE
            // Windows Phone のデフォルトのフレームレートは 30 FPS
            this.TargetElapsedTime = TimeSpan.FromTicks(333333);

            // バックバッファサイズの設定
            this.graphics.PreferredBackBufferWidth = 480;
            this.graphics.PreferredBackBufferHeight = 800;

            // フルスクリーン表示
            this.graphics.IsFullScreen = true;
#endif
        }

        /// <summary>
        /// ゲームが始まる前の初期化処理を行うメソッド
        /// グラフィック以外のデータの読み込み、コンポーネントの初期化を行う
        /// </summary>
        protected override void Initialize()
        {
            // TODO: ここに初期化ロジックを書いてください

            // コンポーネントの初期化などを行います
            base.Initialize();
        }

        /// <summary>
        /// ゲームが始まるときに一回だけ呼ばれ
        /// すべてのゲームコンテンツを読み込みます
        /// </summary>
        protected override void LoadContent()
        {
            // テクスチャーを描画するためのスプライトバッチクラスを作成します
            this.spriteBatch = new SpriteBatch(this.GraphicsDevice);

            // テクスチャーをコンテンツパイプラインから読み込む
            this.texture = this.Content.Load<Texture2D>("Texture");
        }

        /// <summary>
        /// ゲームが終了するときに一回だけ呼ばれ
        /// すべてのゲームコンテンツをアンロードします
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: ContentManager で管理されていないコンテンツを
            //       ここでアンロードしてください
        }

        /// <summary>
        /// 描画以外のデータ更新等の処理を行うメソッド
        /// 主に入力処理、衝突判定などの物理計算、オーディオの再生など
        /// </summary>
        /// <param name="gameTime">このメソッドが呼ばれたときのゲーム時間</param>
        protected override void Update(GameTime gameTime)
        {
            // Xbox 360 コントローラ、Windows Phone の BACK ボタンを押したときに
            // ゲームを終了させます
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            {
                this.Exit();
            }

            // TODO: ここに更新処理を記述してください

            // 登録された GameComponent を更新する
            base.Update(gameTime);
        }

        /// <summary>
        /// 描画処理を行うメソッド
        /// </summary>
        /// <param name="gameTime">このメソッドが呼ばれたときのゲーム時間</param>
        protected override void Draw(GameTime gameTime)
        {
            // 画面を指定した色でクリアします
            this.GraphicsDevice.Clear(Color.CornflowerBlue);

            // BlendState.AlphaBlend(デフォルト) を指定してスプライトを透過させます
            this.spriteBatch.Begin();

            // スプライトを描画する
            this.spriteBatch.Draw(this.texture, new Vector2(50.0f, 50.0f), Color.White);

            // スプライトの一括描画
            this.spriteBatch.End();

            // 登録された DrawableGameComponent を描画する
            base.Draw(gameTime);
        }
    }
}