From e85d19e8d400608602cf275ed38038d04ac1f731 Mon Sep 17 00:00:00 2001 From: LucAlexander Date: Wed, 20 Jul 2022 04:04:19 -0400 Subject: [PATCH] clickable component + fixed gui render state --- entities.c | 3 +++ entities.h | 4 +++- template/spr/pon.png | Bin 834 -> 1258 bytes xi.c | 12 +++++++++++- xi_components.c | 9 +++++++++ xi_components.h | 17 +++++++++++++++-- xi_systems.c | 24 ++++++++++++++++++++++++ xi_systems.h | 1 + 8 files changed, 66 insertions(+), 4 deletions(-) diff --git a/entities.c b/entities.c index a1bb567..800acba 100644 --- a/entities.c +++ b/entities.c @@ -251,3 +251,6 @@ uint32_t entity_furthest_n(entity_data* d, v2 pos, uint8_t exact, uint32_t n, ui return entity_furthest_mask_n(d, pos, exact, n, mask); } +void entity_add_flag(entity_data* d, uint32_t eid, uint32_t flag){ + d->flags[eid] = bit_on(d->flags[eid], flag); +} diff --git a/entities.h b/entities.h index 67eb478..5a3c718 100644 --- a/entities.h +++ b/entities.h @@ -13,7 +13,8 @@ HASHMAP(mu32u32_t, uint32_t, uint32_t) struct v2; typedef enum FLAGS{ - ENTITY_DEACTIVATED=1 + ENTITY_DEACTIVATED=1, + ENTITY_GUI=2 }FLAGS; typedef struct entity_data{ @@ -36,6 +37,7 @@ void* component_get(entity_data* d, uint32_t eid, uint32_t cid); void component_add(entity_data* d, uint32_t eid, uint32_t cid, void* data); void component_remove(entity_data* d, uint32_t eid, uint32_t cid); +void entity_add_flag(entity_data* d, uint32_t eid, uint32_t flag); uint8_t entity_active(entity_data* d, uint32_t eid); uint8_t entity_exists_mask(entity_data* d, uint8_t exact, uint64_t mask); uint8_t entity_exists(entity_data* d, uint8_t exact, uint32_t n, ...); diff --git a/template/spr/pon.png b/template/spr/pon.png index 7b2bde849a1dc47b3ae84e4c418a6072cae6bd99..877b05e8ed0b16c4c1eba5423f1dd42a74fd640f 100644 GIT binary patch literal 1258 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I4M=vMPuB%fjKx9jP7LeL$-HD>U|Hhn;uumf z=k49Sxwjo8j(tp?V9Lai6|_WDpn`E~UPKD>VQH2V3`~0(7w`t{2wch9!jKoc#E>UN zU|ENz!Ir)~%J&~1?*G4j>Y480-{5czF( zZFU>)d^F$Qf7ajTS!?k($AIhW`wzEs3aGz08@1ld^>yEROZno>a~H0Q?>o5j8)t#t zvvWItvR$lV+Ge-&^f~>=7KhmVuO-%~JCy49_Aih7xmG>lgJQ+XU49L-Z@WM5t4ypE z*^#r|vnhDOjPDOV?KyDWk3n4_l|d(azqI=S3A++GNw$mX47u&E4HX(DDB(t*{)y#$ zHTEmDHr(&K>UFY2IP;C?LMv9iGCOs;#A(IrWQ!Qy$BBEHHvfuqXOR99+j@Hc`(3}H ze44&yC71aoan*20?zEeH;E{=%DO1P2UvuJx9Xu+}Gp@BaJvOg>#p}oO|0Yhqd;h80 zeXp2e(}q`bm#&jvWaqf7VBgiFWxGqy?Oe0x=F3^x>;KlAx%+R!>3jd~b^9Nb(_io3 zoBwOKr_kpZ<)=kMMAMOJ;Q{w9ilndQF!l1}XX^-0SLOc)s$4s5z0 zFA(&F-DS$b+ncAlPQNF=!D`yFS%+Q%Lxv3FiXC zwEK6}z4}+-ef{S=fvwT|_-biAavbDB9{@&!a zlQ+%S&P`TZAoVT4dF?)6@&tkzEKy&A;=9E5UU_fACl6%b-&1GF_B`XF_ut0X<+9Eh zx$ig~7hmBu;>6}}%#gqoX?oxFdQ;))-G^4}zw--XDZ{edB3>;+{mGdDk@D^5?^sVc zx3(^TAvvlfc3$}zZrA1`JIgfYX8*ltzT%Bln`NoS+~U6%<9R3Va#Z@d^{czQ!x?GD z77U&fX8zmQz;m+|V?#B3uFHPP*Ze_?ShKik@i-`PX1yGO@%Ky{g_|T5DHY?fU0**VnAznxDV!ZrfMgvFiWJ&*qPRor|9DT;MwCgX^{J z{P8h=SsrG)Feth*+~4qvcmFR-cLqf_5El*I-?PUq^?9=1+W&uEJ4XFK|9*b+byZNl q6kXGFczx3sc9S*frhTec|8qN;uMwJa@zpj^FnYTBxvXhILO_JVcj{ImkbO{e>`0r zLn`LHy?b`!Yy*+D#EG7Ya@Qa9N+-PJwXKM8<|^Qo`~HB}Tk69x(~3Kskrun0CF)pY z3R}L|t@b(db)tcl{Dc|VJU~++pkYQzaDBpl>nqOd_uH>O`F`ipUl*4C{h588UE%rm z*KK7F<^B5~@}6E~=C)5T<9dGoVt(EW{BO_4@3z|)Q9t2H$%Z%O?NucYx7(a{dXsQv zUHsRxdi_IzL9&J~d)ll|#XL83{ z#w=3>kZE?;63?%*1qFYj8oqJVrckL$i3xwUHJ;tbxup~v3vAh`88RB`;iL+UqLOy zn)UOSGfEWijyFELy8P|0mC?KYH7EkTlELsxaY?Lv#Ox>b&aE{<=iW0PNjksjgVeUl zd9zoo+H`tnL7d0=O$OV4o1Xq$^Z9FR*3qI(%xgLsj-=gikhHem`cOE!mSIyBbHJ}@ z=dY|+$hdy|`rEp*de5Dnl%0_I#CZRp$T_&57WGw=TFcl+`gv*eYtukx4v-=3W*^S_Mu*sgC6graphics); renderSetColor(&state->graphics, 0, 0, 0, 255); run_render_systems(state, XI_STATE_RENDER); + view world = renderGetView(&state->graphics); + renderSetViewAbsolute(&state->graphics); run_render_systems(state, XI_STATE_RENDER_GUI); + renderSetView(&state->graphics, world); renderFlip(&state->graphics); tick_reset(state); } diff --git a/xi_components.c b/xi_components.c index 428b376..d9a9430 100644 --- a/xi_components.c +++ b/xi_components.c @@ -7,3 +7,12 @@ void repeater_t_init(repeater_t* wrapper, void f(SYSTEM_ARG_REQUIREMENTS), uint3 wrapper->trigger_count = count; wrapper->destroy_after = destruct; } + +void clickable_t_init(clickable_t* clicker, void f(SYSTEM_ARG_REQUIREMENTS), int32_t recharge_time, uint32_t w, uint32_t h){ + clicker->f = f; + clicker->recharge_counter = 0; + clicker->recharge_time = recharge_time; + clicker->toggle = 0; + clicker->w = w; + clicker->h = h; +} diff --git a/xi_components.h b/xi_components.h index 896fca3..7f0294e 100644 --- a/xi_components.h +++ b/xi_components.h @@ -10,7 +10,8 @@ BLITABLE_C,/*Blitable*/\ BEHAVIOR_C,/*logic_t*/\ REPEATER_C,/*repeater_t*/\ - ANIMATOR_C/*animator_t*/ + ANIMATOR_C,/*animator_t*/\ + CLICKABLE_C/*clickable_t*/ #define COMPONENT_SIZES\ sizeof(v2),\ @@ -18,7 +19,8 @@ sizeof(Blitable),\ sizeof(logic_t),\ sizeof(repeater_t),\ - sizeof(animator_t)\ + sizeof(animator_t),\ + sizeof(clickable_t)\ USER_COMPONENT_SIZES typedef enum COMPONENTS{ @@ -40,4 +42,15 @@ typedef struct repeater_t{ void repeater_t_init(repeater_t* wrapper, void f(SYSTEM_ARG_REQUIREMENTS), uint32_t interval_time, uint32_t count, uint8_t destroy); +typedef struct clickable_t{ + void (*f)(SYSTEM_ARG_REQUIREMENTS); + int32_t recharge_counter; + int32_t recharge_time; + uint8_t toggle; + uint32_t w; + uint32_t h; +}clickable_t; + +void clickable_t_init(clickable_t* clicker, void f(SYSTEM_ARG_REQUIREMENTS), int32_t recharge_time, uint32_t w, uint32_t h); + #endif diff --git a/xi_systems.c b/xi_systems.c index 5b0e207..48eca88 100644 --- a/xi_systems.c +++ b/xi_systems.c @@ -37,6 +37,30 @@ SYSTEM(repeater_s){ } } +SYSTEM(clickable_s){ + ARG(v2* position, POSITION_C); + ARG(clickable_t* button, CLICKABLE_C); + if (button->recharge_counter > 0){ + button->recharge_counter -= xi->ticks; + } + v2 mouse = mousePos(xi->user_input); + v4 bounds = { + position->x, + position->y, + button->w, + button->h + }; + if ( + pointInRectV2(mouse, bounds) && + mousePressed(xi->user_input, 1) && + button->recharge_counter <= 0 + ){ + button->toggle = !button->toggle; + button->recharge_counter = button->recharge_time; + button->f(SYSTEM_ARGS); + } +} + SYSTEM(animate_s){ ARG(Blitable* sprite, BLITABLE_C); ARG(animator_t* animation, ANIMATOR_C); diff --git a/xi_systems.h b/xi_systems.h index 0818d25..aab8e81 100644 --- a/xi_systems.h +++ b/xi_systems.h @@ -11,6 +11,7 @@ SYSTEM(blitable_s); SYSTEM(behavior_s); SYSTEM(repeater_s); +SYSTEM(clickable_s); SYSTEM(animate_s);