Allegro 简介
- 语言: C 语言 (也提供 C++ 绑定)
- 目标: 简化游戏开发,提供 2D 图形、音频、输入、定时器等核心功能。
- 跨平台: 支持 Windows, macOS, Linux, iOS, Android 等多个平台。
- 开源: 免费使用,社区活跃。
环境搭建
在开始编写代码之前,你需要安装 Allegro 库,这里以 Windows 平台为例,使用 MSVC (Visual Studio) 编译器。

(图片来源网络,侵删)
步骤 1: 安装 Allegro
- 下载: 访问 Allegro 官方网站 的下载页面。
- 选择版本: 下载最新的稳定版,通常会有一个
allegro5-x.x.x-mt.zip这样的文件,mt表示多线程版本,推荐使用。 - 解压: 将下载的 ZIP 文件解压到一个固定的位置,
C:\allegro。
步骤 2: 配置 Visual Studio
这是最关键的一步,你需要告诉 Visual Studio 去哪里找 Allegro 的头文件和库文件。
-
打开 Visual Studio,创建一个新的 C++ 空项目,注意,即使你写 C 语言,在 Visual Studio 中也通常创建 C++ 项目,因为它能更好地处理 C 库的链接。
-
配置项目属性:
- 在 解决方案资源管理器 中,右键点击你的项目,选择 属性。
- 配置: 选择 所有配置,这样 Debug 和 Release 模式都会被设置。
- 平台: 选择 所有平台。
-
设置包含目录:
(图片来源网络,侵删)- 转到 配置属性 -> C/C++ -> 常规 -> 附加包含目录。
- 点击下拉箭头,选择 编辑。
- 添加 Allegro 头文件所在的目录:
C:\allegro\include。
-
设置库目录:
- 转到 配置属性 -> 链接器 -> 常规 -> 附加库目录。
- 点击下拉箭头,选择 编辑。
- 添加 Allegro 库文件所在的目录:
C:\allegro\lib-msvc。
-
链接库文件:
- 转到 配置属性 -> 链接器 -> 输入 -> 附加依赖项。
- 点击下拉箭头,选择 编辑。
- 添加以下库文件:
allegro-5.0.10-monolith-mt.lib注意:你的版本号可能不同,请根据你下载的版本修改。
monolith表示一个包含了所有功能的静态库,非常适合初学者。-mt表示多线程。
-
设置运行时库 (重要!):
- 转到 配置属性 -> C/C++ -> 代码运行时 -> 运行时库。
- 确保它设置为 多线程调试 (/MTd) 或 多线程 (/MT),这必须与你链接的 Allegro 库的版本(
-mt)相匹配,通常选择 多线程调试 (/MTd) 用于 Debug 配置,多线程 (/MT) 用于 Release 配置。
完成以上设置后,你的项目就可以正确编译和链接 Allegro 库了。
Allegro 核心概念与编程流程
一个标准的 Allegro 程序通常遵循以下步骤:
- 初始化: 初始化 Allegro 库的各种模块(如图形、键盘、鼠标等)。
- 创建显示设备: 创建一个窗口(或全屏)来显示图形。
- 创建资源: 加载图片、字体、声音等资源。
- 主循环: 这是游戏的核心,循环中会不断执行以下操作:
- 获取输入: 检测键盘、鼠标等输入。
- 更新游戏状态: 根据输入更新游戏中的变量、角色位置等。
- 绘制: 清空屏幕,然后绘制所有游戏元素(背景、角色、UI等)。
- 刷新: 将绘制的内容显示到屏幕上。
- 清理: 退出循环后,释放所有资源并关闭 Allegro。
第一个 Allegro 程序:一个移动的方块
下面是一个完整的、可运行的 C 语言示例,它会创建一个窗口,并让你用方向键控制一个蓝色方块的移动。
#include <allegro5/allegro.h>
#include <allegro5/allegro_primitives.h> // 用于绘制基本图形
#include <allegro5/allegro_image.h> // 用于加载图片
#include <allegro5/allegro_font.h> // 用于加载字体
#include <allegro5/allegro_ttf.h> // 用于加载 TTF 字体
// 定义一些常量
const int SCREEN_WIDTH = 800;
const int SCREEN_HEIGHT = 600;
int main(int argc, char* argv[]) {
// 1. 初始化 Allegro 的各个模块
if (!al_init()) {
fprintf(stderr, "Failed to initialize Allegro!\n");
return -1;
}
if (!al_init_primitives_addon()) {
fprintf(stderr, "Failed to initialize primitives addon!\n");
return -1;
}
// 安装键盘输入设备
if (!al_install_keyboard()) {
fprintf(stderr, "Failed to install keyboard!\n");
return -1;
}
// 2. 创建显示设备 (窗口)
ALLEGRO_DISPLAY* display = al_create_display(SCREEN_WIDTH, SCREEN_HEIGHT);
if (!display) {
fprintf(stderr, "Failed to create display!\n");
return -1;
}
al_set_window_title(display, "My First Allegro Game");
// 3. 创建资源
// 创建一个事件队列
ALLEGRO_EVENT_QUEUE* event_queue = al_create_event_queue();
if (!event_queue) {
fprintf(stderr, "Failed to create event_queue!\n");
al_destroy_display(display);
return -1;
}
// 将事件源(显示设备和键盘)注册到事件队列
al_register_event_source(event_queue, al_get_display_event_source(display));
al_register_event_source(event_queue, al_get_keyboard_event_source());
// 定义方块的位置和速度
float square_x = SCREEN_WIDTH / 2.0;
float square_y = SCREEN_HEIGHT / 2.0;
const float square_size = 50.0;
const float square_speed = 5.0;
// 4. 主游戏循环
bool redraw = true; // 是否需要重绘
bool done = false; // 游戏是否结束
while (!done) {
ALLEGRO_EVENT event;
al_wait_for_event(event_queue, &event);
// 处理事件
if (event.type == ALLEGRO_EVENT_DISPLAY_CLOSE) {
done = true; // 点击窗口关闭按钮
}
else if (event.type == ALLEGRO_EVENT_KEY_DOWN) {
// 根据按键更新方块位置
switch (event.keyboard.keycode) {
case ALLEGRO_KEY_UP:
square_y -= square_speed;
break;
case ALLEGRO_KEY_DOWN:
square_y += square_speed;
break;
case ALLEGRO_KEY_LEFT:
square_x -= square_speed;
break;
case ALLEGRO_KEY_RIGHT:
square_x += square_speed;
break;
case ALLEGRO_KEY_ESCAPE:
done = true; // 按 ESC 键退出
break;
}
}
// --- 游戏逻辑更新 ---
// 这里可以添加更复杂的游戏逻辑,比如碰撞检测
// --- 绘制 ---
if (redraw && al_is_event_queue_empty(event_queue)) {
// 清空屏幕为黑色
al_clear_to_color(al_map_rgb(0, 0, 0));
// 绘制一个蓝色方块
al_draw_filled_rectangle(
square_x - square_size / 2,
square_y - square_size / 2,
square_x + square_size / 2,
square_y + square_size / 2,
al_map_rgb(0, 0, 255)
);
// 将后台缓冲区的内容显示到屏幕上
al_flip_display();
redraw = false; // 标记为已绘制
}
}
// 5. 清理资源
al_destroy_event_queue(event_queue);
al_destroy_display(display);
return 0;
}
代码解释:
al_init(): 初始化 Allegro 的核心功能。al_init_primitives_addon(): 初始化“图元”插件,用于绘制矩形、圆形等基本图形。al_install_keyboard(): 初始化键盘输入。al_create_display(width, height): 创建一个指定大小的窗口。al_create_event_queue(): 创建一个事件队列,用于管理来自各种设备(如键盘、鼠标、窗口)的事件。al_register_event_source(): 将事件源(如显示窗口、键盘)“注册”到事件队列中,这样,当这些事件发生时,队列就能捕获到。al_wait_for_event(): 程序会在这里暂停,直到队列中有新的事件发生,然后取出事件进行处理。ALLEGRO_EVENT: Allegro 的事件结构体。event.type告诉我们是什么类型的事件(如按键、窗口关闭等)。al_clear_to_color(): 用指定的颜色清空整个屏幕。al_draw_filled_rectangle(): 在屏幕上绘制一个填充的矩形。al_map_rgb(r, g, b): 将 RGB 颜色值转换成 Allegro 可以使用的颜色类型。al_flip_display(): 非常重要! Allegro 使用“双缓冲”技术,所有的绘制操作都在一个“后台缓冲区”中进行,调用此函数会将后台缓冲区的内容一次性“翻转”到前台,显示给用户,这可以有效避免画面闪烁。- *`aldestroy()`**: 在程序结束时,销毁所有创建的资源,释放内存。
Allegro 的主要组件
- 显示:
ALLEGRO_DISPLAY,al_create_display,al_flip_display。 - 图形绘制:
- 图元:
al_draw_rectangle,al_draw_circle,al_draw_line(需要primitives插件)。 - 位图:
ALLEGRO_BITMAP,al_load_bitmap,al_draw_bitmap,用于加载和绘制图片。
- 图元:
- 输入:
- 键盘:
al_install_keyboard,ALLEGRO_EVENT_KEY_DOWN。 - 鼠标:
al_install_mouse,ALLEGRO_EVENT_MOUSE_AXES(移动),ALLEGRO_EVENT_MOUSE_BUTTON_DOWN(点击)。
- 键盘:
- 定时器:
ALLEGRO_TIMER,al_create_timer,al_start_timer,用于创建一个独立的、周期性触发的事件,可以实现与主循环分离的固定帧率。 - 字体:
ALLEGRO_FONT,al_load_font,al_load_ttf_font,al_draw_text,用于在屏幕上显示文本。 - 音频:
al_init_acodec_addon,al_reserve_samples,al_load_sample,al_play_sample,用于播放音效和背景音乐。
学习资源
- 官方文档: Allegro 5 Manual 是最权威的参考资料。
- 教程: Allegro.cc 社区有很多优秀的教程和示例代码。
- 示例代码: Allegro 安装包里通常包含大量的源代码示例,是学习 API 用法的最佳途径。
希望这份指南能帮助你顺利开启 Allegro 游戏开发之旅!从简单的示例开始,逐步尝试添加更多功能,如加载图片、播放声音、实现精灵动画等,很快你就能开发出自己的小游戏了。
