#include "asset.h" #include "input.h" #include "menu.h" #ifdef DEBUG #include "error.h" #include "platform.h" #endif void init_menu(Menu* menu, void* ptr) { menu->el_count = 0; menu->selected = 0; menu->y = renderer_h / 2; menu->h = 0; menu->ptr = ptr; } void menu_add( Menu* menu, const char* text, Menu_Event on_select, const BM_Font* font ) { Menu_Item* it; int i; #ifdef DEBUG if (menu->el_count >= menu_max_elements) { platform_err("Too many menu elements.\n"); platform_abort(error_gameplay_error); } #endif it = &menu->els[menu->el_count++]; it->on_select = on_select; it->text_len = 0; for (i = 0; text[i]; i++) { it->text[i] = text[i]; it->text_len++; } it->text[i] = 0; menu->h = font->char_h * menu->el_count; menu->y = renderer_h / 2 - (menu->h) / 2; } void update_menu(Menu* menu) { if (button_just_pressed(btn_dpad_down)) { menu->selected++; if (menu->selected >= menu->el_count) { menu->selected = 0; } } if (button_just_pressed(btn_dpad_up)) { menu->selected--; if (menu->selected < 0) { menu->selected = menu->el_count - 1; } } if ( button_just_pressed(btn_jump) || button_just_pressed(btn_shoot) ) { menu->els[menu->selected].on_select(menu); } } void render_menu(Menu* menu, const BM_Font* font) { int i, x, y, cw, ch; const Menu_Item* el; Colour col; y = menu->y; cw = font->char_w; ch = font->char_h; col = make_colour(0xffde00, 255); for (i = 0; i < menu->el_count; i++) { el = &menu->els[i]; x = renderer_w / 2 - (cw * el->text_len) / 2; rfont_text_col(font, x, y, el->text, col); if (i == menu->selected) { rfont_char(font, x - cw, y, '>'); } y += ch; } }