美文网首页
游戏引擎Allegro

游戏引擎Allegro

作者: 技术喵 | 来源:发表于2019-07-10 07:37 被阅读0次

游戏引擎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查询手册

相关文章

网友评论

      本文标题:游戏引擎Allegro

      本文链接:https://www.haomeiwen.com/subject/lmuihctx.html