亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

用C++實現跨平臺游戲開發之Allegro引擎

2019-11-17 05:05:35
字體:
來源:轉載
供稿:網友

  提要:本文重點討論開源游戲開發庫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()函數查詢一下最大可用方式:

#include <allegro.h> //必須放于系統頭文件的引用之后
set_color_depth(32); // 缺省情況下使用8位顏色
if (set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0) != 0) {
 abort_on_error("Couldn’t set a 32 bit color resolution");
}
  set_gfx_mode()的最后兩個參數用于指定虛擬緩沖區的大小-我們的圖形屏幕存儲于其中。這可以使創建一個卷邊游戲-其中地形是連續移動的-變得輕易。例如,你可能要使虛擬緩沖區,比方說,寬出20%以留出足夠的空間來平滑卷動新的精靈和地形。 更多文章 更多內容請看C/C++技術專題  C/C++相關文章  J2ME游戲開發應用專題,或
四、 一個完整的Allegro實例

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


用C++實現跨平臺游戲開發之Allegro引擎
圖1.Kee-Yip Chan的"SnookerClone"演示程序

  這個工程向你展示了許多不同的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   // 著色:假如我們能再次使用緩沖區,則清除它;
    //否則,舊圖像將滯留顯示
66   //用白色進行清除.
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();
  33-101行包括了典型的游戲編程循環模式。游戲繼續進行直到玩家按下ESC鍵退出為止。34-39行支持同時進行的鍵盤輸入,因為你可以按下向上和向左箭頭鍵來獲取粗略的斜向運動。

  在41-61行,鼠標動作被捕捉到全局變量mouse_b(用于按鈕),mouse_x和mouse_y。假如你一直在使用一滾輪鼠標,你還可以使用變量mouse_z。我們對反向彈跳邏輯進行了一點硬編碼以確保每次鼠標按下事件只有一個球下落。

  第63行調用doPhysics(),其目的是旋轉車輪的線段,更新球位置,檢測球碰撞和適當地改變它們的方向矢量。這個模塊(350行的數學代碼)有點深入了些,但它確實是一個一流的實現,值得你深入研究。

  余下的代碼,65-101行,開始著色,在典型的示例程序中這屬于常規實現部分。這里的著色用典型的雙緩沖區技術,下一次屏幕變化被計算出來并進行脫屏繪制并在最的一毫秒進行緩沖交換(第100行)。這確保了視覺的連續性又減少了煩人的閃爍-對象看上去是隨機地繪制的。在著色代碼部分,對line()和circlefill()的調用是相當直接的:circlefill()以x,y,半徑和填充顏色作為參數。

  textout_ex()函數的功能稍強于textout()(示于92-96行),答應你指定前景和背景顏色。Allegro提供例程以直接從GRX格式.fnt文件,8x8或8x16 BIOS格式.fnt文件,位圖圖象以及數據文件格式中裝入字體。作為選擇,你能導入一種大范圍的Unicode字體,這可以通過寫一個.txt腳本-它為每一范圍的字符指定相應的不同的源文件-來實現。假如你想要支持TrueType,那么你需要AllegroTTF或相同功能的插件。
最后,在第100行的draw_sprite()實現一個覆蓋性復制新生成的位圖到第14行創建的屏幕對象上。覆蓋性復制意指只有非透明的顏色像素被復制。在本例中,我確信它已被退化成一個"blit"(塊復制)轉儲。

  五、 Allegro的音頻

  這個snooker演示程序只涉及到了一些最基本的圖形和I/O函數,但是并沒有用到Allegro的音頻開發包。該包中的MIDI混頻,音響效果和錄音API,其效果達到或超過幾乎每一個我所見過的專業的聲音庫。Allegro音頻應用軟件大量存在,包括WinCab-一個mp3和OGG Vorbis音樂唱片機,還有LouTronic Rhythm Box-一個鼓聲生成合成器,它具有可全面融合到一起的snare鼓,低音鼓和hi hat的效果。下面我們簡單地回顧Allegro音頻API的一小部分。

  每一個使用音頻的程序都應該調用reserve_voices()來指定數字和MIDI聲音驅動程序分別使用的聲音的數目。接下去,你能控制這些音頻軌道的混合.

  你可以非常輕易地象下面這樣插入一個音軌:


