平铺精灵(Tiled Sprites)
此示例展示如何管理精灵块,精灵动画,是否可见和虚拟化二维相机的数据。
概览
一个处理相似精灵的最普遍的技术是使用精灵块的网格,这样可以减少纹理数据的大小。块是重复的可分解的精灵,然后组成一个复合的二维图像。通常情况下,多个块储存在一个单一的纹理中,有时被称为精灵表(Sprite Sheet)。
虽然游戏中可能有数以万计的块,但只有那些可见的要被绘制。否则,性能会严重下降。为了简化块的互动,这个实例提供了一个二维相机。你会找到一个有用的相机抽象类,这对旋转或缩放世界尤其有用。这使您能够迅速将屏幕空间转化为世界空间。
精灵动画(Sprite animation)是一个类似的数据管理任务,因为几个源精灵组成动画的每个帧。该示例演示从精灵表中快速生成了一系列的动画帧的方法。
示例控制
这个示例使用以下的键盘和手柄控制。
动作 | 键盘控制 | 手柄控制 |
---|---|---|
移动背景 | 方向键 | 右摇杆 |
移动小球 | W, A, S和D | 左摇杆 |
旋转背景 | Q 和 E | Triggers |
变焦 | Z 和 X | A 和 B |
复位 | R | 按下右摇杆 |
退出 | ESC 或 ALT+F4 | BACK |
工作原理
TiledSprites创建了一个大网格的地基,细节,岩石和云的平铺块,然后用随机数据填充他们以建立一个自然场景。它还加载了一个反弹球的动画,并在循环中绘制小球。
您可以使用手柄右摇杆配合A和B按钮缩放场景,triggers键处理旋转来控制相机。按Y按钮重置视点。左摇杆控制小球在世界坐标中的位置。
该示例还支持键盘控制。此示例也包含输入处理,因为当相机位置变化时场景中的每个元素都需更新。
尤其是对TileGrid来说,更新相机属性不仅是必要的,而且还能避免额外的判断可见性(DetermineVisibility)的调用。考虑到这一点,相机类有一个IsChanged属性用来表明在一帧间相机是否已经改变,可见性是否需要更新。
云层的移动和缩放变化和场景中的其他元素不一样,这样可以显示视差效果。此外,当拉近镜头时,云层的Alpha值(透明度)会减少,使之更加透明。
屏幕坐标与世界坐标
由块组成的游戏中最复杂的部分是如何协调世界坐标和屏幕坐标。SpriteBatch使用屏幕坐标将精灵直接显示在屏幕上。然而,游戏世界中的块以世界坐标储存。当你必须考虑旋转和缩放时,这个问题变得更加复杂。该示例演示了一个有效率的转换坐标的方法。
精灵表(SpriteSheet)
SpriteSheet是一个简单的容器类,保存Texture2D与Dictionary。出于性能考虑,键是整数类型。字典中的值给定精灵的source rectangles(源矩形)。
在TiledSpritesSample.LoadContent的初始化中,为云,地面块和动画球创建了精灵表。然后精灵表用指定纹理的精灵源进行更新。对于动画球,AnimatedSprite构造函数产生精灵源,因为它们对应相同大小的帧动画。
Camera2D
Camera2D类是依赖分辨率的2D相机的一个简单抽象。这台相机没有有关屏幕大小的信息,只有它的中心点,缩放和旋转值。这意味着,如果改变后备缓冲区的大小,相机不会自动改变缩放加以补偿。该相机能在世界坐标或屏幕坐标中旋转。它使用rotation值设置在屏幕空间指向的旋转。
TileGrid
TileGrid是此范例最复杂的部分。它定义了统一大小的块的网格,你可以旋转,缩放和重置它们。块放在世界坐标中,您可以平移和缩放整个网格。它也包含了相机属性告知TileGrid如何在屏幕上绘制块。
TileGrid包含一个二维整数数组,对应每个源块的位置。这些整数作为精灵表字典的键值以获得源块。
一旦位置,缩放或旋转属性发生了变化,就必须更新visibility,这样只绘制屏幕上可见的块。由于块都被排列在一个规则的网格上,所以确定哪些砖在屏幕上可见是相当轻松的。DetermineVisibility函数计算一个在屏幕上可见的所有块的长方形截图。然后储存范围。当调用Draw绘制TileGrid时,该方法首先确定visibility是否需要更新。然后使用SpriteBatch在可见的矩形内绘制所有块。当计算SpriteBatch参数时,操作顺序是至关重要的,因为当将精灵转化到屏幕空间时,SpriteBatch有自己的操作顺序。 AnimatedSprite 动画精灵没有相机的概念,因此它必须通过SpriteOperation.cs中的一些计算手动定位到屏幕空间。该模式看起来应该很熟悉:在绘制单独的块时,它被TileGrid用来以同样的顺序操作。
改进示例
虽然TileGrid和AnimatedSprite的实现比较简单,但没有理由不能创建动画平铺块。这个范例最大的改进是实现一个支持动画的TileGrid。另一个有趣的挑战是实现一个可以自由放置块的功能,而不是像现在一样只能放在一个固定的网格上。
发布时间:2009/2/12 下午1:18:43 阅读次数:7757