Allegro学习笔记四

来源:互联网 发布:usb端口无法识别 编辑:程序博客网 时间:2024/05/28 05:16

 

http://wiki.allegro.cc/AllegroExamples 以上是英文例子站点。

by Shawn Hargreaves,allegro的作者

目录: 1 Allegro 例子

1.1 exhello
1.2 exmem
1.3 expat
1.4 expal

这个例子展示了如何使用“模板绘制”与“子位图”的技巧


#include <allegro.h>

void draw_pattern(BITMAP *bitmap, char *message, int color)
{
   BITMAP *pattern;

   acquire_bitmap(bitmap);

   /* 创建一个模板位图 */
   pattern = create_bitmap(text_length(font, message), text_height(font));
   clear_to_color(pattern, bitmap_mask_color(pattern));
   textout_ex(pattern, font, message, 0, 0, palette_color[255], bitmap_mask_color(screen));

   /* 用模板位图去覆盖(就象打补丁) */
   drawing_mode(DRAW_MODE_MASKED_PATTERN, pattern, 0, 0);
   rectfill(bitmap, 0, 0, bitmap->w, bitmap->h, palette_color[color]);
   solid_mode();

   /* 永远都不要忘了释放 */
   destroy_bitmap(pattern);

   release_bitmap(bitmap);
}

 

int main(void)
{
   BITMAP *bitmap;

   if (allegro_init() != 0)
      return 1;
   install_keyboard();

   if (set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 0) != 0) {
      if (set_gfx_mode(GFX_SAFE, 320, 200, 0, 0) != 0) {
  set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
  allegro_message("Unable to set any graphic mode/n%s/n", allegro_error);
  return 1;
      }
   }

   set_palette(desktop_palette);
   clear_to_color(screen, makecol(255, 255, 255));

   /* 首先用模板位图来覆盖整个屏幕 */
   draw_pattern(screen, "<screen>", 255);

   /* 然后用模板位图来覆盖一个内存位图,并且用blits()将它显示到屏幕上 */
   bitmap = create_bitmap(128, 32);
   clear_to_color(bitmap, makecol(255, 255, 255));
   draw_pattern(bitmap, "<memory>", 1);
   masked_blit(bitmap, screen, 0, 0, 32, 32, 128, 32);
   destroy_bitmap(bitmap);

   /* 或者,我们可以使用子位图达到同样的效果. 
    * 子位图指向的内存区域实际上其所属的父位图指向的内存区域的子集,
    * 所以在子位图上的改动将直接反映到屏幕上,而不需要使用bilts()
    */
   bitmap = create_sub_bitmap(screen, 224, 64, 64, 128);
   rectfill(screen, 224, 64, 286, 192, makecol(255, 255, 255));
   draw_pattern(bitmap, "<subbmp>", 4);
   destroy_bitmap(bitmap);

   readkey();
   return 0;
}

END_OF_MAIN()

 --------------------------------------------------------------------------------------------------------------------------------------------------

小结四:

1、drawing_mode(DRAW_MODE_MASKED_PATTERN, pattern, 0, 0);
以下需要一点计算机图形的专业知识,如果暂时没心情看全部,可以只看需要的部分。
void drawing_mode(int mode, BITMAP *pattern, int x_anchor, int y_anchor);
设置图形作图模式. 这只针对几何例程有效, 就是像 putpixel, lines, rectangles, circles, polygons, floodfill, 等等, 对文字输出, blit, 或精灵作图函数无效. 这个模式必须 是以下值中的一个:

 

     DRAW_MODE_SOLID               - 缺省值, 实心颜色填充      DRAW_MODE_XOR                 - 异或作图      DRAW_MODE_COPY_PATTERN        - 多色彩模式填充      DRAW_MODE_SOLID_PATTERN       - 单色模式填充      DRAW_MODE_MASKED_PATTERN      - 掩式模式填充      DRAW_MODE_TRANS               - 透明色混合

 

在 DRAW_MODE_XOR 里, 画向位图的点将经过异或运算 而不是简单的复制, 因此在同一位置画第二次将删除上次的. 因为它涉及到即读又写位图存储器, xor 作图比普通的覆盖模式要慢的多.

在模版模式模式下, 你需要提供一个模版位图它将被平铺在 图形表面上. Allegro 储存这个位图的指针 而不是复制它, 因此你必须在它还在做模版用途的过程中不要撤销位图. 模版的宽和高必须是 2 的次方数, 但可以相互不同, 例如, 可以是一个 64x16 的模版, 但不能是 17x3 的. 模版平铺开始于点 (x_anchor, y_anchor) 处的栅格里. 通常你应该将传入值置为零, 这让你可以画临近的图形而使得模版 精确的沿着共享边界碰在一起. 然而,零对齐在你在整个屏幕内移动模版图形使 看起来很奇特, 这是因为 图形将移动但模版对齐不会, 因此在一些 情况下你可能希望改变 anchor 位置.

当你选择 DRAW_MODE_COPY_PATTERN, 点将简单的从模版位图复制到 目标位图. 这个允许你使用 多色彩的模版, 就是说你传入绘图例程的颜色将被忽略掉. 这是最快的模版模式.

在 DRAW_MODE_SOLID_PATTERN 模式下, 模版位图里的每个点将和 掩色比较, 就是指的 256 色模式下的零或 真彩数据里的亮粉红 (红蓝值最大, 绿值为零). 如果模版点是实心的, 你传给绘图例程的点颜色将 写到目标位图上, 否则将写上零. 模版将被看作是单色位掩图, 它允许你使用一些 模版去以不同的颜色去画不同的图形, 但是要防止使用 多重色彩模版.

DRAW_MODE_MASKED_PATTERN 几乎完全和 DRAW_MODE_SOLID_PATTERN 一样, 但是被掩盖的点被忽略了而不是被写为零, 因此 背景色会透过缺口显示出来. (其实就是指定透明色,象现代动画的制作方法一样。)

在 DRAW_MODE_TRANS 模式下, 全局 color_map 表或真彩混合 函数被用来最上层存在的图片上的点. 这 必须仅在你已经设置了掩色映射表 (256 色模式) 或混合映射表 (真彩模式) 后才能使用. 因为它涉及到了 读写位图内存, 半透明作图在你 直接写向显存时很慢, 因此无论什么情况你都应当 使用内存位图来替代.

2、rectfill(); // 又一个基本绘图函数

3、solid_mode();
void solid_mode();
这是选择实心作图模式的快捷方式. 它等于 调用 drawing_mode(DRAW_MODE_SOLID, NULL, 0, 0);

4、masked_blit(bitmap, screen, 0, 0, 32, 32, 128, 32);
带透明色的blit()。

5、bitmap = create_sub_bitmap(screen, 224, 64, 64, 128); // 创建子位图。

--------------------------------------------------------------------------------------------------------------------------------------------------

使用allegro的公式:
1、allegro_init();   // 必须的
2、install_keyboard(); // 初始化
      install_mouse();


3、set_gfx_mode(标志量,屏幕宽,屏幕高,0,0); // 设置显示模式
4、set_palette(black_palette); // 设置调色板


5、绘制(直接写屏、文字输出、新建位图,位图拷贝,鼠标显示,模板,子位图);


6、响应用户输入事件(主循环)

readkey();
keypress();


7、END_OF_MAIN // 必须的

 

原创粉丝点击