我正在研究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));
}
}
但这只是一个矩形的硬编码。如何为此事件制作一个可以处理按钮等矩形的事件。
答案 0 :(得分:0)
不需要用户事件来响应按钮的按下。
相反,您应该从另一个角度进行处理。将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
发出的消息。