Allegro学习笔记二十一

PS:18 exUnicode,工作无关,19exbitmap运行不了,而20exscale过于简单,只是blit类函数的简单应用,所以暂时没有笔记18/19/20。

PS2:我现在已经觉得学习Allegro的速度已经快了不值一倍~你觉得呢?

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

Shawn Hargreaves,allegro的作者

目录: 1 Allegro 例子

1.1 exhello
1.2 exmem
1.3 expat
1.4 expal
1.5 exflame
1.6 exbuf
1.7 exflip
1.8 exfixed
1.9 exfont
1.10exmouse
1.11extimer
1.12exkeys
1.16exgui
1.17excustoms
1.21exconfig

/*
 *    Example program for the Allegro library, by Lennart Steinke.
 *
 *    这是一个非常简单的例子,演示了如何使用Allegro配置文件(.ini).
 *    看上去它只是显示了一张静态图像和等待一个键被按下.
 *    不过这张图片是通过手动读取自定义的exconfig.ini文件来显示的.
 *    这个示例从此文件里获得了一些变量,比如全屏/窗口模式,一种指定
 *    的图像显示模式,哪个图像将被用于显示,以何种方式绘制到屏幕等.
 */


#include <allegro.h>


int main(void)
{
   int w,h,bpp;
   int windowed;
   int count;
   char **data;

   char *title;
   char *filename;
   int  r,g,b;

   BITMAP *background;
   int     display;
   RGB     pal[256];

   int    x, y;

   /* you should always do this at the start of Allegro programs */
   if (allegro_init() != 0)
      return 1;
   /* set up the keyboard handler */
   install_keyboard();

   /* 保存当前的ini文件,再设置指定的文件 */
   push_config_state();
   set_config_file("exconfig.ini");

   /* gfx模式按照以下方式被储存:
    *    640  480 16
    * 使用get_config_argv(),将使用一个char*来记录,并
    * 将char*的内容转换成int[]数组。(空格为分隔符)
    */
   data = get_config_argv("graphics", "mode", &count);
   if (count != 3) {
      /* 我们只期望3个变量 */
      allegro_message("Found %i parameters in graphics.mode instead of "
        "the 3 expected./n", count);
      w = 320;
      h = 200;
      bpp = 8;
   }
   else {
      w = atoi(data[0]);
      h = atoi(data[1]);
      bpp = atoi(data[2]);      
   }

   /* 我们应该使用窗口模式吗
    * 在配置文件里,这个项将记录为TRUE或FALSE.
    * 因此我们需要读取这个项来看看到底是哪个.
    * 如果该入口(记录)没找到,就以FALSE为默认值
    */
   if (ustricmp(get_config_string("graphics", "windowed", "FALSE"), "FALSE") == 0)
      windowed = GFX_AUTODETECT_FULLSCREEN;
   else
      windowed = GFX_AUTODETECT_WINDOWED;

   /* 标题使用的文字
    * 这个返回的字符串将储存在config system里
    * 并且如果我们调用pop_config_state()它就会丢失,
    * 因此我们创建一个它的副本.
    */
   title = ustrdup(get_config_string("content", "headline", "<no headline>"));

   /* 标题的颜色
    * once again this is stored as three ints in one line
    */
   data = get_config_argv("content", "headercolor", &count);
   if (count != 3) {
      /* We expect only 3 parameters */
      allegro_message("Found %i parameters in content.headercolor "
        "instead of the 3 expected./n", count);
      r = g = b = 255;
   }
   else {
      r = atoi(data[0]);
      g = atoi(data[1]);
      b = atoi(data[2]);      
   }

   /* 读取图像文件
    * The string returned is stored inside of the config system
    * and would be lost if we call pop_config_state(), so we create
    * a copy of it.
    */  
   filename = ustrdup(get_config_string("content", "image", "mysha.pcx"));

   /* 还有就是图像的显示模式(拉伸/居中/平铺) */
   display = get_config_int("content", "display", 0);
   if (display <0 || display > 2) {
      allegro_message("content.display must be within 0..2/n");
      display = 0;
   }

   /* restore the old config file */
   pop_config_state();


   /* set the graphics mode */
   set_color_depth(bpp);
   if (set_gfx_mode(windowed, w, h, 0, 0) != 0) {
      allegro_message("Unable to set mode %ix%i with %ibpp/n", w, h, bpp);
      free(filename);
      free(title);
      exit(-1);          
   }        

   /* Clear the screen */
   clear_bitmap(screen);  

   /* load the image */
   background = load_bitmap(filename, pal);
   if (background != NULL) {
      set_palette(pal);

      switch (display) {

  case 0: /* stretch */
     stretch_blit(background, screen, 0, 0, background->w,
    background->h, 0, 0, SCREEN_W, SCREEN_H);
  break;

  case 1: /* center */
     blit(background, screen, 0, 0, (SCREEN_W - background->w)/2,
   (SCREEN_H - background->h)/2, background->w, background->h);
  break;

  case 2: /* tile */
     for (y = 0; y < SCREEN_H; y += background->h)
        for (x = 0; x < SCREEN_W; x += background->w)
    blit(background, screen, 0, 0, x, y,
         background->w, background->h);
         break;
      }
   }
   else {
      textprintf_centre_ex(screen, font, SCREEN_W/2, SCREEN_H/2,
      makecol(r,g,b), -1, "%s not found", filename);
   }

   textout_centre_ex(screen, font, title, SCREEN_W/2, 20, makecol(r,g,b), -1);

   readkey();

   free(filename);
   free(title);

   return 0;
}
END_OF_MAIN()
-------------------------------------------------------------------------------
小结21:
1、push_config_state();
将当前的设置状态(文件名,变量值,等)压入一个内部栈,使你可以选择其它的设置, 然后可以调用pop_config_state() 来恢复当前的设置. 这个函数是被设计成其它 库函数内部使用的, 比如当你为save_joystick_data() 指定一个设置文件名, 它在切换到你指定的文件前就将设置状态压栈.[摘录3.1,风云翻译](事实上4.2.2里也是这个意思)
在这个例子里,因为之前没有config信息,所以其实不调用此函数也没关系。

2、set_config_file("exconfig.ini");
载入指定的配置文件。

3、data = get_config_argv("graphics", "mode", &count);
这里有些技巧存在,左边的data:char** data,它是一个指向char*的指针,或者写成char* data[]更好理解,但是data[]需要指定数组长度,而使用char**就没这个烦恼,通过data[i]来访问特定的数据。[]操作实际上是(*) + i是一个首地址偏移操作;右边是读取配置("段名","变量名",&储存变量个数的变量)。

4、atoi();
Allegro的字符串转换函数,可以看帮助手册。

5、get_config_string("graphics", "windowed", "FALSE");
段名,变量名,默认字符串


6、config system,这是一块Allegro自己开辟的内存,用来存放读入的*.ini文件的信息,并且这块地方被全部ini文件所共用,因此必须自己创建变量,把需要保存的信息保存起来。

7、get_config_int("content", "display", 0);
段名,变量名,默认值

8、stretch_blit();
blit相关,也是21exscale的主要知识点,可以查看帮助手册。21的另外一个知识点是AL_RAND(),它封装了各种平台的rand()以实现跨平台的应用,所以把它看做一个普通的rand()就可以了。

9、所有的*变量都应该free,不是吗?所以在这个例子里Lennart Steinke没有释放位图~虽然会自动释放,但手动做这个事会更踏实。destroy_bitmap(background);我试过了,没有出现重复释放。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值