From b03e459b83c90c60f42ba5c629573fcd800af292 Mon Sep 17 00:00:00 2001 From: attilavs2 Date: Wed, 26 Feb 2025 12:02:13 +0100 Subject: [PATCH] Menu principal "fonctionel" --- src/.ui.c.swo | Bin 0 -> 16384 bytes src/draw.c | 6 ++- src/draw.h | 6 +++ src/game.c | 2 +- src/main.c | 26 +---------- src/ui.c | 121 ++++++++++++++++++++++++++++++++++++++++++++------ src/ui.h | 37 +++++++++++---- 7 files changed, 148 insertions(+), 50 deletions(-) create mode 100644 src/.ui.c.swo diff --git a/src/.ui.c.swo b/src/.ui.c.swo new file mode 100644 index 0000000000000000000000000000000000000000..6bda758b27b7c5f1f65cca4c91416758c4bc185f GIT binary patch literal 16384 zcmeI2Yit}>6@aJdBZRaRQK3{#pf`?Ut)21u5mdlQjELLHdf~W+PLyABMEsP`tj3_fo)j0gXEZsw2c?=*(5H;k+=!mEF> zen-Zh?(XTx2XlIyD|9)L^*aZ=bg5vwL9uh*aWme0v2(<6?UHXzETlcp?JWA~&XSW% zUtx$?99tl^z-zHUDadxb=O$xoPq$9dO)VSMEpMBAEhEK!Vhh9;h%FFXAhtkkf!G4E z1!4=t7I=eNAedWaoJ99kk^a5W@tTI?wb6MYI&N*a9-YRA*aEQyVhh9;h%FFXAhtkk zf!G4E1!4=t7KkknTi}1t0;!B)tbQ}BMLGWeU*7+}c(Y+#geTx@a28I(N1+5C1Pg|t z7ZPwQtb^;}I=Ju_!&rjDa1ic-b?~#B4C4{F7hJd-axeq$f{k!Hyc5>Ig&PgyQFs78 z1SvQShhP`4m<|u;EQlS zd>lRo$3VXKVZsKu6<)c{FfPL-cn%(gPeB&;!CF`iH^562iGBj#hO=-F%)mbAfer94 z3QfO(^Y9RyhI?VjP<&=m1-qkfE>$Yp8MQ-gtUcdG3n!ZxD(S^4_M=E zZ8d$}-bv4jfACz%u`-^e<0V7Af^<571WTFOW!DW;j5v9hxq7yito1oPZ&&lY1_`aCf&16)&=*t~+ z#QAnm@?AADHo1S$+BrEfF*a(AP7V*tEXoFn+BlV&4Hfl$c9w#`bIXzFXwzpsKOu@c z=+m{0!}ca)D`(3V6p(f`Q>xcUNBMw6E1ENrY0t~6asW$D5!ZFuro@YLJ{PlzmaJED zGiu)RXKnwW+rkK3R4SZ{%mjaIl*`)pIF)v)T?CP#!>(4=_X^_WL~H2gP+T+>vT)GQ zOx1xKbtt6LIlkegHfPYol(UXLCqv&bN;sE!C^ZtbYnLWvZ-=sFT0~>ksxjcF=J(m@ zAmz^F?E?waGgX2RXr~F=uyj+_m zO*AugW`ue5x+$r3+-omPi;9F68u5FnUL_;M0Tc{LGvAbq8q9LS(&$9)w?&u~m52Q2y#h*FJ3=UJILyAKfuyXH%to5H={z zJ3%^^(5BJBf+7 zW~a|}%IiS3(q29<7Mu2tM!t|ZjGi7fR;l(=$B(OxHLeWjJ*9_Z;UHjU2wca_ddVnR z?s5)^gPJUf4J|E~l~ON>_*K@qYCr_OxLpgIrC@D()TLiTO!nvO^lU$Kc8WY0#y!?Z z)(RF0{xEfNEB#q+uSQjIiF3qeYBK*OQ=1wZ*gZI5jh1JmSDOrLlNIS-lR;%A%lE*B ziQSV!L)frwaZxY0Q7==q7E+FD@x|E^YsR9^6B9d?Y)<8YMW*UoIj$2}B`2ZB7V{^k z^tAE{NTXHf{d5E_yUeSH~`}YkFj#^W-PK;!GmX_&GB(I>iWJ;8E z6$flHj7^T4&X+Q_YT?`Hxt5x935R-#c(h(3>vB;<)qdOk)B-DYE}84A7v`O5k<|#7 zH!B7iSp@6*76V@PW*TJ~*0kj^Z<#2%t?d6#v3DD1zbO0vLR6!8mi_w=;p^}SJPZ%P z5@cZry5Sahfj#}N;Cc88d=fkuhV3AG{#V$?zX;!hZ$JSiVHe1rU-tW#*uVb{ehQDn z88{6`!H0ve4c-l#VH32#KiR*_KL4}u88{1f!)Cb5zWpEYGCT!O!sp?0kbyKzfe8vW zz9N!Qm8%O<&yr%Zu6LC$Z&zJmIW!V;&{d{#nWDZ^cvbhQ sDQt!%*-G&v`j12T{}Jrz%hkeiU0iChQrU<~>QTCdg>bp>Dhss#21AMP_y7O^ literal 0 HcmV?d00001 diff --git a/src/draw.c b/src/draw.c index 5024bc7..a81cc4c 100644 --- a/src/draw.c +++ b/src/draw.c @@ -28,6 +28,8 @@ char *tex_files[TEX_N] = { Texture2D tex_index[TEX_N]; +extern GUIInfo gui_info; + int init_draw(){ InitWindow(1280, 720, "Mineur Tycoon"); @@ -63,12 +65,14 @@ void draw_machines(Game *game){ } } -void draw(Game *game){ +void draw_game(Game *game){ BeginMode2D(game->camera); draw_machines(game); draw_workers(game); EndMode2D(); +} +void draw(Game *game){ draw_widgets(game); DrawFPS(0,0); diff --git a/src/draw.h b/src/draw.h index d14ba63..add5f10 100644 --- a/src/draw.h +++ b/src/draw.h @@ -12,6 +12,12 @@ #pragma once +// Internal (game) res +#define SCREEN_W 1280 +#define SCREEN_H 720 + int init_draw(); +void draw_game(Game *game); + void draw(Game *game); diff --git a/src/game.c b/src/game.c index abc95e7..d97aeea 100644 --- a/src/game.c +++ b/src/game.c @@ -44,7 +44,7 @@ int init_game(Game *game){ srand(rand_seed); - game->paused = false; + game->paused = true; game->ttime = 0; game->camera = (Camera2D){.offset = {0, 0}, .zoom = 1}; diff --git a/src/main.c b/src/main.c index a1de1e5..9bcccc5 100644 --- a/src/main.c +++ b/src/main.c @@ -18,6 +18,7 @@ int init(Game *game){ int err = init_draw(); err |= init_game(game); + init_ui(); return err; } @@ -27,31 +28,6 @@ void clean(Game *game){ CloseWindow(); } -bool keydown(int key){ - return IsKeyDown(key); -} - -void get_keys(Game *game){ - V2d mouse = GetMousePosition(); - if(IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) - try_interface(game, GetScreenToWorld2D(mouse,game->camera)); - - if(keydown(KEY_W)) - game->camera.target.y -= 3; - if(keydown(KEY_S)) - game->camera.target.y += 3; - if(keydown(KEY_A)) - game->camera.target.x -= 3; - if(keydown(KEY_D)) - game->camera.target.x += 3; - if(keydown(KEY_UP)) - game->camera.zoom *= 1.1; - if(keydown(KEY_DOWN)) - game->camera.zoom *= 1/1.1; - if(IsKeyPressed(KEY_P)) - game->paused = !game->paused; -} - int main(){ Game game; diff --git a/src/ui.c b/src/ui.c index 19ad875..969a217 100644 --- a/src/ui.c +++ b/src/ui.c @@ -13,42 +13,100 @@ #include "draw.h" #include "ui.h" -void main_menu_draw(Widget *widget, Game *game){ - printf("main mem draw\n"); +GUIInfo gui_info; - widget->refresh = false; +void main_menu_draw(Widget *widget, Game *game){ + DrawRectangleRec((Rectangle){.x = 0, .y = 0, .width = SCREEN_W, .height = SCREEN_H} + , WHITE); } -void main_menu_do_key(Widget *widget, Game *game, int key){ +void main_menu_do_event(Widget *widget, Game *game, MTEvent event){ + if(event.type == EV_Mouse && event.click == MOUSE_BUTTON_LEFT){ + gui_info.widget_active[0] = true; + gui_info.widget_active[1] = false; + game->paused = false; + } +} +void widget_draw_game(Widget *widget, Game *game){ + draw_game(game); } Widget main_menu = { .box = {.x = 0, .y = 0, .width = -1, .height = -1}, .draw = &main_menu_draw, - .do_key = &main_menu_do_key, - .refresh = true, - .capt_flags = CF_Mouse | CF_Keyboard, + .do_event = &main_menu_do_event, + .capt_flags = CF_Mouse | CF_Keyb, .buttons = {} }; -GUIInfo gui_info = {{&main_menu}, 1, 0, NULL}; +Widget game_widget = { + .box = {0,0,0,0}, + .draw = &widget_draw_game, + .do_event = NULL, + .capt_flags = 0, + .buttons = {} +}; + +void init_ui(){ + gui_info = (GUIInfo){{&game_widget, &main_menu}, {false, true}, NULL}; +} void draw_widgets(Game *game){ - for(int i = 0; i < gui_info.widget_n; i++){ + for(int i = 0; i < WIDGET_N; i++){ + if(!gui_info.widget_active[i]) + continue; Widget *w = gui_info.widgets[i]; - if(w->draw && w->refresh) + if(w->draw) w->draw(w, game); } } -void widgets_treat_key(Game *game, int key){ +bool widget_coll(Rectangle widget, V2d point){ + if(widget.width < 0) + widget.width = SCREEN_W; + if(widget.height < 0) + widget.height = SCREEN_H; + return CheckCollisionPointRec(point, widget); +} + +bool widgets_treat_event(Game *game, MTEvent event){ + bool treated = true; for(int i = 0; i < WIDGET_N; i++){ - Widget *w = gui_info.widgets[i]; - if(!w->do_key) + if(!gui_info.widget_active[i]) continue; - w->do_key(w, game, key); + Widget *w = gui_info.widgets[i]; + if(!w || !w->do_event) + continue; + if(!widget_coll(w->box, event.pos)) + continue; + // Only actually call do_key if the event type matches event flags + switch(event.type){ + default: + continue; + case EV_Mouse: + if(w->capt_flags & ~CF_Mouse) + break; + continue; + case EV_Keyb: + if(w->capt_flags & ~CF_Keyb) + break; + continue; + } + treated = false; + w->do_event(w, game, event); } + return treated; +} + +bool ui_do_key(Game *game, int key){ + MTEvent event = {.type = EV_Keyb, {.key = key}}; + return widgets_treat_event(game, event); +} + +bool ui_do_mouse(Game *game, V2d pos, int click){ + MTEvent event = {.type = EV_Mouse, {.click = click}, .pos = pos}; + return widgets_treat_event(game, event); } void try_interface(Game *game, V2d pos){ @@ -72,3 +130,38 @@ void try_interface(Game *game, V2d pos){ return; } +bool keydown(int key){ + return IsKeyDown(key); +} + +int get_mouse(){ + for(int i = 0; i < MOUSE_BUTTON_NULL; i++){ + if(IsMouseButtonPressed(i)) + return i; + } + return MOUSE_BUTTON_NULL; +} + +void get_keys(Game *game){ + V2d mouse_pos = GetMousePosition(); + int mouse_click = get_mouse(); + if(ui_do_mouse(game, mouse_pos, mouse_click)){ + if(mouse_click == MOUSE_BUTTON_LEFT) + try_interface(game, GetScreenToWorld2D(mouse_pos,game->camera)); + } + + if(keydown(KEY_W)) + game->camera.target.y -= 3; + if(keydown(KEY_S)) + game->camera.target.y += 3; + if(keydown(KEY_A)) + game->camera.target.x -= 3; + if(keydown(KEY_D)) + game->camera.target.x += 3; + if(keydown(KEY_UP)) + game->camera.zoom *= 1.1; + if(keydown(KEY_DOWN)) + game->camera.zoom *= 1/1.1; + if(IsKeyPressed(KEY_P)) + game->paused = !game->paused; +} diff --git a/src/ui.h b/src/ui.h index 252b6a2..205d5e1 100644 --- a/src/ui.h +++ b/src/ui.h @@ -13,18 +13,35 @@ #pragma once #define WIDGET_N 16 +#define MOUSE_BUTTON_NULL 7 enum CaptureFlags { - CF_None = 0x0, - CF_Arrows = 0x2, - CF_Mouse = 0x4, //Mouse clicks - CF_Keyboard = 0x8 + CF_None = 0x0, + CF_Mouse = 0x2, //Mouse clicks + CF_Keyb = 0x4 }; +enum EventTypes { + EV_None = 0, + EV_Mouse = 1, + EV_Keyb = 2 +}; + +typedef struct { + + int type; + union { + int key; + int click; + }; + V2d pos; + +} MTEvent; + struct Widget; typedef void (widget_filler_t)(struct Widget*, Game*); -typedef void (widget_dokey_t)(struct Widget*, Game*, int); +typedef void (widget_event_t)(struct Widget*, Game*, MTEvent); typedef void (button_handler_t)(void); typedef struct { @@ -41,8 +58,7 @@ typedef struct Widget { Rectangle box; widget_filler_t *draw; - widget_dokey_t *do_key; - bool refresh; + widget_event_t *do_event; int capt_flags; Button buttons[10]; @@ -51,14 +67,17 @@ typedef struct Widget { typedef struct { Widget *widgets[WIDGET_N]; - int widget_n; + bool widget_active[WIDGET_N]; - int active_widget; float *zoom; } GUIInfo; +void init_ui(); + void draw_widgets(Game *game); // World pos void try_interface(Game *game, V2d pos); + +void get_keys(Game *game);