Programming 版 (精华区)

发信人: lansh (沧海一粟), 信区: Programming
标  题: Allegro 游戏程序库 (位图对象)
发信站: 哈工大紫丁香 (2002年09月11日20:04:20 星期三), 站内信件

发信人: cloudwu (云风), 信区: GAME_Designer
标  题: Allegro 游戏程序库 (位图对象)
发信站: BBS 水木清华站 (Sun May 17 09:37:03 1998)

     ______   ___    ___
    /\  _  \ /\_ \  /\_ \
    \ \ \L\ \\//\ \ \//\ \      __     __   _ __   ___
     \ \  __ \ \ \ \  \ \ \   /'__`\ /'_ `\/\`'__\/ __`\
      \ \ \/\ \ \_\ \_ \_\ \_/\  __//\ \L\ \ \ \//\ \L\ \
       \ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/
        \/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/
                                       /\____/
                                       \_/__/        3.0 版
                    一个游戏程序库
               By Shawn Hargreaves, 1994/97
                      云风  译    5/16/1998
                      http://www.nease.net/~cloudwu
                      E-mail: cloudwu@nease.net
========================================
============   位图对象     ============
========================================
一旦你选择了一个图形模式,你就可以经过位图 'screen' 来画些东西显示出来.
所有的 Allegro 图形例程都是向 BITBMP 结构来作画的,
这个结构是一块包含了一个矩形图片的内存, 以
打包字节分配形式 ( 每点 8 位) 储存. 你在系统内存中可以创建和使用位图,
也可以直接写向特别的 'screen' 位图, 这个位图
代表了你的图形卡上的显存.
举个例子, 要向屏幕画一个点,你可以这样写:
   putpixel(screen, x, y, color);
或者使用一个双缓冲实现程序:
   BITMAP *bmp = create_bitmap(320, 200);    // 在系统内存中创建一个位图
   clear(bmp);                               // 将内存位图清空
   putpixel(bmp, x, y, color);               // 画在内存位图上
   blit(bmp, screen, 0, 0, 0, 0, 320, 200);  // 将其复制到屏幕上
见下面来了解如何在一个位图中直接控制图象所在的内存.

Allegro 支持几种不同类型的位图:
   - 屏幕位图, 代表了硬件显存
     最终你必须画在它上面来使得你的图片可以显示.

   - 内存位图, 它存在于系统内存中,可以用来
     储存图象或者作为双缓冲系统的临时作画的位置.
     这些能够由调用 create_bitmap(), load_pcx(), 或是从
     grabber 数据文件里载入而得到.
   - 子位图. 它共享父位图的存储器空间 (父位图可以是
     屏幕, 一个内存位图, 或是另一个子位图), 因此在它们上面作画
     也将同时改变它们的父位图. 它们是任何大小并可以定义在父位图上的任何位置,
     也可以有它们自己的
     剪裁矩形, 因此这是将一个位图分成几个小部分的很有用的途径,
     比如, 将一个大的虚拟屏幕分割成两个部分来
     实现页切换 (见 examples/ex9.c).
extern BITMAP *screen;
   一个位图的全局指针, 大小为 VIRTUAL_W x VIRTUAL_H. 这个由
   set_gfx_mode() 创建, 映射到硬件显存上. 只有一部分
   大小为 SCREEN_W x SCREEN_H 的位图被显示.
   通常这个部分在大的虚拟屏幕的左上角, 因此你如果没有兴趣去做
   硬件滚屏或页切换时可以忽略虚拟屏幕的不可显部分.
   要移动显示窗口到
   屏幕位图的其它部分, 调用 scroll_screen().
   初试化时剪裁矩形将限制在物理屏幕的大小,
   因此如果你想在大的虚拟屏幕上超出这个矩形的部分作画,
   则需要调整剪裁空间.
BITMAP *create_bitmap(int width, int height);
   创建一个大小为 width x height 的内存位图, 并且返回指向它的指针.
   这个位图将打开剪裁功能, 剪裁矩形
   被设置为整个位图. 图象内存不会为你清空,
   因此上面可能有写垃圾: 你必须在使用前清空位图.
   这个例程总是使用全局的点格式, 由
   调用 set_color_depth() 来指定.
BITMAP *create_bitmap_ex(int color_depth, int width, int height);
   以指定的颜色深度(8, 15, 16, 24 或 32位每点)来创建位图.

BITMAP *create_sub_bitmap(BITMAP *parent, int x, y, width, height);
   创建一个子位图. 即,让一个位图共享另一个
   已经存在的位图的空间, 但是可能有不同的大小和剪裁设定.
   当在 mode-X 屏幕上创建子位图时, x 坐标必须是
   4 的倍数. 子位图的宽度和高度可以扩展到
   父位图的右边界和下边界以外 (它们将被剪裁掉),
   但是起点必须在父位图的区域.
void destroy_bitmap(BITMAP *bitmap);
   当你使用完一个内存位图或子位图后销毁它.
int bitmap_color_depth(BITMAP *bmp);
   返回指定位图的颜色深度 (8, 15, 16, 24, 或 32).
int bitmap_mask_color(BITMAP *bmp);
   返回指定位图的掩色 (这个色彩值将在画精灵时被忽略).
   在 256 色位图里是零,
   在真彩位图里是亮粉红 (bright pink).
int is_same_bitmap(BITMAP *bmp1, BITMAP *bmp2);
   如果两个位图描述了同样一个绘图表面将返回 TRUE, 即,
   指针相等, 或一个是另一个的子位图, 或 它们是
   同一位图的子位图.
int is_linear_bitmap(BITMAP *bmp);
   当位图是线形位图时返回 TRUE. 即,是一内存位图, 或 13h 模式的屏幕,
   或 SVGA 屏幕. 线形位图可以被 _putpixel(),
   _getpixel(), bmp_write_line(), 和 bmp_read_line() 函数使用.
int is_planar_bitmap(BITMAP *bmp);
   当位图是分屏 (planar) (mode-X 或 Xtended 模式) 屏幕位图时返回 TRUE.
int is_memory_bitmap(BITMAP *bmp);
   当位图是内存位图时返回 TRUE, 即, 它是由调用
   create_bitmap() 创建或从 grabber 数据文件或 PCX 文件里载入的.
   内存位图可以经位图结构中的行指针来直接控制,
   比如: bmp->line[y][x] = color.
int is_screen_bitmap(BITMAP *bmp);
   如果位图是屏幕位图或是屏幕位图的子位图时返回 TRUE.
int is_sub_bitmap(BITMAP *bmp);
   如果位图是子位图则返回 TRUE.
void set_clip(BITMAP *bitmap, int x1, int y1, int x2, int y2);
   每个位图有一个伴随的剪裁矩形, 它是一个
   能够将图画上去的区域. 在这块空间以外, 什么也画不上去.
   参数为剪裁矩形的两个角的坐标:
   这些点被包括在内. 比如 set_clip(bitmap, 16, 16, 32, 32) 将
   允许画到 (16, 16) 和 (32, 32) 上, 但是不能画到 (15, 15) 和 (33, 33).
   如果 x1, y1, x2, 和 y2 都为零, 剪裁就关掉了,
   这可以轻微的提高一些绘图操作 (通常只有微不足道的
   区别, 然而有点帮助) 但是后果是当你试图
   向位图以外的空间作画时, 你的程序会狠惨的死掉.

--
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)
页面执行时间:3.474毫秒