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毫秒