【问题标题】:How to create USER DEFINED EVENTS in ALLEGRO 5如何在 ALLEGRO 5 中创建用户定义事件
【发布时间】:2013-11-22 08:44:08
【问题描述】:

我正在开发一个在 allegro 5 中的游戏,我想在屏幕上动态创建矩形对象并让它们可以用鼠标按钮点击

al_register_event_source( event_queue, al_get_timer_event_source(timer));
al_register_event_source( event_queue, al_get_mouse_event_source());

al_clear_to_color(al_map_rgb(0, 0, 0));
al_flip_display();

al_start_timer(timer);

while ( !exit )
{
    ALLEGRO_EVENT ev;
    al_wait_for_event( event_queue, &ev);

    if (ev.type == ALLEGRO_EVENT_TIMER)
    ;
    else if ( ev.type == ALLEGRO_EVENT_MOUSE_AXES )
     {
       x = ev.mouse.x;
       y = ev.mouse.y;
     }
    else if ( ev.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN )
     {
       if ( x >= rect.x && x <= rect.maxx && y >= rect.y && y <= rect.maxy )
             destory ( rect );
     }
    else if ( ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE )
        break;
    if ( redraw && al_event_queue_is_empty(event_queue)){
        redraw = false;
        al_draw_rectangle ( rect.x, rect.y, rect.maxx, rect.maxy, blue, 1 );
        al_flip_display();
        al_clear_to_color(al_map_rgb(0, 0, 0));
    }
}

但这仅针对一个矩形进行了硬编码。我怎样才能为此制作一个可以处理按钮等矩形的事件。

【问题讨论】:

  • rect 是如何定义的?为什么需要新的事件类型?你不能只拥有一个在单击鼠标时循环遍历的矩形数组吗?
  • rect 的坐标只有 top x,top y, bottom x, bottom y。我希望屏幕上随机出现矩形,并且不想通过使用矩形数组来固定矩形的数量。但我会先试试你的想法,看起来不错。但是如何确定单击了哪个矩形?我必须使用一个大循环,但我想要一个有效的方法。
  • 1.) 使用可以使用动态内存管理,当数组太小时增加数组大小。 (搜索realloc)。另一种选择是链表。 2.) 找到矩形的最简单方法是单个大循环。如果您需要更高级的东西,您可能需要搜索空间分区
  • 感谢您的好建议。你能给我介绍一下空间分区吗?
  • 抱歉,没有。我不是这方面的专家。先用简单的方法。如果太慢,那就寻找分区,因为事情会变得更加复杂和困难。

标签: c allegro5


【解决方案1】:

响应按钮按下不需要用户事件。

相反,您应该从不同的角度来解决这个问题。将ALLEGRO_EVENT 传递给您的按钮类,无论是否被点击,它都会返回。

bool Button::ButtonPressed(ALLEGRO_EVENT ev) {
   if (ev.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN && ev.mouse.button == 1) {
      if (our_area.Contains(ev.mouse.x , ev.mouse.y)) {return true;}
   }
   return false;
}

但是,您问如何在 Allegro 5 中创建用户事件,所以我也会回答。

有关详细信息和代码示例,请参阅https://liballeg.org/a5docs/trunk/events.html#allegro_user_event。基本上,您创建并初始化一个ALLEGRO_EVENT_SOURCE,将其注册到您的事件队列中,然后监听您使用al_emit_user_event 发出的消息。

【讨论】:

    猜你喜欢
    • 2021-02-10
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 2012-11-23
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多