mirror of https://git.sr.ht/~kikoodx/momento
Level selection menu remake
Simplified codebase and made them better looking
This commit is contained in:
parent
6056b7d22d
commit
fc4c5bd156
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue