Level selection menu remake

Simplified codebase and made them better looking
This commit is contained in:
KikooDX 2021-05-03 00:21:54 +02:00
parent 6056b7d22d
commit fc4c5bd156
4 changed files with 39 additions and 60 deletions

View File

@ -11,15 +11,14 @@
#define PACKBOX_PADDING_X (PACKBOX_WIDTH / 3)
#define PACKBOX_SPACING \
(PACKBOX_WIDTH - PACKBOX_PADDING_X + (DWIDTH - PACKBOX_WIDTH) / 2)
#define PACKBOX_BORDER_UNS 2
#define PACKBOX_BORDER_UNS 1
#define PACKBOX_BORDER_SEL 4
#define PACKBOX_TRANSITION_SPEED (1.0 / 40.0)
#define PACKBOX_TRANSITION_SPEED 0.0625
struct LevelSelection {
int pack_cursor;
int visual_cursor;
float transition;
float transition_speed;
float visual_cursor;
float visual_target;
};
struct LevelSelection levelselection_init(void);

View File

@ -11,43 +11,39 @@
extern const font_t font_main;
extern const font_t font_big;
static void packboxes_draw(int pack_id, int off_x);
static void packboxes_draw(int off_x, int pack_cursor);
static void packbox_draw(int x, int pack_id, int selected);
void
levelselection_draw(struct LevelSelection levelselection)
{
const float smoothed_transition =
square(abs(levelselection.transition)) *
sign(levelselection.transition);
const int off_x = smoothed_transition * PACKBOX_SPACING;
packboxes_draw(levelselection.pack_cursor, off_x);
const int off_x =
0 - (int)(levelselection.visual_cursor * PACKBOX_SPACING);
packboxes_draw(off_x, levelselection.pack_cursor);
}
static void
packboxes_draw(int pack_id, int off_x)
packboxes_draw(int off_x, int pack_cursor)
{
packbox_draw(off_x + PACKBOX_PADDING_X - PACKBOX_WIDTH, pack_id - 1, 0);
packbox_draw(off_x + (DWIDTH - PACKBOX_WIDTH) / 2, pack_id, 1);
packbox_draw(off_x + DWIDTH - PACKBOX_PADDING_X, pack_id + 1, 0);
int i;
for (i = 0; i < PACK_COUNT; i += 1)
packbox_draw(off_x + (DWIDTH - PACKBOX_WIDTH) / 2 +
PACKBOX_SPACING * i,
i, i == pack_cursor);
}
static void
packbox_draw(int x, int pack_id, int selected)
{
if (pack_id < 0)
return;
if (pack_id >= PACK_COUNT)
return;
/* draw the white borders box */
drect_border(x, PACKBOX_PADDING_Y, x + PACKBOX_WIDTH,
DHEIGHT - PACKBOX_PADDING_Y, ZX_BLACK,
selected ? PACKBOX_BORDER_SEL : PACKBOX_BORDER_UNS,
ZX_WHITE);
/* draw level number with big font */
/* draw pack number with big font */
dfont(&font_big);
dprint_opt(x + PACKBOX_WIDTH / 2, DHEIGHT / 2, ZX_WHITE, ZX_BLACK,
DTEXT_CENTER, DTEXT_MIDDLE, "%d", pack_id);
DTEXT_CENTER, DTEXT_MIDDLE, "%d", pack_id + 1);
dfont(&font_main);
}

View File

@ -9,7 +9,6 @@ levelselection_init(void)
return (struct LevelSelection){
.pack_cursor = 0,
.visual_cursor = 0,
.transition = 0.0,
.transition_speed = 0.0,
.visual_target = 0,
};
}

View File

@ -11,48 +11,33 @@
int
levelselection_update(struct LevelSelection *levelselection, struct Input input)
{
const int sign_transition_speed =
sign(levelselection->transition_speed);
/* update transition state */
if (levelselection->transition_speed != 0.0)
levelselection->transition += levelselection->transition_speed;
/* end transition if necessary */
if (levelselection->transition * -sign_transition_speed <
levelselection->transition_speed * -sign_transition_speed) {
levelselection->visual_cursor = levelselection->pack_cursor;
levelselection->transition = 0.0;
levelselection->transition_speed = 0.0;
/* decrease selected pack id */
if (input.keystates[K_LEFT] == KS_PRESS &&
levelselection->pack_cursor > 0) {
levelselection->pack_cursor -= 1;
levelselection->visual_target =
(float)levelselection->pack_cursor;
}
/* increase selected pack id */
if (input.keystates[K_RIGHT] == KS_PRESS &&
levelselection->pack_cursor < PACK_COUNT - 1) {
levelselection->pack_cursor += 1;
levelselection->visual_target =
(float)levelselection->pack_cursor;
}
if (levelselection->transition == 0.0) {
/* decrease selected pack id */
if (input.keystates[K_LEFT] &&
levelselection->pack_cursor > 0) {
levelselection->visual_cursor =
levelselection->pack_cursor;
levelselection->pack_cursor -= 1;
levelselection->transition = -1.0;
levelselection->transition_speed =
PACKBOX_TRANSITION_SPEED;
}
/* increase selected pack id */
if (input.keystates[K_RIGHT] &&
levelselection->pack_cursor < PACK_COUNT - 1) {
levelselection->visual_cursor =
levelselection->pack_cursor;
levelselection->pack_cursor += 1;
levelselection->transition = 1.0;
levelselection->transition_speed =
-PACKBOX_TRANSITION_SPEED;
}
}
/* confirm */
if (input.keystates[K_A] == KS_PRESS) {
levelselection->visual_cursor = levelselection->pack_cursor;
levelselection->transition = 0.0;
levelselection->transition_speed = 0.0;
levelselection->visual_cursor =
(float)levelselection->pack_cursor;
levelselection->visual_target = levelselection->visual_cursor;
return 1;
}
/* lerp visual cursor to visual target */
levelselection->visual_cursor +=
PACKBOX_TRANSITION_SPEED *
(levelselection->visual_target - levelselection->visual_cursor);
return 0;
}