游戏引擎Allegro



  • 游戏引擎Allegro

    allegro是一个c/c++的游戏库,免费,开源,最初作者是shawn hargreaves,他支持DOS,UNIX(Linux, FreeBSD, Irix, Solaris, Darwin), Windows, QNX, BeOS 还有 MacOS X.提供了大量的图形,声音,玩家输入(键盘,鼠标,游戏手柄),定时器等函数。

    linux搭建环境

    1.下载源码

    git 地址 https://github.com/liballeg/allegro5.git

    https://github.com/liballeg/allegro5/releases/download/5.2.5.0/allegro-5.2.5.0.tar.gz

    2.解压

    $ tar -xzf allegro-5.2.5.0.tar.gz

    3.进入目录,打开README_make.txt,按照步骤执行

    4.在编译前要准备环境

    • 安装gcc,g++

      $ sudo apt install gcc

      $ sudo apt install g++

    • 安装cmake

      $ sudo apt install cmake

    • 安装x11

      $ sudo apt install libx11-dev

    • 安装OpenGL

      $ sudo apt-get install build-essential
      $ sudo apt-get install libgl1-mesa-dev
      $ sudo apt-get install libglu1-mesa-dev
      $ sudo apt-get install libglut-dev
      $ sudo apt-get install freeglut3-dev

    • 安装Xcursor
      $ sudo apt-get install libxcursor-dev

    5.在build目录运行

    $ cmake ..

    6.编译

    $ make -j4

    7.安装

    $ sudo make install

    第一个程序

    1.在allegro-5.2.5.0/examples目录有个ex_display_event.c例子

    2.改编例子,加注释,编译例子

    $ gcc ex_display_events.c -lallegro -lallegro_font -lallegro_primitives -o ex_display_events

    3.运行例子

    捕获.PNG

    4.代码地址
    5.代码浏览

    #include <stdarg.h>
    #include "allegro5/allegro.h"
    #include "allegro5/allegro_font.h"
    #include "allegro5/allegro_primitives.h"
    
    #include "common.c"
    
    #define MAX_EVENTS 23
    
    static char events[MAX_EVENTS][1024];
    
    static void add_event(char const *f, ...)
    {
    	va_list args;
    	memmove(events[1], events[0], (MAX_EVENTS - 1) * 1024);
    	va_start(args, f);
    	vsnprintf(events[0], 1024, f, args);
    	va_end(args);
    }
    
    const int WIN_WIDTH = 400;
    const int WIN_HEIGHT = 300;
    
    int main(int argc, char **argv)
    {
    	/*声明*/
    	ALLEGRO_DISPLAY *display;
    	ALLEGRO_EVENT_QUEUE *queue;
    	ALLEGRO_EVENT event;
    	ALLEGRO_FONT *font;
    	ALLEGRO_COLOR color, black, red, blue;
    
    	int i;
    
    	(void)argc;
    	(void)argv;
    
    	/*allegro初始化*/
    	if(!al_init()){
    		abort_example("Could not init Allegro.\n");
    	}
    
    	al_init_primitives_addon();	/*初始化基元插件*/
    	al_install_mouse();		/*安装鼠标驱动*/
    	al_install_keyboard();	/*安装键盘驱动*/
    	al_init_font_addon();	/*初始化字体插件*/
    
    	al_set_new_display_flags(ALLEGRO_RESIZABLE);	/*设置窗口可缩放*/
    	display = al_create_display(WIN_WIDTH, WIN_HEIGHT);	/*创建显示窗口*/
    	if(!display){;
    		abort_example("Error creating display\n");
    	}
    
    	al_set_window_title(display, "窗口标题");		/*创建窗口标题*/
    
    	font = al_create_builtin_font();		/*创建字体*/
    	if(!font){
    		abort_example("Error creating buildin font\n");
    	}
    
    	/*初始化颜色*/
    	black = al_map_rgb_f(0, 0, 0);
    	red = al_map_rgb_f(1, 0, 0);
    	blue = al_map_rgb_f(0, 0, 1);
    
    	/*创建事件队列*/
    	queue = al_create_event_queue();
    	al_register_event_source(queue, al_get_mouse_event_source());	/*注册鼠标事件*/
    	al_register_event_source(queue, al_get_keyboard_event_source());	/*注册键盘事件*/
    	al_register_event_source(queue, al_get_display_event_source(display));	/*注册显示事件*/
    
    	while(1){
    		if(al_is_event_queue_empty(queue)){
    			float x = 8, y = 28;
    			al_clear_to_color(al_map_rgb(0xff, 0xff, 0xc0));	/*背景颜色*/
    
    			al_draw_textf(font, blue, 8, 8, 0, "Hello World.");	/*写字*/
    
    			color = red;
    			for(i = 0; i < MAX_EVENTS; i++){
    				if(!events[i]) continue;
    				al_draw_textf(font, color, x, y, 0, "%s", events[i]);	/*循环打印事件*/
    				color = black;
    				y += 20;
    			}
    			al_flip_display();	/*更新显示*/
    		}
    
    		al_wait_for_event(queue, &event);	/*当队列有事件,会把事件存入event*/
    		switch(event.type){
    			case ALLEGRO_EVENT_MOUSE_ENTER_DISPLAY:
    				add_event("ALLEGRO_EVENT_MOUSE_ENTER_DISPLAY");
    				break;
    
    			case ALLEGRO_EVENT_MOUSE_LEAVE_DISPLAY:
    				add_event("ALLEGRO_EVENT_MOUSE_LEAVE_DISPLAY");
    				break;
    
    			case ALLEGRO_EVENT_KEY_DOWN:
    				if(event.keyboard.keycode == ALLEGRO_KEY_ESCAPE){
    					goto done;
    				}
    				else{
    					add_event("ALLEGRO_EVENT_KEY_DOWN.keycode=%d", event.keyboard.keycode);
    				}
    				break;
    
    			case ALLEGRO_EVENT_DISPLAY_RESIZE:
    				add_event("ALLEGRO_EVENT_DISPLAY_RESIZE x=%d, y=%d, "
    					"width=%d, height=%d",
    					event.display.x, event.display.y, event.display.width,
    					event.display.height);
    				al_acknowledge_resize(event.display.source);
    				break;
    
    			case ALLEGRO_EVENT_DISPLAY_CLOSE:
    				add_event("ALLEGRO_EVENT_DISPLAY_CLOSE");
    				break;
    
    			case ALLEGRO_EVENT_DISPLAY_LOST:
    				add_event("ALLEGRO_EVENT_DISPLAY_LOST");
    				break;
    
    			case ALLEGRO_EVENT_DISPLAY_FOUND:
    				add_event("ALLEGRO_EVENT_DISPLAY_FOUND");
    				break;
    
    			case ALLEGRO_EVENT_DISPLAY_SWITCH_OUT:
    				add_event("ALLEGRO_EVENT_DISPLAY_SWITCH_OUT");
    				break;
    
    			case ALLEGRO_EVENT_DISPLAY_SWITCH_IN:
    				add_event("ALLEGRO_EVENT_DISPLAY_SWITCH_IN");
    				break;
    		}
    	}
    
    done:
    	al_destroy_event_queue(queue);	/*销毁事件队列*/	
    	al_destroy_display(display);	/*销毁显示*/	
    
    	return 0;
    }
    

    API查询手册


Log in to reply
 

走马观花

最近的回复

  • H
    Toou 2D 拿来即用,为简单而生。

    简称T2D,是一款采用自身模块规范编写的轻量级UI框架,遵循Qt书写与组织形式门槛极低无需深入学习简单易用可拿来即用,丰富的控件模块适合界面的快速开发,让程序人员拥有更多的精力来实现业务逻辑与算法。

    统一交互规范,丰富的Ui控件几十种常用控件放弃了Qt Controls 及 Controls 2 来提高性能。

    完善的主题系统,业务逻辑与界面主题设计分离,可通过简单修改变量自定义主题皮肤。灵活的多主题皮肤绑定机制、在不需要重启App即实现一键换肤

    ini皮肤配置规则与每一个控件融合。可在应用内配置也可在应用外动态扩展配置。

    框架自动化安装支持动态库、静态库多模式编译。使用方便更安全更自由。

    提供丰富Demo、全面的帮助文档,Api查阅快速方便。项目必备开源框架!

    已经集成最新版 Font Awesome 4.7

    开源地址:https://github.com/ShowFL/Toou-2D

    read more
  • 刚刚毕业,工作用QT开发,以后有问题多多请教各位前辈😬 抱拳了。

    read more

关注我们

微博
QQ群