用C++实现跨平台游戏开发之Allegro引擎-VC/MFC教程-第二电脑网

  第二电脑网导读:古老的Atari ST平台上,随后被快速地移植到流行的DJGPP环境(一个在九十年代早期流行的32位的MS-DOS扩展程序)。此后,Allegro被移植到最为流行的Windows C++开发环境中,包括VS,MinGW,Cygwin和Borland C++。另外的支持它的平台包括Linux,BeOS,QNX,Mac OSX以及几乎任何其它带有X11库的Unix平台上。  Allegro能着色到各种类型的位图和硬件加速的环境中,例如DirectX,XWind...
  正文:

  提要:本文重点讨论开源游戏开发库Allegro(Allegro低级游戏例程),同时涉及到一些深度技术并提供了一个简单的示例程序,帮你进一步确定它是否是适合你的开发平台。

  一、 一个适于多环境的引擎

  Allegro最开始被研发于八十年代后期古老的Atari ST平台上,随后被快速地移植到流行的DJGPP环境(一个在九十年代早期流行的32位的MS-DOS扩展程序)。此后,Allegro被移植到最为流行的Windows C++开发环境中,包括VS,MinGW,Cygwin和Borland C++。另外的支持它的平台包括Linux,BeOS,QNX,Mac OSX以及几乎任何其它带有X11库的Unix平台上。

  Allegro能着色到各种类型的位图和硬件加速的环境中,例如DirectX,XWindows,SVGAlib,FreeBE/AF,CGDirectDisplay,QuickDraw,等等。Allegro并不想提供它自己的3D环境或模拟器,但是OpenGL可以被容易地集成,这是通过使用AllegroGL库-它提供了一个类似于GLUT的接口(包括扩展管理)-实现的。

  二、 性能概要

  在进一步使用API开发前,让我们看一下Allegro提供的总体功能:

  ·具体到像素级的绘图函数,包括平坦阴影,gouraud阴影,纹理贴图,z缓冲的多边形和圆绘制,填充,贝塞尔样条曲线,图案填充,精灵,blitting(位图复制),位图计算缩放和旋转,半透明/光效果以及比例字体支持的文本输出

  ·FLI/FLC(在生成的动画方面,这种格式比MPEG有更高的压缩性能)动画播放器

  ·播放后台MIDI音乐,可达64种同时的声音效果,并能录制样本波形和MIDI输入(声音平台支持,包括WaveOut,DirectSound,OSS,ESD,CoreAudio和QuickTime,等等)

  ·容易地存取,,游戏杆等设备,还支持高分辨率定时器中断,包括一个DOS版本的垂直折回中断模拟器

  ·读/写LZSS压缩文件的例程

  ·数学函数,包括定点算术,表查找和3D矢量/矩阵/四元数操作

  ·GUI对话框管理器和文件选择器

  ·内建地支持16位和UTF-8格式的Unicode字符

  三、 使用引擎

  使用Allegro进行开发,就象在许多其它游戏场合下一样,游戏的总体结构都包括游戏开始前的初始化,游戏循环以及游戏完成后的清理。初始化意味着既包含Allegro启动也包含在开始的位置实现基础地装载或生成你的游戏级别。在创建你的初始化代码时,启动Allegro基础上没有什么代价付出(见图1).

  如果你需要很多屏幕相关的真实性能,建议你首先礼貌地用get_gfx_mode_list()函数查询一下{zd0}可用方式:


  set_gfx_mode()的{zh1}两个参数用于指定虚拟缓冲区的大小-我们的图形屏幕存储于其中。这可以使创建一个卷边游戏-其中地形是连续移动的-变得容易。例如,你可能要使虚拟缓冲区,比方说,宽出20%以留出足够的空间来平滑卷动新的精灵和地形。

  四、 一个完整的Allegro实例

  本教程将使用Kee-Yip Chan的SnookerClone演示程序,它是基于James Lohr的另一个具有相同名字的演示程序。图1显示了演示程序的基础屏幕快照。


  这个工程向你展示了许多不同的Allegro技术,包括动画,键盘输入和鼠标输入,碰撞和游戏物理知识(例如重力)。它利用了三个主要的元素:一个有8个扶手的旋转的车轮,一个用箭头键来控制的大红球,还有一些从顶部往下坠落的蓝球。车轮以接触方式推动红球,而当红球碰上蓝球时,它们之间相互影响。

  下列是完整的Allegro演示程序的代码:


来源:

