梦想成真 XNA (2) - 绘制精灵,绘制文字
作者:webabcd
介绍
XNA: 绘制一个精灵,绘制一段文字
示例
1、绘制精灵的 Demo(按键盘 B 键加载此 Demo)
Component/Sprite/DrawDemo.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 DrawDemo : Microsoft.Xna.Framework.DrawableGameComponent { // 精灵绘制器 SpriteBatch _spriteBatch; // 2D 纹理对象 Texture2D _texture2D; public DrawDemo(Game game) : base(game) { } public override void Initialize() { base.Initialize(); } protected override void LoadContent() { _spriteBatch = new SpriteBatch(Game.GraphicsDevice); _texture2D = 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); _spriteBatch.Begin(); /* * Draw(Texture2D texture, Vector2 position, Rectangle? sourceRectangle, Color color, float rotation, Vector2 origin, float scale, SpriteEffects effects, float layerDepth) - 绘制一个纹理 * Texture2D texture - 需要绘制的纹理对象 * Vector2 position - 需要绘制的对象的坐标,以左上角为原点 * Rectangle? sourceRectangle - 指定纹理上的一个矩形区域,实际绘制时仅绘制这个矩形区域中的纹理 * Color color - 将需要绘制的纹理对象以指定的颜色进行染色渲染,如果不需做任何染色处理则为 Color.White * float rotation - 旋转纹理对象,单位是“弧度” * Vector2 origin - 指定纹理对象的原点(默认为 Vector2.Zero) * float scale - 缩放比例(还有一个重载方法中,此参数的类型是 Vector2,同样用来设置缩放比例) * SpriteEffects effects - 纹理的翻转类型 * SpriteEffects.None - 不做处理 * SpriteEffects.FlipHorizontally - 水平翻转 * SpriteEffects.FlipVertically - 垂直翻转 * float layerDepth - 层深度(0 - 1 之间),相当于 z-index * * Draw(Texture2D texture, Rectangle destinationRectangle, Color color) - 绘制一个纹理 * Rectangle destinationRectangle - 将需要绘制的纹理对象缩放到指定的矩形区域 */ // 再 0,0 点绘制一个图像 _spriteBatch.Draw(_texture2D, Vector2.Zero, Color.White); // 再 10,10 点绘制一个图像,该图像的宽为原始图像的 1/2,高为原始图像的 1/3 _spriteBatch.Draw(_texture2D, new Rectangle(10, 10, _texture2D.Width / 2, _texture2D.Height / 3), Color.Green); // 绘制原始图像的上半部分 _spriteBatch.Draw(_texture2D, new Vector2(_texture2D.Width, 0), new Rectangle(0, 0, _texture2D.Width, _texture2D.Height / 2), Color.Red); // 将纹理放大 1.5 倍,并垂直翻转 _spriteBatch.Draw(_texture2D, new Vector2(_texture2D.Width * 2, 0), null, Color.Yellow, 0f, Vector2.Zero, 1.5f, SpriteEffects.FlipVertically, 0f); // 将纹理的中心点设置为原点(此时 0,0 点表现为纹理的中心点,而不是左上角点),顺时针旋转 45 度 _spriteBatch.Draw(_texture2D, new Vector2(_texture2D.Width / 2, _texture2D.Height + _texture2D.Height / 2), null, Color.Blue, (float)(Math.PI / 180) * 45, new Vector2(_texture2D.Width / 2, _texture2D.Height / 2), 1f, SpriteEffects.None, 0f); _spriteBatch.End(); base.Update(gameTime); } } }
2、绘制文字的 Demo(按键盘 C 键加载此 Demo)
XNAContent/SpriteFont/Menu.spritefont
<?xml version="1.0" encoding="utf-8"?> <!-- 字体文件实际上就是一个 XML 配置文件,编译后会根据此配置将指定的字体编译成 .xnb 二进制文件 --> <XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics"> <Asset Type="Graphics:FontDescription"> <!--字体名称--> <FontName>Arial</FontName> <!--字大小--> <Size>32</Size> <!--字间距--> <Spacing>2</Spacing> <!--是否使用字距调整(Kerning)。什么是 Kerning 请参考字体基础知识--> <UseKerning>true</UseKerning> <!--字体样式:Bold, Italic, Regular--> <Style>Bold</Style> <!--用户输入的字符不在指定的字符区间内的话,则使用此字符代替--> <DefaultCharacter>?</DefaultCharacter> <!-- 将指定区间内的字符交由 Content Pipeline 管理 --> <CharacterRegions> <CharacterRegion> <!-- unicode 表示的中文编码区间如下,不过我的电脑编译时死机了 <Start>一</Start> <End>龥</End> --> <!-- 将 ASCII(32-126)中的字符都编译进 .xnb 二进制文件,即从“空格”到“~”之间的所有字符,参见 ASCII码表 --> <Start> </Start> <End>~</End> </CharacterRegion> </CharacterRegions> </Asset> </XnaContent>
Component/Sprite/DrawString.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 DrawString : Microsoft.Xna.Framework.DrawableGameComponent { // 精灵绘制器 SpriteBatch _spriteBatch; // 文字纹理对象 SpriteFont _spriteFont; public DrawString(Game game) : base(game) { } public override void Initialize() { base.Initialize(); } protected override void LoadContent() { _spriteBatch = new SpriteBatch(Game.GraphicsDevice); // 加载字体配置文件 SpriteFont/Menu 到 SpriteFont 对象中。字体配置文件的详细信息参见 XNAContent/SpriteFont/Menu.spritefont _spriteFont = Game.Content.Load<SpriteFont>("SpriteFont/Menu"); } public override void Update(GameTime gameTime) { base.Update(gameTime); } public override void Draw(GameTime gameTime) { Game.GraphicsDevice.Clear(Color.CornflowerBlue); _spriteBatch.Begin(); /* * DrawString(SpriteFont spriteFont, string text, Vector2 position, Color color) - 绘制一个文字纹理 * DrawString(SpriteFont spriteFont, string text, Vector2 position, Color color, float rotation, Vector2 origin, float scale, SpriteEffects effects, float layerDepth) - 绘制一个文字纹理 * DrawString(SpriteFont spriteFont, string text, Vector2 position, Color color, float rotation, Vector2 origin, Vector2 scale, SpriteEffects effects, float layerDepth) - 绘制一个文字纹理 * * 各个参数的详细说明参见 Component/Sprite/DrawDemo.cs 中的示例 */ // 中文会用问号代替,因为在字体配置文件中指定了 <DefaultCharacter>?</DefaultCharacter> _spriteBatch.DrawString(_spriteFont, "Hello DrawString 中文会用问号代替", Vector2.Zero, Color.Red); _spriteBatch.End(); base.Update(gameTime); } } }
OK
[源码下载]