C 如何在ALLEGRO 5中创建用户定义的事件

C 如何在ALLEGRO 5中创建用户定义的事件,c,allegro5,C,Allegro5,我正在用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();

我正在用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));
    }
}
al_register_event_source(事件队列,al_get_timer_event_source(计时器));
al_寄存器\事件\源(事件\队列,al_获取\鼠标\事件\源());
al_clear_to_color(al_map_rgb(0,0,0));
al_flip_display();
启动定时器(定时器);
当(!退出)
{
快板;
等待事件(事件队列和ev);
如果(ev.type==快板事件计时器)
;
else if(ev.type==快板事件鼠标轴)
{
x=ev.mouse.x;
y=ev.mouse.y;
}
else if(ev.type==快板事件鼠标按钮按下)
{

如果(x>=rect.x&&x=rect.y&&y用户事件不需要响应按钮按下

相反,你应该从另一个角度来处理这个问题。将ALLEGRO_事件传递给你的button类,让它返回是否被点击

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中创建用户事件,因此我也将回答这个问题


有关详细信息和代码示例,请参阅。基本上,您可以创建并初始化一个
ALLEGRO\u事件\u源
,将其注册到事件队列中,然后侦听使用
al\u emit\u user\u事件发出的消息

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

相反,你应该从另一个角度来处理这个问题。将ALLEGRO_事件传递给你的button类,让它返回是否被点击

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中创建用户事件,因此我也将回答这个问题


有关详细信息和代码示例,请参阅。基本上,您可以创建并初始化一个
ALLEGRO\u事件\u源
,将其注册到事件队列中,然后侦听使用
al\u emit\u user\u事件
发出的消息。

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