diff --git a/CMakeLists.txt b/CMakeLists.txt index 9fb3431..b62646e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,9 +14,11 @@ set(SOURCES src/render.c src/physics.c src/text.c + src/menu.c ) set(ASSETS assets-cg/font.png + assets-cg/title.png assets-cg/level/level1.txt assets-cg/level/level2.txt assets-cg/level/level3.txt diff --git a/assets-cg/fxconv-metadata.txt b/assets-cg/fxconv-metadata.txt index 712b664..65682bc 100644 --- a/assets-cg/fxconv-metadata.txt +++ b/assets-cg/fxconv-metadata.txt @@ -7,3 +7,8 @@ font.png: grid.border: 0 proportional: true height: 10 + +title.png: + type: bopti-image + name: img_title + profile: p4 diff --git a/assets-cg/title.png b/assets-cg/title.png new file mode 100644 index 0000000..5c5d681 Binary files /dev/null and b/assets-cg/title.png differ diff --git a/src/duet.h b/src/duet.h index 2b534f7..2eec052 100644 --- a/src/duet.h +++ b/src/duet.h @@ -105,7 +105,7 @@ void dtriangle(int x1, int y1, int x2, int y2, int x3, int y3, int color); void drectoid(rect_t const *r, int color); -void render_player(float angle); +void render_player(int x, int y, float angle); //--- // Duet Text @@ -137,3 +137,10 @@ void rect_physics(rect_t *r, rectmeta_t const *meta, float time); extern level_t level1, level2, level3, level4; extern level_t level5, level6, level7, level8; extern level_t level9, level10; + +//--- +// Menu +//--- + +/* Main menu, returns selected level or -1. */ +int main_menu(void); diff --git a/src/main.c b/src/main.c index bce8bcb..bf5bc1a 100644 --- a/src/main.c +++ b/src/main.c @@ -55,7 +55,7 @@ int main(void) &level1, &level2, &level3, &level4, &level5, &level6, &level7, &level8, &level9, &level10, NULL, }; - int story_position = 5; + int story_position = main_menu(); game_t game; load_level(&game, story_levels[story_position]); @@ -189,7 +189,7 @@ int main(void) } } - render_player(game.player_rota); + render_player(PLAYER_X, DHEIGHT/2, game.player_rota); for(int i = 0; i < game.rect_count; i++) drectoid(&game.rects[i], C_WHITE); dupdate(); diff --git a/src/menu.c b/src/menu.c new file mode 100644 index 0000000..05e75d6 --- /dev/null +++ b/src/menu.c @@ -0,0 +1,49 @@ +#include +#include +#include +#include + +#include "duet.h" + +extern bopti_image_t img_title; + +int main_menu(void) +{ + volatile int need_frame = 1; + int timer = timer_configure(TIMER_ANY, 33000, GINT_CALL_SET(&need_frame)); + timer_start(timer); + + float time = 0; + int selected_level = 0; + + while(1) { + time += 1.0 / 30; + + /* Keyboard input */ + + key_event_t e; + bool input_finished = false; + + while((e = pollevent()).type != KEYEV_NONE) { + if(e.type == KEYEV_DOWN && e.key == KEY_MENU) + gint_osmenu(); + if(e.type == KEYEV_DOWN && e.key == KEY_EXE) { + input_finished = true; + break; + } + } + if(input_finished) + break; + + /* Rendering */ + + dclear(C_BLACK); + dimage(330, DHEIGHT/2 - img_title.height / 2, + &img_title); + render_player(265, DHEIGHT/2, time * 0.8); + dupdate(); + } + + timer_stop(timer); + return selected_level; +} diff --git a/src/render.c b/src/render.c index 994be93..989da57 100644 --- a/src/render.c +++ b/src/render.c @@ -105,14 +105,18 @@ void drectoid(rect_t const *r, int color) dtriangle(x[2], y[2], x[3], y[3], x[0], y[0], color); } -void render_player(float angle) +void render_player(int x, int y, float angle) { - int x=PLAYER_X, y=DHEIGHT/2; dcircle(x, y, PLAYER_R, C_RGB(10, 10, 10), false); float x1, y1, x2, y2; player_position(angle, &x1, &y1, &x2, &y2); + x1 = x1 - PLAYER_X + x; + y1 = y1 - DHEIGHT/2 + y; + x2 = x2 - PLAYER_X + x; + y2 = y2 - DHEIGHT/2 + y; + dcircle(x1, y1, PLAYER_SIZE, C_RGB(0, 16, 26), true); dcircle(x2, y2, PLAYER_SIZE, C_RGB(31, 6, 0), true); }