游戏引擎Allegro之例子2



  • 1.学习例子ex_bitmap_flip.c
    2.一个显示位图翻转标志的例子

    /* An example showing bitmap flipping flags, by Steven Wallace. */
    
    #include <allegro5/allegro.h>
    #include <allegro5/allegro_image.h>
    #include <allegro5/allegro_font.h>
    
    #include "common.c"
    
    /* Fire the update every 10 milliseconds. */
    #define INTERVAL 0.01
    
    
    float bmp_x = 200;   //起始坐标
    float bmp_y = 200;   //起始坐标
    float bmp_dx = 96;   //水平速度
    float bmp_dy = 96;   //垂直速度
    int bmp_flag = 0;
    
    /* Updates the bitmap velocity, orientation and position. */
    static void update(ALLEGRO_BITMAP *bmp)
    {
       ALLEGRO_BITMAP *target = al_get_target_bitmap();   /*全屏位图*/
       int display_w = al_get_bitmap_width(target);
       int display_h = al_get_bitmap_height(target);
       int bitmap_w = al_get_bitmap_width(bmp);
       int bitmap_h = al_get_bitmap_height(bmp);
    
       bmp_x += bmp_dx * INTERVAL;
       bmp_y += bmp_dy * INTERVAL;
    
       /* Make sure bitmap is still on the screen. */
    /*ALLEGRO_FLIP_VERTICAL=2*/
    /*~ALLEGRO_FLIP_VERTICAL=01*/
    /*bmp_flag &= 01就是把bit2变0*/
    /*将垂直翻转状态置0*/
    /*结果就是在上边时候垂直不翻转*/
       if (bmp_y < 0) {
          bmp_y = 0;
          bmp_dy *= -1;
          bmp_flag &= ~ALLEGRO_FLIP_VERTICAL; /*2,1,0*/
          //printf("bmp_y ALLEGRO_FLIP_VERTICAL=%d bmp_flag=%d\n", ALLEGRO_FLIP_VERTICAL, bmp_flag);
       }
    /*ALLEGRO_FLIP_HORIZONTAL=1*/
    /*~ALLEGRO_FLIP_HORIZONTAL=0*/
    /*bmp_flag &= 0就是把bit1变0*/
    /*将水平翻转状态置0*/
    /*结果就是在左边时候水平不翻转*/
       if (bmp_x < 0) {
          bmp_x = 0;
          bmp_dx *= -1;
          bmp_flag &= ~ALLEGRO_FLIP_HORIZONTAL;
          //printf("bmp_x  ALLEGRO_FLIP_HORIZONTAL=%d bmp_flag=%d\n", ALLEGRO_FLIP_HORIZONTAL, bmp_flag);
       }
    /*ALLEGRO_FLIP_VERTICAL=2*/
    /*bmp_flag |= 10就是把bit2变1*/
    /*将垂直翻转状态置1*/
    /*结果就是在下边时候垂直翻转*/
       if (bmp_y > display_h - bitmap_h) {
          bmp_y = display_h - bitmap_h;
          bmp_dy *= -1;
          bmp_flag |= ALLEGRO_FLIP_VERTICAL;
          //printf("bmp_y2  ALLEGRO_FLIP_VERTICAL=%d bmp_flag=%d\n", ALLEGRO_FLIP_VERTICAL, bmp_flag);
       }
    
    /*ALLEGRO_FLIP_HORIZONTAL=1*/
    /*bmp_flag |= 1就是把bit1变1*/
    /*将水平翻转状态置1*/
    /*结果就是在右边时候水平翻转*/
       if (bmp_x > display_w - bitmap_w) {
          bmp_x = display_w - bitmap_w;
          bmp_dx *= -1;
          bmp_flag |= ALLEGRO_FLIP_HORIZONTAL;
          //printf("bmp_x2  ALLEGRO_FLIP_HORIZONTAL=%d bmp_flag=%d\n", ALLEGRO_FLIP_HORIZONTAL, bmp_flag);
       }
    }
    
    
    int main(int argc, char **argv)
    {
       ALLEGRO_DISPLAY *display;
       ALLEGRO_TIMER *timer;
       ALLEGRO_EVENT_QUEUE *queue;
       ALLEGRO_BITMAP *bmp;
       ALLEGRO_BITMAP *mem_bmp;
       ALLEGRO_BITMAP *disp_bmp;
       ALLEGRO_FONT *font;
       char *text;
       bool done = false;
       bool redraw = true;
    
       /* Silence unused arguments warnings. */
       (void)argc;
       (void)argv;
    
       if (!al_init()) {
          abort_example("Failed to init Allegro.\n");
       }
    
       /* Initialize the image addon. Requires the allegro_image addon
        * library.
        */
       if (!al_init_image_addon()) {
          abort_example("Failed to init IIO addon.\n");
       }
    
       /* Initialize the image font. Requires the allegro_font addon
        * library.
        */
       al_init_font_addon();
       init_platform_specific(); /* Helper functions from common.c. */
    
       /* Create a new display that we can render the image to. */
       display = al_create_display(640, 480);
       if (!display) {
          abort_example("Error creating display.\n");
       }
    
       /* Allegro requires installing drivers for all input devices before
        * they can be used.
        */
       if (!al_install_keyboard()) {
          abort_example("Error installing keyboard.\n");
       }
    
       /* Loads a font from disk. This will use al_load_bitmap_font if you
        * pass the name of a known bitmap format, or else al_load_ttf_font.
        */
       font = al_load_font("data/fixed_font.tga", 0, 0);
       if (!font) {
          abort_example("Error loading data/fixed_font.tga\n");
       }
    
       bmp = disp_bmp = al_load_bitmap("data/mysha.pcx");
       if (!bmp) {
          abort_example("Error loading data/mysha.pcx\n");
       }
       text = "Display bitmap (space to change)";
    
    /*创建驻留在系统内存中的位图*/
       al_set_new_bitmap_flags(ALLEGRO_MEMORY_BITMAP);
       mem_bmp = al_load_bitmap("data/mysha.pcx");
       if (!mem_bmp) {
          abort_example("Error loading data/mysha.pcx\n");
       }
    
    /*创建定时器*/
       timer = al_create_timer(INTERVAL);
    
       queue = al_create_event_queue();
       al_register_event_source(queue, al_get_keyboard_event_source());
       al_register_event_source(queue, al_get_timer_event_source(timer));
       al_register_event_source(queue, al_get_display_event_source(display));
    
    /*启动定时器*/
       al_start_timer(timer);
    
       /* Default premultiplied aplha blending. */
       al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_INVERSE_ALPHA);
    
       /* Primary 'game' loop. */
       while (!done) {
          ALLEGRO_EVENT event;
    
          /* If the timer has since been fired and the queue is empty, draw.*/
          if (redraw && al_is_event_queue_empty(queue)) {
             update(bmp);
             /* Clear so we don't get trippy artifacts left after zoom. */
             al_clear_to_color(al_map_rgb_f(0, 0, 0));
             al_draw_tinted_bitmap(bmp, al_map_rgba_f(1, 1, 1, 0.5),
                bmp_x, bmp_y, bmp_flag);   
                /*bmp_flag=0表示不翻转,*/
                /*bmp_flag=1表示ALLEGRO_FLIP_HORIZONTAL,水平翻转*/
                /*bmp_flag=2表示ALLEGRO_FLIP_VERTICAL,垂直翻转*/
               /*bmp_flag=3表示ALLEGRO_FLIP_HORIZONTAL+ALLEGRO_FLIP_VERTICAL,水平翻转+垂直翻转*/
             al_draw_text(font, al_map_rgba_f(1, 1, 1, 0.5), 0, 0, 0, text);
             al_flip_display();
             redraw = false;
          }
    
          al_wait_for_event(queue, &event);
          switch (event.type) {
             case ALLEGRO_EVENT_KEY_DOWN:
                if (event.keyboard.keycode == ALLEGRO_KEY_ESCAPE)
                   done = true;
                else if (event.keyboard.keycode == ALLEGRO_KEY_SPACE) {
                   /* Spacebar toggles whether render from a memory bitmap
                    * or display bitamp.
                    */
                   if (bmp == mem_bmp) {
                      bmp = disp_bmp;
                      text = "Display bitmap (space to change)";
                   }
                   else {
                      bmp = mem_bmp;
                      text = "Memory bitmap (space to change)";
                   }
                }
                   
                break;
    
             case ALLEGRO_EVENT_DISPLAY_CLOSE:
                done = true;
                break;
    
             case ALLEGRO_EVENT_TIMER:
                redraw = true;
                break;
          }
       }
    
       al_destroy_bitmap(bmp);
    
       return 0;
    }
    
    /* vim: set sts=3 sw=3 et: */
    
    

    3.运行效果
    1AFF2873-C3E1-46D7-8311-4A2DF57867FA.png
    4.代码地址



  • 看到Allegro也是由一个while ( 1 )死循环完成的啊。游戏似乎都是用死循环来进行逻辑和渲染。