MIDI *midFile = load_midi("myfile.mid’);
play_midi(midFile, TRUE);//連續循環
  對于更復雜的需要,你可以安裝三個鉤子函數之一,它們可以使你攔截MIDI玩家事件。假如被設置為非NULL,這些例程將在每次MIDI消息,元事件和系統獨占的數據塊中被分別調用。

  Allegro的數字音頻系統被設計為從最基本的配置到可高度擴展的。你能輕易安裝讀取器和寫入器來處理新的或者不同的音頻文件類型, 例如:

register_sample_file_type("mp3",load_mp3,NULL);//安裝MP3讀取器
  當正播放數字音頻時,你可以隨時編輯它。下列代碼改變將在播放一個樣本參數時改變該樣本(用于操作循環播放的聲音):

void adjust_sample(const SAMPLE *spl, int vol, int pan, int freq, int loop);
  你能改變音量,平移音頻數據并清除循環標志,在下次執行到循環末尾時,這將停止該樣本。假如在播放相同樣本的好幾個副本,這會調整它碰到的第一個副本。假如該樣本沒有播放,對它沒有任何影響。 更多文章 更多內容請看C/C++技術專題  C/C++相關文章  J2ME游戲開發應用專題,或

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91亚洲精品在线观看| 国产成人jvid在线播放| 欧美日韩午夜剧场| 国产在线999| 色偷偷偷综合中文字幕;dd| 国产午夜精品麻豆| 日韩中文字幕在线视频播放| 成人久久精品视频| 正在播放欧美一区| 国产69精品久久久久99| 国产成人免费91av在线| 亚洲最新中文字幕| 色中色综合影院手机版在线观看| 国产丝袜一区二区三区| 欧美亚州一区二区三区| 九九视频直播综合网| 九九精品在线播放| 久久欧美在线电影| 欧美成人免费大片| 8090理伦午夜在线电影| 精品视频在线导航| 久久99亚洲精品| 性欧美xxxx视频在线观看| 亚洲成人xxx| 57pao国产成人免费| 另类视频在线观看| 91精品视频免费| 国产精品一区二区久久久久| 成人免费淫片视频软件| 国产精品综合网站| 欧美日韩精品在线播放| 亚洲国产精品美女| 国产亚洲a∨片在线观看| 国产在线观看91精品一区| 原创国产精品91| 亚洲激情 国产| 日本久久久久久| 日韩在线免费高清视频| 在线观看亚洲视频| 日本不卡免费高清视频| 日韩美女在线观看| 一区二区三区日韩在线| 精品久久香蕉国产线看观看gif| 国产91免费看片| 亚洲欧美日韩区| 国产精品999| 亚洲人成网站色ww在线| 亚洲欧美激情在线视频| 亚洲白虎美女被爆操| 3344国产精品免费看| 亚洲国产精品va在线| 亚洲理论电影网| 欧美精品生活片| 欧美人在线观看| 91沈先生作品| 最近的2019中文字幕免费一页| 亚洲第一综合天堂另类专| 亚洲无av在线中文字幕| 国产97在线播放| 国产精品网红直播| 日韩一区二区久久久| 欧美福利在线观看| 亚洲精品videossex少妇| 日韩精品在线电影| 国产日韩欧美在线看| 九九精品在线视频| 88国产精品欧美一区二区三区| 欧美精品日韩三级| 欧美日本中文字幕| 日韩精品一区二区视频| 成人xvideos免费视频| 国产成人鲁鲁免费视频a| 国产丝袜一区二区三区| 欧美裸体视频网站| 久久视频中文字幕| 国产亚洲a∨片在线观看| 欧美放荡办公室videos4k| 国模精品视频一区二区| 永久免费毛片在线播放不卡| 色噜噜狠狠狠综合曰曰曰88av| 亚洲精品日韩丝袜精品| 色综合久久中文字幕综合网小说| 中文字幕欧美国内| 精品久久久久久久久中文字幕| 91精品免费视频| 亚洲欧美日韩精品| 亚洲精品电影久久久| 综合网中文字幕| 日韩女优人人人人射在线视频| 在线观看日韩www视频免费| 成人免费视频在线观看超级碰| 免费97视频在线精品国自产拍| 日韩一区二区三区xxxx| 欧美日本黄视频| 国内精品一区二区三区四区| 26uuu另类亚洲欧美日本老年| 国产狼人综合免费视频| 精品欧美一区二区三区| 久精品免费视频| 国产97在线观看| 丰满岳妇乱一区二区三区| 亚洲人免费视频| 国内精品小视频| 成人精品一区二区三区电影免费| 亚洲精品wwww| 97精品国产aⅴ7777| 欧美激情免费在线| 国产精品视频区| 日本高清+成人网在线观看| 岛国精品视频在线播放| 国产精品亚洲第一区| 亚洲视频国产视频| 国产精品青草久久久久福利99| 97视频在线观看免费高清完整版在线观看| 97精品国产97久久久久久免费| 精品视频久久久久久| 久久精品色欧美aⅴ一区二区| 亚洲欧美国产制服动漫| 欧美高清一级大片| 欧美巨大黑人极品精男| 高清欧美性猛交xxxx黑人猛交| 136fldh精品导航福利| 亚洲a级在线播放观看| 国产一区二区三区视频在线观看| 亚洲自拍偷拍色片视频| 91精品国产91久久久| 欧美极品少妇xxxxⅹ裸体艺术| 8x海外华人永久免费日韩内陆视频| 91香蕉亚洲精品| 性亚洲最疯狂xxxx高清| 91沈先生在线观看| 91tv亚洲精品香蕉国产一区7ujn| 成人天堂噜噜噜| 91在线视频免费| 亚洲欧洲在线视频| 久久男人的天堂| 成人女保姆的销魂服务| 国产日韩中文字幕在线| 国产精品视频免费观看www| 日韩成人网免费视频| 国产精品精品久久久| 亚洲深夜福利在线| 中文字幕av一区中文字幕天堂| 亚洲精品一区久久久久久| 中文字幕综合在线| 国产精品免费一区| 亚洲第一二三四五区| 欧美一区二区三区免费观看| 国产成人精品久久二区二区| 国产精品免费视频久久久| 亚洲午夜国产成人av电影男同| 久久国产一区二区三区| 成人网在线视频| 欧美午夜精品久久久久久久| 在线a欧美视频| 国产精品视频中文字幕91| 国外成人免费在线播放| 久久久视频精品| 亚洲福利视频网| 久久久精品欧美| 欧美黄色免费网站| 精品国模在线视频| 亚洲aⅴ男人的天堂在线观看| 亚洲欧美一区二区三区四区|