Exemplo n.º 1
0
static int start_action(int i)
{
    audio_play(AUD_MENU, 1.0f);

    if (i == START_BACK)
        return goto_state(&st_set);

    if (level_opened(i))
    {
        if (level_play(USER_REPLAY_FILE, i))
            return goto_state(&st_level);
        else
        {
            set_free();
            return goto_state(&st_title);
        }
    }
    return 1;
}
Exemplo n.º 2
0
void menu_show(ALLEGRO_DISPLAY *display, ALLEGRO_EVENT_QUEUE *event_queue) {
    al_set_target_backbuffer(display);
    ALLEGRO_BITMAP *bg = table_lookup(textures, "menu-bg");
    ALLEGRO_FONT *font = al_load_ttf_font("data/DejaVuSans.ttf", 12, 0);
    
    ptr_array_t *level_data = level_data_query("levels");
    
    bool running = true;
    ALLEGRO_EVENT ev;
    
    ALLEGRO_TIMER *frames_timer = al_create_timer(1 / FPS);
    
    al_register_event_source(event_queue, al_get_timer_event_source(frames_timer));
    al_start_timer(frames_timer);
    
    uint selection = 0;
    
    rect_t rects[level_data->len];
    
    for (uint i = 0; i < level_data->len; i++)
        rects[i] = (rect_t) { i * 200 + 50, 50, i * 200 + 150, 150 };
    
    while (running) {
        al_wait_for_event(event_queue, &ev);
        switch (ev.type) {
            case ALLEGRO_EVENT_DISPLAY_CLOSE:
                running = false;
                break;
            case ALLEGRO_EVENT_TIMER:
                if (ev.timer.source != frames_timer)
                    break;
                al_draw_bitmap(bg, 0, 0, 0);
                for (uint32_t i = 0; i < level_data->len; i++) {
                    level_data_t *level = ptr_array_index(level_data, i);
                    
                    al_draw_filled_rectangle(rects[i].x0, rects[i].y0,
                                             rects[i].x1, rects[i].y1,
                                             al_map_rgba(255, 255, 255, 200));
                    
                    al_draw_text(font, al_map_rgb(0, 0, 0), rects[i].x0 + 20,
                                 rects[i].y0 + 20, 0, level->name);
                }
                al_flip_display();
                break;
            case ALLEGRO_EVENT_KEY_DOWN:
                switch (ev.keyboard.keycode) {
                    case ALLEGRO_KEY_ESCAPE:
                        running = false;
                        break;
                    default:
                        break;
                }
                break;
            case ALLEGRO_EVENT_MOUSE_BUTTON_DOWN:
            {
                uint prev_selection = selection;
                selection = pointer_over_level(level_data->len, rects, ev);
                if (selection && selection == prev_selection) {
                    level_data_t *level_datum = ptr_array_index(level_data,
                                                                selection - 1);
                    level_t *level = level_parse(level_datum->filename);
                    level_play(level, display, event_queue);
                }
                break;
            }
            default:
                break;
        }
    }
}