Log in to reply
 

走马观花

最近的回复

  • Z

    我按照楼主说的,除了windeployqt以外,还需要Qt\labs\folderlistmodel,QtQuick\Layouts,QtQuick\VirtualKeyboard,QtQuick.2,platforminputcontexts这么几个目录,另外Qt5Qml.dll, Qt5Quick.dll也要加进来,还是不行,楼主可以发个完整的文件夹给我吗,release模式的,debug模式没问题

    read more
  • 1.jpg

    简介

    USD全称是“Universal Scene Description”,它主要着力的是电影、游戏复杂制作的流程的规范化。这回我们主要来研究USD在Maya中有关渲染部分究竟是如何实现的。

    USD通过附属的子项目Hydra来实现在其工具“UsdView”以及Maya中渲染方面的实现。Hydra是一款经过多年锤炼的渲染引擎(据说自从2012年就开始研发),Hydra与Maya中有关渲染的结合得益于Maya支持第三方渲染框架通过它提出的“Viewport (1.0、2.0)”方式支持。

    初探

    我们打开USD项目,会发现它有很多子项目。其中包含了imaging和usd子项目。这里我们主要关注的是imaging项目。由单词意思可知,其主要关注的是产出图片的,也就是有关渲染的。
    ca7ce8ff-7e7d-4ec3-9246-fbee48109c7b-image.png

    有关Hydra是三个子项目。包含了hdSt、hdStream以及hdx。我们主要关注的是hdSt。因为这个项目是和OpenGL渲染密切相关的。由于OpenGL是做渲染的大家通用知识,因而它是我们关注的主要子项目。

    调试

    调试.jpg
    我们调试这部分代码,截了此图。我们在图中至少发现几个问题:

    Maya底层是用OpenSceneGraph(OSG)管理场景的。我们可以看到Maya 2018的文件夹里有很多OSG开头的动态链接库,这么说具体视口渲染的部分都是建立在OSG上的。Maya的Viewport 2.0也是建立在OSG上的。在可见的将来它们不会替换掉OSG。

    USD的Hydra和Maya结合的类叫做UsdMayaGLBatchRenderer。由名字可知,它仅工作在OpenGL下,换句话说,如果Maya使用的是DirectX11进行渲染的,那么它将会失效。
    d7063ec4-242e-40bd-bf05-5103c38fedf1-image.png

    libhd项目只是一个前端库,后端通过libhdx以及libhdSt来实现。尤其是libhdSt,它主要是和OpenGL打交道的。它十分复杂。主要基于的是OpenGL 3.3+,也就是包含了各种着色器以及高级栅格化技术,并且整合了网格细分库:OpenSubdiv。

    后续

    由于我们的研究方向是思考一个方式来让让Hydra支持过程化纹理,因此我们还需要继续对此进行研究。

    read more
  • 最近我开始在Maya工作啦。Maya是一款优秀的三维软件,可以处理布景、建模、纹理、装备、渲染等操作。而且它可以支持C++和Python的开发。文档也是非常多的(参考这里)。

    我们最近的工作呢,是想要利用Maya的资源,尤其是图片资源,来制作新的界面。由于Maya是基于Qt开发的,因此要获取图片资源,除了Maya文件夹里D:\Develop\Autodesk\Maya2018\icons文件之外,还需要从资源文件中获取到。而资源文件一般是编译成C++代码放在程序的某个位置了,所以我们一般是看不到的。我们就开始想,既然Maya能够成功地读取并且显示,我们通过Maya的插件开发,不也能够获取并且显示到需要的图标吗?由于Qt的经验,我开始研究通过写Maya插件来获取到Maya资源文件的方法。

    新打开Maya软件,点击右下角的脚本图标,我们开始输入脚本:
    ad141613-63a5-4a93-9b79-3d6ca44da782-image.png

    2、我们通过Qt for Python来从Maya中获取到图标信息。由于Maya是构建在Qt 5.6.1上的,当时还不叫Qt for Python,而是PySide2。当然用法也是差不多的。更重要的是Qt 5.6.1已经支持QML了,可以支持QML的基本绘图方法。所以我们打算结合Qt for Python和QML来实现相关的功能。其实这样一组合就和Maya没有什么关系了。剩下的都是Qt的技术。
    我们的脚本是这样的:

    from PySide2.QtQuick import QQuickView from PySide2.QtCore import QDir, QFileInfo, QUrl def getMayaResourceFileList( nameFilter ): dir = QDir( ":/" ) return dir.entryList( nameFilter ) view = QQuickView( ) view.setResizeMode( QQuickView.SizeViewToRootObject ) mainUrl = QUrl.fromLocalFile( "C:/Users/huawei/Documents/ImageGridView.qml" ) view.setSource( mainUrl ) view.show( ) rootItem = view.rootObject( ) if rootItem != None: rootItem.setProperty( "prefix", "qrc:/" ) rootItem.setProperty( "model", getMayaResourceFileList( '*.png' ) )

    其中C:/Users/huawei/Documents/ImageGridView.qml是我本地的路径,可以改为任意的路径甚至是http路径呢。

    我们还得完成ImageGridView.qml文件内容,其实也非常简单,大概是这样的: import QtQuick 2.6 GridView { id: root width: 320 height: 480 cellWidth: 80 cellHeight: 80 delegate: Image { width: 80 height: 80 source: root.prefix + modelData Text { anchors { left: parent.left right: parent.right bottom: parent.bottom } text: modelData wrapMode: Text.Wrap } } model: 40 property string prefix }

    22ae8472-0bb3-4342-ae72-e1cb54bd87a7-image.png

    4、这些文件准备就位了!我们打开一下Maya软件,看看结果~
    f430332d-c824-47d3-8d1c-b17b3c53bc97-image.png
    它是一个可滑动的界面,每行显示4列,然后下面是文字的内容,展示了图标的名称。我们可以借此工具拿到我们感兴趣的图标的路径,然后应用到我们制作的界面上。其实,如果你觉得图片好,也可以通过QImage以及QPixmap给转存出去自己用。

    如果你觉得文章很棒,记得点赞哦。

    read more

关注我们

微博
QQ群











召唤伊斯特瓦尔