2D游戏引擎Allegro 系列教程 新的框架

来源:互联网 发布:ubuntu怎么安装python 编辑:程序博客网 时间:2024/04/28 01:59

我在本系列教程的第二篇,曾写过一个框架代码。后经过测试,虽然可以运行,但是确有些BUG,例如不能正确执行到game_destory()函数,从而导致内存泄漏。于是现在就抽空重新写了一个,发在这里。新的框架用了一个简单的状态机来实现。

以下是完整的代码:



//头文件#define ALLEGRO_NO_MAGIC_MAIN#include <Windows.h>#include <allegro5/allegro.h>#pragma comment(lib,"allegro-5.0.7-monolith-mt-debug.lib") //链接Allegro的库//////////////////////////////////////////////////////////////////////////////////////////////函数int game_init();//初始化游戏int game_run();//进入游戏循环int game_update();//逻辑处理函数int game_render();//渲染函数int game_destory();//释放资源int game_msg();//消息处理//常量const int WIN_WIDTH=800; //窗口宽度const int WIN_HEIGHT=600; //窗口高度//全局变量ALLEGRO_DISPLAY *display;  //显示设备ALLEGRO_EVENT_QUEUE *queue;  //事件队列ALLEGRO_EVENT my_event;  //事件enum GAME_STATE{GAME_INIT,GAME_RUN,GAME_DESTORY,GAME_END};GAME_STATE FSM=GAME_INIT;////////////////////////////////////////////////////////////////////////////////////////////int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd ){int error=0;while(true){switch(FSM){case GAME_INIT:error=game_init();if(error!=0){FSM=GAME_DESTORY;break;}break;case GAME_RUN:game_run();break;case GAME_DESTORY:game_destory();break;case GAME_END:return error;}}return error;}int game_init(){//_/_/插件初始化_/_/_/_/_/_/_/_/_/__/_/_/_//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/if (!al_init())return 1;al_install_mouse();al_install_keyboard();display = al_create_display(WIN_WIDTH, WIN_HEIGHT);if (!display)return 2;al_set_window_title(display, "框架");//初始化事件队列,接受到的消息将存储在该队列里queue = al_create_event_queue();//指定要接收哪个设备的消息al_register_event_source(queue, al_get_keyboard_event_source());al_register_event_source(queue,al_get_mouse_event_source());al_register_event_source(queue, al_get_display_event_source(display));//_/_/加载字体_/_/_/_/_/_/_/_/_/__/_/_/_//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_///_/_/加载图片_/_/_/_/_/_/_/_/_/__/_/_/_//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_///_/_/加载控件_/_/_/_/_/_/_/_/_/__/_/_/_//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/FSM=GAME_RUN;return 0;}int game_msg(){al_wait_for_event(queue,&my_event);if(my_event.type==ALLEGRO_EVENT_DISPLAY_CLOSE)return 98; //当窗口被关闭时if (my_event.type == ALLEGRO_EVENT_KEY_CHAR) {if (my_event.keyboard.keycode == ALLEGRO_KEY_ESCAPE)//当按下 ESC键时return 98;}return 0;}int game_update(){return 0;}int game_render(){al_clear_to_color(al_map_rgb(0,0,0));al_flip_display();return 0;}int game_run(){double t_now=0.0; //当前时刻double t_pre=0.0; int error=0;if(!al_is_event_queue_empty(queue)){ //先检测事件对了中是否有新事件error=game_msg(); //有 则先处理事件if(error!=0 && error !=98)return error;if(error==98){FSM=GAME_DESTORY;return error;}}else{t_now=al_get_time();if(t_now-t_pre>=0.033){game_update();game_render();t_pre=t_now;}else{al_rest(0);}}return 0;}int game_destory(){FSM=GAME_END;return 0;}