X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fmenuscr.c;h=22846f40d730f173b96dadf1f585c80bd419bc1b;hb=070956bc54dbfedca82aee3e05f5723af63089ed;hp=846bee428132a14b41907ca5bb2bc28cc04e270c;hpb=046fa888e4df754a20736303c27f497163edf4db;p=eradicate diff --git a/src/menuscr.c b/src/menuscr.c index 846bee4..22846f4 100644 --- a/src/menuscr.c +++ b/src/menuscr.c @@ -1,20 +1,37 @@ #include +#include +#include #include "screens.h" #include "imago2.h" #include "gfx.h" #include "gfxutil.h" #include "game.h" +#include "util.h" -static void *bgpix; +#define PADX 42 +#define PADX2 (PADX * 2) +#define PADY 16 +#define PADY2 (PADY * 2) + +static const struct menuent { + int x, y, len, height; +} menuent[] = { + {252 - PADX, 281 - PADY, 147 + PADX2, 37 + PADY2}, + {244 - PADX, 344 - PADY, 161 + PADX2, 37 + PADY2}, + {276 - PADX, 407 - PADY, 102 + PADX2, 38 + PADY2} +}; + +static int cur; + +static uint16_t *bgpix; static int bgwidth, bgheight; int menu_init(void) { - if(!(bgpix = img_load_pixels("data/menbg640.png", &bgwidth, &bgheight, IMG_FMT_RGB24))) { + if(!(bgpix = img_load_pixels("data/menbg640.png", &bgwidth, &bgheight, IMG_FMT_RGB565))) { fprintf(stderr, "failed to load menu bg image\n"); return -1; } - convimg_rgb24_rgb16(bgpix, bgpix, bgwidth, bgheight); return 0; } @@ -25,22 +42,85 @@ void menu_cleanup(void) void menu_start(void) { + draw = menu_draw; + key_event = menu_keyb; + + memcpy(fb_pixels, bgpix, fb_size); } void menu_stop(void) { } + +#define BBW 256 +#define BBH 64 + void menu_draw(void) { - blit_frame(bgpix, 1); + static uint16_t blurbuf[2][BBW * BBH]; + int fboffs, tmp, cleartop; + const struct menuent *ent = menuent + cur; + + int blur_rad_x = (int)((sin(time_msec / 1000.0f) * 0.5f + 0.5f) * 50.0f); + int blur_rad_y = (int)((cos(time_msec / 1000.0f) * 0.5f + 0.5f) * 50.0f); + + fboffs = ent->y * fb_width + ent->x; + + memset(blurbuf[0], 0, sizeof blurbuf[0]); + blit(blurbuf[0], BBW, bgpix + fboffs, ent->len, ent->height, bgwidth); + + blur_horiz(blurbuf[1], blurbuf[0], BBW, BBH, blur_rad_x + 3, 0x140); + blur_vert(blurbuf[0], blurbuf[1], BBW, BBH, blur_rad_y / 4 + 3, 0x140); + + //wait_vsync(); + + cleartop = 280 * fb_width; + memcpy(fb_pixels + cleartop, bgpix + cleartop, (fb_height - 280) * fb_width << 1); + + blit(fb_pixels + fboffs, fb_width, blurbuf[0], ent->len, ent->height, BBW); + blit_key(fb_pixels + fboffs, fb_width, bgpix + fboffs, ent->len, ent->height, bgwidth, 0); + + if(show_fps) { + blit(fb_pixels, fb_width, bgpix, 64, 16, bgwidth); + } + + blit_frame(fb_pixels, 0); } void menu_keyb(int key, int pressed) { + if(!pressed) return; + switch(key) { case 27: game_quit(); break; + + case KB_UP: + if(cur > 0) cur--; + break; + + case KB_DOWN: + if(cur < sizeof menuent / sizeof *menuent - 1) { + cur++; + } + break; + + case '\n': + case '\r': + switch(cur) { + case 0: + /* enter game */ + break; + + case 1: + //options_start(); + break; + + case 2: + game_quit(); + break; + } } }