您的位置:首页 > 其它

Xna 2D图形概述

2007-02-24 23:50 246 查看

概要

精灵是取代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)的位置绘制一个50 x 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 指定不统一的缩放:Vector2的X 和 Y 域分别指定了x 和 y 轴独立的缩放值。

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

Sprite(精灵) Batching

默认情况下,调用SpriteBatch.Begin () 将导致 SpriteBatch 实例改变图形设备的设置来为绘制精灵做准备。然后,每次调用Draw 时都将立即使用当前设备设置来绘制精灵。如果调用End时指定了SaveStateMode.SaveState,这将重新复位设备设置。这就是立即模式。

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

在Deferred 模式下, SpriteBatch 将为每个Draw的调用保存信息,直到他相应的 End 方法被调用为止。当你调用了 End以后,SpriteBatch将该改变显示设备设置,然后将这个批处理中的所有精灵绘制。然后如果指定了SaveStateMode.SaveState,那么End 将会把设备复位。

Deferred 模式比立即模式慢,但是他允许多个SpriteBatch 实例的SpriteBatch.Begin ()和Draw的调用的共同存在而相互之间却没有冲突。你可以传递 SpriteSortMode.Deferred给SpriteBatch.Begin ()来选择使用deferred模式 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: