`
javababy1
  • 浏览: 1169370 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Allegro学习笔记三

阅读更多

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();// 响应键盘事件的,这个例子没有太多的应用,只是告诉程序如果有键按下了,就退出。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics