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);我试过了,没有出现重复释放。