梦想成真 XNA (3) - SpriteSortMode, BlendState

[索引页]
[源码下载] 


梦想成真 XNA (3) - SpriteSortMode, BlendState



作者:webabcd


介绍
XNA: SpriteSortMode 和 BlendState

  • SpriteSortMode - 精灵在游戏窗口上绘制的排序方式,默认值为:SpriteSortMode.Deferred
  • BlendState - 精灵与当前游戏界面的混合方式,默认值为:BlendState.AlphaBlend



示例
1、用于演示 SpriteSortMode 的示例(按键盘 D 键加载此 Demo)
Component/Sprite/SpriteSortModeDemo.cs

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;

namespace XNA.Component.Sprite
{
    public class SpriteSortModeDemo : Microsoft.Xna.Framework.DrawableGameComponent
    {
        // 精灵绘制器
        SpriteBatch _spriteBatch;

        // 精灵对象
        Texture2D _spriteSon;
        Texture2D _spriteMVP;

        public SpriteSortModeDemo(Game game)
            : base(game)
        {

        }

        public override void Initialize()
        {
            base.Initialize();
        }
        
        protected override void LoadContent()
        {
            _spriteBatch = new SpriteBatch(Game.GraphicsDevice);
            _spriteSon = Game.Content.Load<Texture2D>("Image/Son");
            _spriteMVP = Game.Content.Load<Texture2D>("Image/MVP");
        }

        public override void Update(GameTime gameTime)
        {
            base.Update(gameTime);
        }

        public override void Draw(GameTime gameTime)
        {
            Game.GraphicsDevice.Clear(Color.CornflowerBlue);

            /*
             * SpriteSortMode - 精灵在游戏窗口上绘制的排序方式,默认值为:SpriteSortMode.Deferred
             *     SpriteSortMode.Deferred - 调用 End() 的时候,绘制精灵,绘制的顺序就是调用 Draw() 方法的顺序
             *     SpriteSortMode.Immediate - 调用 Draw() 方法时,立即绘制相应的精灵(此模式下在 Begin...End 之间不能再有其他 SpriteBatch 对象,其他模式无此限制)
             *     SpriteSortMode.FrontToBack - 调用 End() 的时候,绘制精灵,根据层深度(layerDepth)从小到大依次绘制
             *     SpriteSortMode.BackToFront - 调用 End() 的时候,绘制精灵,根据层深度(layerDepth)从大到小依次绘制
             *     SpriteSortMode.Texture - 调用 End() 的时候,绘制精灵,按照纹理的优先级依次绘制
             */

            _spriteBatch.Begin(SpriteSortMode.Deferred, null);
            _spriteBatch.Draw(_spriteSon, Vector2.Zero, Color.White);
            _spriteBatch.Draw(_spriteSon, new Vector2(20, 0), Color.Red);
            _spriteBatch.End();

            _spriteBatch.Begin(SpriteSortMode.Immediate, null);
            _spriteBatch.Draw(_spriteSon, new Vector2(400, 0), Color.White);
            _spriteBatch.Draw(_spriteSon, new Vector2(420, 0), Color.Red);
            _spriteBatch.End();

            _spriteBatch.Begin(SpriteSortMode.FrontToBack, null);
            Draw(_spriteSon, new Vector2(20, 200), Color.Red, 0.2f);
            Draw(_spriteSon, new Vector2(0, 200), Color.White, 0.1f);
            _spriteBatch.End();

            _spriteBatch.Begin(SpriteSortMode.BackToFront, null);
            Draw(_spriteSon, new Vector2(420, 200), Color.Red, 0.1f);
            Draw(_spriteSon, new Vector2(400, 200), Color.White, 0.2f);
            _spriteBatch.End();

            // 按纹理优先级依次绘制的 Demo,下面的测试表明文件大小相对小的将被优先绘制
            // 官方文档说明:在不需考虑精灵重叠的情况下,建议用此模式,因为其效率较高
            _spriteBatch.Begin(SpriteSortMode.Texture, null); 
            _spriteBatch.Draw(_spriteSon, new Vector2(20, 400), Color.White); // 40.3 KB
            _spriteBatch.Draw(_spriteMVP, new Vector2(0, 400), Color.White); // 5.36 KB
            _spriteBatch.End();

            base.Update(gameTime);
        }

        private void Draw(Texture2D texture, Vector2 position, Color color, float layerDepth)
        {
            _spriteBatch.Draw(texture, position, null, color, 0f, Vector2.Zero, 1f, SpriteEffects.None, layerDepth);
        }
    }
}



2、用于演示 BlendState 的示例(按键盘 E 键加载此 Demo)
Component/Sprite/BlendStateDemo.cs

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;

namespace XNA.Component.Sprite
{
    public class BlendStateDemo : Microsoft.Xna.Framework.DrawableGameComponent
    {
        // 精灵绘制器
        SpriteBatch _spriteBatch;

        // 精灵对象
        Texture2D _sprite;

        public BlendStateDemo(Game game)
            : base(game)
        {

        }

        public override void Initialize()
        {
            base.Initialize();
        }

        protected override void LoadContent()
        {
            _spriteBatch = new SpriteBatch(Game.GraphicsDevice);
            _sprite = Game.Content.Load<Texture2D>("Image/Son");
        }

        public override void Update(GameTime gameTime)
        {
            base.Update(gameTime);
        }

        public override void Draw(GameTime gameTime)
        {
            Game.GraphicsDevice.Clear(Color.CornflowerBlue);

            /*
             * BlendState - 精灵与当前游戏界面的混合方式,默认值为:BlendState.AlphaBlend
             *     BlendState.AlphaBlend - 使精灵的 Alpha 值有效
             *     BlendState.Additive - 精灵的 Alpha 值有效,同时精灵与当前游戏界面相互混合
             *     BlendState.Opaque - 使精灵完全不透明
             *     BlendState.NonPremultiplied - 在 Content Pipeline 没对内容做 Alpha 预处理的情况下,在 Draw 时及时处理 Alpha 值
             *         在内容项目中选择一个资源,然后查看其属性,其 Content Processor -> Premultiply Alpha 默认值为 true,即 Content Pipeline 会对内容做 Alpha 预处理
             *         如果内容的 Processor -> Premultiply Alpha 设置为 false,则即使在 BlendState.AlphaBlend 模式下,精灵原有的 Alpha 值也不会生效,此时若要使精灵的 Alpha 值生效,则需要设置为 BlendState.NonPremultiplied
             */

            _spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend);
            _spriteBatch.Draw(_sprite, Vector2.Zero, Color.White);
            _spriteBatch.End();

            _spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Additive); 
            _spriteBatch.Draw(_sprite, new Vector2(200, 0), Color.White);
            _spriteBatch.End();

            _spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Opaque);
            _spriteBatch.Draw(_sprite, new Vector2(400, 0), Color.White);
            _spriteBatch.End();

            base.Update(gameTime);
        }
    }
}




OK 
[源码下载]

posted @ 2011-06-29 08:11  webabcd  阅读(3712)  评论(13编辑  收藏  举报