XNA游戏:精灵Sprite的概念

概要

精灵是取代3D空间而直接绘制在屏幕上的2D位图, 通常用来显示一些玩家信息, 如生命值、生命数或者得分。一些游戏,特别是早期的游戏,几乎全部由精灵组成。

精灵在屏幕上是按坐标定位的。 屏幕的宽和高和后台缓存是一样的(意思是如果你的屏幕为800x600的,那么后台缓存就是一个800x600x每个像素所占的内存数的大小的内存块)。x轴表示屏幕的宽,y轴表示屏幕的高 。一定要注意y轴是从上到下递增的,而x轴是从左到右递增的。例如,当你的后台缓存是800x600时,(0,0)表示屏幕的左上角,(800,600)表示屏幕的右下角(请看图1)

图1. 一个位于屏幕坐标上的精灵(x 轴 400, y 轴 200)

要绘制精灵,必须先创建一个SpriteBatch对象, 通过调用Begin使其初始化 , 然后对每个精灵调用Draw方法。 精灵的位图信息可以从Texture2D对象中得到 。为了能使部分纹理透明或半透明,纹理要包含alpha通道信息。你可以用Draw来调节着色,旋转或者缩放精灵。 这个方法也可以让你选择在屏幕上只绘制纹理的一部分。 绘制完后,在调用Present之前调用End

精灵原点

当你绘制精灵时要理解的最重要的概念就是原点。原点其实就是精灵中指定的一个点,这个点默认是在精灵的左上角(0,0)。Draw方法将使用你指定的屏幕位置作为精灵的原点开始绘制。例如,如果你在没有为精灵指定一个原点(即使用默认原点)的情况下在(400,200)的位置绘制一个50x 50 像素的精灵,这个精灵的左上角将会在屏幕的(400,200)处。如果你使用 50 x 50精灵的中心(25,25)作为原点,想绘制相同的纹理到相同的位置(即上面的使用默认精灵原点绘制的位置),你就必须在屏幕位置上再加上原点的坐标(位置是425,225,原点是25,25,请看图2)

图 2. 蓝色的点标记了精灵坐标的中心

当我们旋转一个精灵的时候,将使用原点作为旋转的中心。这样的话,为了方便,我们就应该在屏幕上绘制精灵时普遍使用精灵的中心作为原点。

精灵深度

精灵也有深度的概念,当你绘制一个精灵的时候你可以指定其深度为0到1之间的一个浮点数。深度为0的精灵将在屏幕的最“前面”,他将覆盖其他深度比他低的精灵。深度为1的精灵将在屏幕的最“后面”,他将被任何深度值小于1的精灵覆盖。

取样纹理

精灵是基于Texture2D对象的,其实精灵就是一个位图 。Draw方法可以绘制整个纹理,或者纹理的一部分。要绘制纹理的一部分,就需要使用sourceRectangle 参数来指定哪些texels作为一个精灵来绘制, texel 其实就是纹理的一个像素。一个 32 x 32 的纹理里包含了1024个texel, 屏幕使用x和y值来指定屏幕上某像素的坐标,纹理的texel坐标也可以使用这种方式指定。指定一个值为 (0, 0, 32, 32) 的sourceRectangle将选择纹理的左上角的32 x 32区域。

精灵缩放

Draw方法提供了三种缩放精灵的方法。Draw方法可以接受一个统一的缩放参数或者不统一的缩放参数或者是一个源矩形和目标矩形。统一缩放变量是一个浮点数,这个浮点数将和精灵的x和y轴相乘。这将以相等的值缩小或扩大精灵的每个轴,不会改变精灵原来的宽高比。

想要独立的缩放x和y轴的话,Draw方法接受一个Vector2值作为缩放值。 这个Vector2指定不统一的缩放:Vector2XY域分别指定了xy 轴独立的缩放值。

Draw方法也接受一个源矩阵和目标矩阵。目标矩阵指定绘制在屏幕上的哪个位置,源矩阵指定了要绘制的texels。Draw方法使用sourceRectangle指定的像素并且独立缩放他们的x和y轴直到他可以填满destinationRectangle指定的矩形大小。

