美文网首页
游戏引擎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