Allegro学习笔记三

来源:互联网 发布:如何提高编程水平 编辑:程序博客网 时间:2024/05/16 00:43

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

by Shawn Hargreaves,allegro的作者

目录: 1 Allegro 例子

1.1 exhello
1.2 exmem 
1.3 expal

这个例子将展示如何巧妙使用调色板的高级技巧
它将在屏幕上绘制一系列同心圆,并通过渐变调色板来使它们栩栩如生

int main(void)
{
   PALETTE palette;
   RGB temp;
   int c;

   if (allegro_init() != 0)
      return 1;
   install_keyboard();
   if (set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 0) != 0) {
      if (set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0) != 0) {
  allegro_message("Error setting graphics mode/n%s/n", allegro_error);
  return 1;
      }
   }

   /* 用全黑的调色板初始化 */
   set_palette(black_palette);

   /* 在屏幕上绘制同心圆 */
   acquire_screen();

   for (c=255; c>0; c--)
      circlefill(screen, SCREEN_W/2, SCREEN_H/2, c, c);

   release_screen();

   install_mouse();
   show_mouse(screen);

   /* 使用渐变色来填充调色板 */
  /* 这里最好手动计算出RGB的值,并找个调色板程序自己看一下这些颜色的排列 */
   for (c=0; c<64; c++) {
      palette[c].r = c;
      palette[c].g = 0;
      palette[c].b = 0;
   }
   for (c=64; c<128; c++) {
      palette[c].r = 127-c;
      palette[c].g = c-64;
      palette[c].b = 0;
   }
   for (c=128; c<192; c++) {
      palette[c].r = 0;
      palette[c].g = 191-c;
      palette[c].b = c-128;
   }
   for (c=192; c<256; c++) {
      palette[c].r = 0;
      palette[c].g = 0;
      palette[c].b = 255-c;
   }

   /* [旋转]调色板来使画面生动 */
   while (!keypressed()) {
      temp = palette[255];
      for (c=255; c>0; c--)
  palette[c] = palette[c-1];
      palette[0] = temp;
      set_palette(palette);
   }

   return 0;
}

END_OF_MAIN()

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

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


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


5、绘制(直接写屏、文字输出、新建位图,位图拷贝);
      show_mouse(screen);


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

readkey();
keypress();


7、END_OF_MAIN // 必须的

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

小结三:

1、allegro_message("Error setting graphics mode/n%s/n", allegro_error); // allegro的messagebox;

2、circlefill(screen, SCREEN_W/2, SCREEN_H/2, c, c);
void circlefill(BITMAP *bmp, int x, int y, int radius, int color);
以指定的中心、半径、和颜色填充一个圆。
因此必须从大圆开始填充,否则小圆会被更大的圆覆盖。

3、install_mouse(); 
       初始化鼠标的位置很特别,事实上可以在install_keyboard();的位置初始化,
但是: 如果你在鼠标可见时向 屏幕画任何东西, 鼠标移动中断可能发生在你绘画的过程中.
如果这发生在鼠标 缓冲刷新和 SVGA 页面切换时将造成混乱,是满屏留下 '鼠标拖动轨迹
(mouse droppings)'为了避免这些,你必须在向屏幕作画时确认关掉的鼠标显示.

4、show_mouse(screen);
告诉 Allegro 在屏幕上显示鼠标.这只在时钟模块加载了才工作.鼠标将被画在 指定的位图(bitmap)上, 这个位图通常是 'screen' (屏幕) (见后面有关位图的 信息). 调用 show_mouse(NULL) 可以隐藏鼠标.
调用scare_mouse();
与 unscare_mouse();可以达到同样的效果。
但是scare_mouse();只是记录当前鼠标的状态并隐藏鼠标
unscare_mouse()只是取消scare_mouse()
所以如果在show_mouse(NULL)之后调用它们,仍然看不见鼠标的

5、keypressed();// 响应键盘事件的,这个例子没有太多的应用,只是告诉程序如果有键按下了,就退出。


原创粉丝点击