From: Wintermute Date: Mon, 21 Oct 2013 19:53:33 +0000 (+0200) Subject: Screen nach Sterben/gewinnen, um Pause zu zwingen (damit viel Button-Gepresse X-Git-Url: https://git.rohieb.name/hackover2013-badge-firmware.git/commitdiff_plain/fa26b9fa0155f1b5ede96fe35e688f14bec299bc Screen nach Sterben/gewinnen, um Pause zu zwingen (damit viel Button-Gepresse nicht gleich wieder in den Level geht). --- diff --git a/badge/jumpnrun/jumpnrun.c b/badge/jumpnrun/jumpnrun.c index 0ebc9df..36a5261 100644 --- a/badge/jumpnrun/jumpnrun.c +++ b/badge/jumpnrun/jumpnrun.c @@ -16,12 +16,11 @@ #include #include -static vec2d const gravity = { FIXED_POINT_I(0, 0), FIXED_POINT_I(0, 56) }; -static vec2d const move_max = { FIXED_POINT_I(0, 600), FIXED_POINT_I(1, 300) }; -static fixed_point const accel_horiz = FIXED_POINT_I(0, 50); -static fixed_point const accel_vert = FIXED_POINT_I(0, 167); -static fixed_point const drag_factor = FIXED_POINT_I(0, 854); -static fixed_point const speed_jump_x = FIXED_POINT_I(0, 600); +static vec2d const gravity () { return (vec2d) { FIXED_POINT(0, 0), FIXED_POINT(0, 56) }; } +static vec2d const move_max () { return (vec2d) { FIXED_POINT(0, 600), FIXED_POINT(1, 300) }; } +static fixed_point const accel_horiz () { return FIXED_POINT(0, 50); } +static fixed_point const accel_vert () { return FIXED_POINT(0, 167); } +static fixed_point const drag_factor () { return FIXED_POINT(0, 854); } static inline int imax(int x, int y) { return x < y ? y : x; @@ -81,15 +80,15 @@ jumpnrun_tile_range jumpnrun_visible_tiles(jumpnrun_level const *lv, } void jumpnrun_apply_gravity(vec2d *inertia) { - *inertia = vec2d_add(*inertia, gravity); + *inertia = vec2d_add(*inertia, gravity()); } void jumpnrun_passive_movement(vec2d *inertia) { jumpnrun_apply_gravity(inertia); - inertia->x = fixed_point_min(fixed_point_max(fixed_point_neg(move_max.x), inertia->x), move_max.x); - inertia->y = fixed_point_min(fixed_point_max(fixed_point_neg(move_max.y), inertia->y), move_max.y); + inertia->x = fixed_point_min(fixed_point_max(fixed_point_neg(move_max().x), inertia->x), move_max().x); + inertia->y = fixed_point_min(fixed_point_max(fixed_point_neg(move_max().y), inertia->y), move_max().y); } static void jumpnrun_apply_movement(jumpnrun_level const *lv, @@ -100,18 +99,18 @@ static void jumpnrun_apply_movement(jumpnrun_level const *lv, (BADGE_EVENT_KEY_LEFT | BADGE_EVENT_KEY_RIGHT)) { case BADGE_EVENT_KEY_LEFT: - // state->player.base.inertia.x = state->player.touching_ground ? fixed_point_sub(state->player.base.inertia.x, accel_horiz) : fixed_point_neg(speed_jump_x); - state->player.base.inertia.x = fixed_point_sub(state->player.base.inertia.x, accel_horiz); + // state->player.base.inertia.x = state->player.touching_ground ? fixed_point_sub(state->player.base.inertia.x, accel_horiz()) : fixed_point_neg(speed_jump_x()); + state->player.base.inertia.x = fixed_point_sub(state->player.base.inertia.x, accel_horiz()); state->player.base.flags |= JUMPNRUN_MOVEABLE_MIRRORED; break; case BADGE_EVENT_KEY_RIGHT: - // state->player.base.inertia.x = state->player.touching_ground ? fixed_point_add(state->player.base.inertia.x, accel_horiz) : speed_jump_x; - state->player.base.inertia.x = fixed_point_add(state->player.base.inertia.x, accel_horiz); + // state->player.base.inertia.x = state->player.touching_ground ? fixed_point_add(state->player.base.inertia.x, accel_horiz()) : speed_jump_x(); + state->player.base.inertia.x = fixed_point_add(state->player.base.inertia.x, accel_horiz()); state->player.base.flags &= ~JUMPNRUN_MOVEABLE_MIRRORED; break; default: if(jumpnrun_moveable_touching_ground(&state->player.base)) { - state->player.base.inertia.x = fixed_point_mul(state->player.base.inertia.x, drag_factor); + state->player.base.inertia.x = fixed_point_mul(state->player.base.inertia.x, drag_factor()); } //else { //state->player.base.inertia.x = FIXED_INT(0); //} @@ -122,7 +121,7 @@ static void jumpnrun_apply_movement(jumpnrun_level const *lv, if(state->player.base.jumpable_frames == 0) { // intentionally left blank. } else if(badge_event_current_input_state() & BADGE_EVENT_KEY_BTN_A) { - state->player.base.inertia.y = fixed_point_sub(state->player.base.inertia.y, accel_vert); + state->player.base.inertia.y = fixed_point_sub(state->player.base.inertia.y, accel_vert()); --state->player.base.jumpable_frames; } else { state->player.base.jumpable_frames = 0; @@ -286,7 +285,15 @@ uint8_t jumpnrun_play_level(char const *lvname) { } } while((gs.flags & JUMPNRUN_STATE_WON) == 0 && gs.player.lives-- != 0); - if(gs.flags & JUMPNRUN_STATE_WON) { return JUMPNRUN_WON; } - if(gs.player.lives == 0) return JUMPNRUN_LOST; + if(gs.flags & JUMPNRUN_STATE_WON) { + jumpnrun_show_you_rock(); + return JUMPNRUN_WON; + } + + if(++gs.player.lives == 0) { + jumpnrun_show_game_over(); + return JUMPNRUN_LOST; + } + return JUMPNRUN_ERROR; } diff --git a/badge/jumpnrun/stats.c b/badge/jumpnrun/stats.c index 9450d57..25cd04d 100644 --- a/badge/jumpnrun/stats.c +++ b/badge/jumpnrun/stats.c @@ -47,3 +47,31 @@ void jumpnrun_show_lives_screen(jumpnrun_game_state const *state) { } } } + +static void jumpnrun_show_message(char const *msg) { + badge_framebuffer fb = { { { 0 } } }; + + size_t len = strlen(msg); + size_t wid = len * BADGE_FONT_WIDTH; + size_t off = (BADGE_DISPLAY_WIDTH - wid + 1) / 2; + + badge_framebuffer_render_text(&fb, off, BADGE_DISPLAY_HEIGHT / 2 - BADGE_FONT_WIDTH, msg); + badge_framebuffer_flush(&fb); + + for(uint8_t i = 0; i < 75; ) { + badge_event_t ev = badge_event_wait(); + if(badge_event_type(ev) == BADGE_EVENT_GAME_TICK) { + ++i; + } + } +} + +void jumpnrun_show_game_over(void) { + char msg[] = "GAME OVER"; + jumpnrun_show_message(msg); +} + +void jumpnrun_show_you_rock (void) { + char msg[] = "YOU ROCK!!1!"; + jumpnrun_show_message(msg); +} diff --git a/badge/jumpnrun/stats.h b/badge/jumpnrun/stats.h index 170e130..b4ffb02 100644 --- a/badge/jumpnrun/stats.h +++ b/badge/jumpnrun/stats.h @@ -4,5 +4,7 @@ #include "game_state.h" void jumpnrun_show_lives_screen(jumpnrun_game_state const *state); +void jumpnrun_show_game_over(void); +void jumpnrun_show_you_rock (void); #endif