精灵转换矩阵(Sprite Transformation Matrices)

XNA Game Studio为sprite batches提供了一个功能—指定一个转换矩阵使batch能在绘制前应用到每个精灵上。转换矩阵可以是任意平移,旋转或缩放矩阵的组合。这个组合矩阵包含了精灵的位置,旋转,缩放和深度参数提供给Draw。因为矩阵还可应用到深度上,所以任意z坐标的转换都可能使精灵深度比1大或比0小,这样精灵就不可见了。

精灵字体(Sprite Fonts)

XNA Game Studio能让你使用SpriteBatch绘制文字。DrawString方法使用位置,颜色,旋转,原点和缩放在屏幕上绘制文字。DrawString还需要一个由SpriteFont类封装的纹理。SpriteFont在你将一个Sprite Font文件添加到项目中时由内容管道创建。Sprite Font文件包含了诸如字体名和大小的信息, Unicode字符包含在SpriteFont纹理中。当运行时,一个SpriteFont象一个Texture2D对象一样由ContentManager.Load加载。

Sprite(精灵) Batching

默认情况下,在你调用End之前,SpriteBatch实例不改变任何渲染状态或绘制任何精灵,这被称为Deferred模式。在Deferred 模式下, SpriteBatch 将为每个Draw的调用保存信息,直到他相应的End方法被调用为止。当你调用End后,SpriteBatch将该改变显示设备设置,然后将这个批处理中的所有精灵绘制。然后如果指定了SaveStateMode.SaveState,那么End将会把设备复位。

如果你指定SpriteSortMode.Immediate调用SpriteBatch.Begin(),这将切换到立即模式。在立即模式中,SpriteBatch实例立即改变图形设备的设置来为绘制精灵做准备,然后,调用Draw 时都将立即使用当前设备设置来绘制精灵。如果调用End时指定了SaveStateMode.SaveState,这将重新复位设备设置。

立即模式下,当你调用了一个SpriteBatch的实例的SpriteBatch.Begin方法以后,就不应该再调用其他SpriteBatch实例的方法,直到你调用了第一个SpriteBatch的End方法。

Deferred 模式比立即模式慢,但是他允许多个SpriteBatch 实例的Begin和Draw的调用的共同存在而相互之间却没有冲突。

渲染状态(Render States)

在绘制精灵时,SpriteBatch对象设置图形卡的以下渲染状态。

Render StatehValue
GraphicsDevice.RenderState.CullModeCullMode.CullCounterClockwiseFace
GraphicsDevice.RenderState.DepthBufferEnablefalse
GraphicsDevice.RenderState.AlphaBlendEnabletrue
GraphicsDevice.RenderState.AlphaBlendOperationBlendFunction.Add
GraphicsDevice.RenderState.SourceBlendBlend.SourceAlpha
GraphicsDevice.RenderState.DestinationBlendBlend.InverseSourceAlpha
GraphicsDevice.RenderState.SeparateAlphaBlendEnabledfalse
GraphicsDevice.RenderState.AlphaTestEnabletrue
GraphicsDevice.RenderState.AlphaFunctionCompareFunction.Greater
GraphicsDevice.RenderState.ReferenceAlpha0
GraphicsDevice.SamplerStates[0].AddressUTextureAddressMode.Clamp
GraphicsDevice.SamplerStates[0].AddressVTextureAddressMode.Clamp
GraphicsDevice.SamplerStates[0].MagFilterTextureFilter.Linear
GraphicsDevice.SamplerStates[0].MinFilterTextureFilter.Linear
GraphicsDevice.SamplerStates[0].MipFilterTextureFilter.Linear
GraphicsDevice.SamplerStates[0].MipMapLevelOfDetailBias0.0f
GraphicsDevice.SamplerStates[0].MaxMipLevel0

Point Sprites(点精灵)

点精灵是绘制在3D空中的精灵。这些精灵指定位置和大小。当绘制点精灵时,它的大小是不变的(无论3D空间中的相机如何变化)并总是朝向相机。点精灵被用来绘制粒子系统。

转载于:https://www.cnblogs.com/linzheng/archive/2012/04/07/2436096.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值