zoukankan      html  css  js  c++  java
  • 梦想成真 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 
    [源码下载]

  • 相关阅读:
    AGC/ARC
    日常训练
    SQL经典问题四表查询(教师,学生,成绩,课程表)---MySQL版
    15个最佳的 JavaScript 表单验证库
    推荐6个国内技术大牛博客,全栈工程师修行的秘籍!(建议收藏)
    java-linux安装和配置
    vue学习笔记
    JVM学习笔记
    SpringMVC学习笔记
    Mybatis学习笔记
  • 原文地址:https://www.cnblogs.com/webabcd/p/2092869.html
Copyright © 2011-2022 走看看