Programming 版 (精华区)
发信人: lansh (沧海一粟), 信区: Programming
标 题: Allegro 游戏程序库 (块复制和精灵)
发信站: 哈工大紫丁香 (2002年09月11日20:08:08 星期三), 站内信件
发信人: cloudwu (云风), 信区: GAME_Designer
标 题: Allegro 游戏程序库 (块复制和精灵)
发信站: BBS 水木清华站 (Sat May 23 10:36:46 1998)
______ ___ ___
/\ _ \ /\_ \ /\_ \
\ \ \L\ \\//\ \ \//\ \ __ __ _ __ ___
\ \ __ \ \ \ \ \ \ \ /'__`\ /'_ `\/\`'__\/ __`\
\ \ \/\ \ \_\ \_ \_\ \_/\ __//\ \L\ \ \ \//\ \L\ \
\ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/
\/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/
/\____/
\_/__/ 3.0 版
一个游戏程序库
By Shawn Hargreaves, 1994/97
云风 译
http://www.nease.net/~cloudwu
E-mail:cloudwu@nease.net
==============================================
========== 块复制(Blitting) 和精灵 ===========
==============================================
所有的这些例程都将被目标位图的剪裁矩形所影响.
void clear(bitmap);
将位图全部清为颜色 0.
void clear_to_color(BITMAP *bitmap, int color);
用指定的颜色清位图.
void blit(BITMAP *source, BITMAP *dest, int source_x, int source_y,
int dest_x, int dest_y, int width, int height);
从源位图复制一个矩形区域到目标位图.
参数 source_x 和 source_y 是将复制的源位图上的部分的左上角,
dest_x 和 dest_y 是
目标位图上的坐标. 这个例程将考虑
目标位图的剪裁矩形, 如果你试图复制一个源位图外的区域同样也将做剪裁处理.
你可以在任两个位图间复制, 甚至是两个重叠的内存位图
(即, 来源和目标是相同的, 或者一个是另一个的子位图).
然而,你应当注意的是,许多 SVGA 卡不提供
分开的读写窗, 这就是说从屏幕的一个部分复制到另一部分时
需要使用一个在内存里的临时位图,
这样将极其的慢. 因此一个普遍的规则是
你应当避免在 SVGA 模式下的屏幕本身的复制.
另一方面,在 mode-X 下, 从屏幕的一个部分复制到另一部分
可以比从内存到屏幕的复制出奇的快,
只要源部分和目标部分正确的对齐.
在重叠的屏幕矩形间复制很慢,但是如果
区域不重叠, 而且它们有相同的面位置(plane alignment) (即:
(source_x%4) == (dest_x%4)), VGA 门锁(latch)寄存器可以被用来做
很快的数据传输. 为了得到这个优势, 在 mode-X 下经常值得在
显存的隐藏区域储存砖块图片(使用一个大的
虚拟屏幕), 然后再将它们复制到可显的屏幕上.
不象所有的图形例程, blit() 允许源位图和目标
位图有不同的颜色深度, 所以它可以被用来
在两种点格式之间转换.
void masked_blit(BITMAP *source, BITMAP *dest, int source_x, int source_y,
int dest_x, int dest_y, int width, int height);
象 blit() 那样, 但是忽略透明点 ( 在 256 色模式下是 0,
真彩数据里是亮点). 源图片必须是内存位图或它的子位图,
并且源图和目标图区域绝对不能重叠.
void stretch_blit(BITMAP *source, BITMAP *dest,
int source_x, source_y, source_width, source_height,
int dest_x, dest_y, dest_width, dest_height);
象 blit() 那样, 不过它还可以调整图片的比例因此源图和目标图
可以有不同的大小.这个例程没有象常规的复制
那样做常规的安全检查: 你必须特别小心
不要复制源图以外的区域, 而且你不能
在重叠区域间复制, 即你必须将源图和目标图使用不同的位图.
同样, 源图必须是内存位图或它的子位图,
不能是硬件屏幕.
void draw_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y);
画一个精灵位图到目标位图的
指定位置.这完全和 blit(sprite, bmp, 0, 0, x,
y, sprite->w, sprite->h) 相同, 但是它使用了掩式绘图模式, 透明
点 ( 256 色下的 0, 真彩下的亮点) 被忽略,
因此背景图片将透过精灵被显示.
精灵必须是一个内存位图, 而不是个屏幕位图或其子位图.
目标位图可以是任何位图.
然而它通常不支持混合颜色深度,
一个特例是这个函数可以将 256 色源图画到
真彩位图上,因此你可以在真彩程序里对指定的精灵使用调色板效果.
void draw_sprite_v_flip(BITMAP *bmp, BITMAP *sprite, int x, int y);
void draw_sprite_h_flip(BITMAP *bmp, BITMAP *sprite, int x, int y);
void draw_sprite_vh_flip(BITMAP *bmp, BITMAP *sprite, int x, int y);
这些象 draw_sprite(), 但是它们翻折图片,可以是纵向的,
横向的, 对角线的轴变换. 这个产生了精确的镜像图片, 但它和
旋转精灵不同 (它比旋转例程要快的多).
精灵必须是内存位图.
void draw_trans_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y);
使用一个全局 视成 表或真彩色混合函数来将一个
精灵覆盖在存在的图片上面. 这个必须在你
已经设置了颜色映射表 ( 256 色模式) 或混合映射表
(真彩模式) 后才能使用. 因为它在写图时还牵扯了读操作,
如果你直接向显存画半透明效果,将非常的慢,
因此无论何地有可能的话你都应当使用内存位图来代替屏幕位图.
void draw_lit_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, int color);
使用全局 视成 表向指定色彩或亮度级过度精灵图片,
将算出的图片画到目标位图上.
这个必须在你设置了颜色映射表
(256 色模式) 或 混合映射表(真彩模式) 后才能使用.
void draw_character(BITMAP *bmp, BITMAP *sprite, int x, int y, int color);
将精灵位图画在位图的指定
位置上, 将透明点 ( 256 色模式下的 0, 真彩模式下的亮点)
以当前的文本模式画它们 (如果文字模式是 -1 则忽略它们,
否则以文本背景色画它们),
并且将所有其它的点设置为指定的颜色.
精灵必须是 8 位图片, 即使目标位图是真彩的也不例外.
void rotate_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, fixed angle);
旋转位图一个指定的角度,将它画在位图的指定位置.
角度是一个 16.16 的定点数. 这个定点数和
定点数三角例程中的一样, 256 等于
整圈, 64 是直角, 等等. 精灵必须是内存位图.
void rotate_scaled_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y,
fixed angle, fixed scale);
象 rotate_sprite() 相同, 但是在旋转的同时还做拉扯或压缩的操作.
void stretch_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, int w, int h);
将精灵图片画在位图的指定位置,
拉扯它到指定的宽度和高度.
stretch_sprite() 和 stretch_blit() 的不同之处在于 stretch_sprite() 去掉
了透明点 ( 256 色模式下的 0, 真彩模式下的亮点).
--
http://www.nease.net/~cloudwu
http://computer.igd.edu.cn/~cloud
E-mail: cloudwu@163.net
--
人生得意需尽欢,莫使金樽空对月。
天生我才必有用,千金散尽还复来。
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: hitsat.hit.edu.cn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.298毫秒