1 #include <allegro.h>
2 vector<Point> g_points; //aka球上点的列表
3 vector<Joint> g_joints; //物理对象列表,如车轮和缓冲器
4 kVec g_accControl;
6 int main(void)
7 {
8  allegro_init(); // 初始化allegro.
9  install_keyboard(); // 启动键盘.
10 install_mouse(); // 启动鼠标.
11 install_timer(); //过程show_mouse()所需要;
13 // 创建一个800x600的非全屏窗口.
14 set_gfx_mode(GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0);
16 set_window_title("Kee-Yip Chan’s Snooker Clone");
17 text_mode(-1); // 文本将被画在透明的背景之上
19 BITMAP* buffer = create_bitmap(SCREEN_W, SCREEN_H);
  //创建一张位图用于双缓冲.
21  // 初始化数据.
22 create_joints(g_joints); //注册车轮、地板和缓冲器的硬编码的屏幕位置
25 // 创建顶点以组成aka球: 玩家所用球和三个蓝球
26 // 的位置, 速度, 大小和质量.
27 g_points.push_back(Point(kVec(100, 300),kVec(0, 0),16, 10));
// 玩家.
28 g_points.push_back(Point(kVec(50, 40), kVec(0, 0),12, 5));
// 中等的球.
29 g_points.push_back(Point(kVec(80, 40), kVec(0, 0) 12, 5));
//中等的球.
30 g_points.push_back(Point(kVec(110, 40),kVec(0, 0),6, 1));
// 小球.
32 //主循环,在按ESC键后退出
33 while(!key[KEY_ESC]) { //检查输入.
34  if(key[KEY_UP])
35   g_accControl.y = -0.07; //Jet pack.向上加速
36  if(key[KEY_LEFT])
37   g_accControl.x = -0.07; //左走.向左加速
38  if(key[KEY_RIGHT])
39   g_accControl.x = 0.07; //右走.向右加速
41   static bool leftMousePressed = false,
    rightMousePressed = false;
42  if(mouse_b & 1) { //鼠标左键按下
43   if(!leftMousePressed){
44    leftMousePressed = true; // 创建一个新球.
45    g_points.push_back(Point(kVec(mouse_x, mouse_y),kVec(0, 0), 12, 5));
46   }
47  }
48  if(!(mouse_b & 1))
49  //保证不重复鼠标按键
50  //否则,就会出现许多的新球
51  leftMousePressed = false;
52  if(mouse_b & 2) { //鼠标右键按下
53   if(!rightMousePressed){
54    rightMousePressed = true; // 创建一个新球
55    g_points.push_back(Point(kVec(mouse_x, mouse_y),kVec(0, 0), 6, 1));
56   }
57  }
58  if(!(mouse_b & 2))
59   //保证不重复鼠标按键
60   //否则,就会出现许多的新球.
61   rightMousePressed = false;
63   doPhysics();
65   // 着色:如果我们能再次使用缓冲区,则xx它;
    //否则,旧图像将滞留显示
66   //用白色进行xx.
67   clear_to_color(buffer, makecol(255, 255, 255));
68   for(unsigned i = 0; i < g_points.size(); i++) {
     //画点.
69    //画一个实心球
70    circlefill(buffer, //画向缓冲区
71    g_points[i].position.x,g_points[i].position.y,// aka 球的中心点的位置
72    g_points[i].size, // 半径.
73    (i == 0) ? makecol(255, 0, 0) : makecol(0, 0, 255)); //红色如果是玩家;否则为蓝色
75    // 画一个轮廓球.
76    circle(buffer, //画向缓冲区
77     g_points[i].position.x,g_points[i].position.y, // aka 球的中心点的位置.
78     g_points[i].size, // 半径.
79     makecol(0, 0, 0)); //红色如果是玩家;否则为蓝色.
81   }
83   // 画接合点
84   for (unsigned i = 0; i < g_joints.size(); i++)
85    line(buffer, //画向缓冲区
86     g_joints[i].p1.x, g_joints[i].p1.y, // 点 1.
87     g_joints[i].p2.x, g_joints[i].p2.y, // 点 2.
88     makecol(0, 0, 0)); // 黑颜色.
89    );
91   // 打印指令.
92   textout(buffer, font, "Left Mouse Button - new big ball Right Mouse Button - new small ball",
93     125, 1, makecol(0, 0, 0));
95   textout(buffer, font, "Arrow Keys - move red ball",
96     300, 592, makecol(0, 0, 0));
98   show_mouse(buffer); // 画鼠标光标.
100   draw_sprite(screen, buffer, 0, 0);// 把缓冲区中的数据画向屏幕.
101  } // while循环结束
103  return 0;
105 }END_OF_MAIN();
郑重声明:资讯 【用C++实现跨平台游戏开发之Allegro引擎-VC/MFC教程-第二电脑网】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——