RLE 精灵教程.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
RLE 精灵教程

RLE 精灵教程 序言 精灵是电脑游戏中使用的最普通的元素之一,直到最近由于3-D浪潮蜂拥而至才被“多边形”所取代。然而,即使3-D游戏也能因设计完美的精灵而得益。这篇文章就是一个关于实现一个高水平的,高效的RLE精灵系统的简短教程。 这里提到的精灵特指矩形位图,这种位图数据中的某种颜色被定义为透明的。当往屏幕上画精灵时,用透明色描述的像素就不画上去。这样造成的效果就是精灵在所描绘的场景的“上面”(有时在“后面”)。 RLE 精灵R是一种使向屏幕绘图高效和节省内存的保存sprite的方法。下面的讨论解释了如何不依赖硬件而完整地实现一个基于RLE的精灵系统。 这里所有的原代码、伪代码都用C语言表示,而且许多用到了JLib(一个小型的图形库)的调用。它们可以很容易地适合其他的图形库。这篇文章的结果来自与我用JLib完成的精灵部分的经验,由于JLib提供了所有的原代码,你可以把这里的精灵代码看作作了适当取舍的一个RLE精灵系统的例子。 jlib 可以在以下地址找到: ftp://x2ftp.oulu.fi/pub/msdos/programming/djgpp2/jlib_X-X.zip; 这里的 X-X 表示JLib的版本号(我写这篇文章时已是1.7 版)。 简单精灵 让我们从构造一个简单精灵开始。构造一个精灵系统的最简单的方法是用包含了精灵颜色信息的2维数组来存放精灵数据。一个太空船精灵看起来就象这样: XXXXXXXXXXXXXXXX XXXXXXX XXXXXXX XXXXXXX XXXXXXX XXXXXX XXXXXX XXXXX XXXXX? XXXX XXXX XXXX? XXX XXXX XXX XXX X X XXX XXX X X XXX XXX XXXX XXX XXX XXX XX X X XX X XX XX X XXXXXXXXXXXXXXXX? 这就是一个15*14 的太空船精灵(X表示黑颜色,空格代表其他颜色)。 如果你要把此太空船用作一个精灵,你得创建一个15*14的数组,并用上述的颜色来填满它。如下所示: #define SHIP_WIDTH 15 #define SHIP_HEIGHT 14 unsigned char ship_sprite[SHIP_WIDTH*SHIP_HEIGHT] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, ... } 然后你就可以用下面的伪代码来画这艘船: int x,y; int xpos,ypos; ... for (y = 0; y SHIP_HEIGHT; y++ ) /* 船的每一行 */ ??? for (x = 0; x SHIP_WIDTH; x++ ) /* 行中的每个像素 */ ??? ??? if (ship_sprite[y*SHIP_HEIGHT+x] != 0) /* 透明否? */ ??? ??????? draw_point(xpos+x,ypos+y,ship_sprite[y*SHIP_HEIGHT+x]); 也就是我们循环处理精灵的每个像素,如果此像素的颜色是不透明的,就画上去。因为检查一个值是否为0比判断其是否为一个特定的非零值要快,所以0经常被用来作为透明色。 但是即使这个方法能不错地完成任务——能画出任意形状的精灵,可以做到不往屏幕外画点,它仍然是一个慢速且糟糕的画精灵的方法。 这个方法的第一个问题是:对每一个你要画的点,你都得去判断它是否透明,如果是就不去画它。这就意味着你要在这里花大量的精力,而这可以通过采用一些好的方法来避免。如果开始的时候采用了一个坏的算法,那么任何一种优秀的语言都帮不了你。 让我们先从理论出发,考虑一下画一个精灵可以多快的理论极限。然后我们可以根据我们所采用的方法得到的结果与此极限的接近程度来判断方法的优劣。 如果我们在画精灵时根本不用去判断任一像素是否透明,那么这种方法是最快的。在这种情况下,我们只需简单地把要画的像素一个接一个地画上去直到停止。你不需为循环和比较作出开销。有一种方法可以允许你做到这一点,称为“编译好的精灵”。 “编译好的精灵”实际上是一段往屏幕上画精灵的程序,就象这样: void draw_spaceship(int x, int y) { ??? /* these commands draw the sprites solid pixels */ ??? draw_point(x+20,y+20,1); ??? draw_point(x+21,y+20,2); ??? draw_point(x

文档评论(0)

xy88118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档