在所有的图形引擎中,绘制都是最基础的部分,本文将介绍在XNA框架中与绘制相关的基础知识。
在XNA中,我们使用SpriteBatch来进行绘制。首先,我们需要使用SpriteBatch来绘制什么了?是精灵 Sprite,对。
那么Sprite通过什么来表现了?是纹理,比如2D纹理Texture2D。嗯,你可以把纹理想象成Sprite的外 表,比如我们制作的一幅精灵图片,就是一个纹理。
我们要如何才能把一幅图片加载到我们的游戏中来作为一个Sprite的纹理了?这要通过素材管道 Content Pipeline。所谓素材,包括我们游戏中要用到的图片、模型、声音等,比如一个纹理图片就是素 材的一种。素材管道就很容易理解了,它可以把我们需要的素材导入到我们的游戏中,以XNA能够识别的 正确的格式。而且,格式的识别与转换是在编译期完成的。
在新建的XNA项目中,会有一个默认的Content文件夹,通常,我们会把所有的素材放在这个地方,并 且根据素材的种类我们会在其下创建一些子文件夹,比如Image子文件夹用来存放所有的图片素材,Audio 文件夹用来存放声音素材等。
当一个物件别被识别为素材后,就会有一个唯一的资产名称AssetName来标记它,我们可以通过素材的 属性页来查看素材的AssetName属性并修改它。
下面我们可以用素材管理器ContentManager将一个素材导入到游戏中:
Texture2D texture;
texture = Content.Load<Texture2D>(@"Image\logo"); //在上文提到的LoadContent方法中调 用
很多时候,我们的图片需要是透明的,那么如何在SpriteBatch绘制的时候将图片绘制为透明了?有两 种方法:要么图片具有透明的背景,要么在制作图片时将需要透明的部分设置为纯正的洋红色(255,0, 255)。除此之外,还需要注意,SpriteBlendMode模式必须为AlphaBlend(这也是默认模式,稍后会提到 ),才能达到我们期望的透明效果。
在进行渲染时,我们还需要注意层深度(Layer Depth)。所谓Layer Depth,指的是你需要将目标 Sprite绘制在哪一个深度的层次。默认情况下,SpriteBatch会根据你调用的顺序来决定Layer Depth的相 对值,比如,你先调用SpriteBatch绘制Sprite A,然后调用SpriteBatch在同一位置绘制Sprite B,那么 ,Sprite B就会把Sprite A挡住。如果我们依靠调用SpriteBatch绘制的顺序来决定Sprite的深度,那就 太不灵活了,为此,调用SpriteBatch绘制方法时,你可以指定一个代表层次深度的参数(范围0~1)来指 示SpriteBatch按照我们希望的顺序来绘制对象。
有了上面的这些基础之后,我们可以详细讲解一下XNA中的渲染过程。每次渲染的过程都类似下面的模 式:
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Black);
spriteBatch.Begin();
spriteBatch.Draw(……);
spriteBatch.End();
base.Draw(gameTime);
}
(1)GraphicsDevice.Clear()方法用于清除屏幕背景。
(2)SpriteBatch.Begin()方法用于通知显卡准备绘制场景。
(3)轮流调用SpriteBatch.Draw()绘制所有组件。
(4)SpriteBatch.End()方法用于告诉显卡绘制已经完成。
(5)最后,显卡显示绘制的结果。