From bf543330e557a6b4f05ac4cce816cfe06058e39b Mon Sep 17 00:00:00 2001 From: Klemen Plestenjak Date: Sun, 12 Nov 2023 19:04:25 +0100 Subject: [PATCH] Add basic movement --- assets/entities.png | Bin 19549 -> 19556 bytes game/components.h | 2 ++ game/game_state.h | 2 ++ game/main.c | 5 ++++- game/map_init.c | 6 +++--- game/systems/animations.c | 3 +++ game/systems/entity_renderer.c | 5 ++++- game/systems/systems.h | 34 +++++++++++++++++++++++++++++++++ rawAssets/entities.kra | Bin 102994 -> 113949 bytes rawAssets/entities.png | Bin 19549 -> 19556 bytes 10 files changed, 52 insertions(+), 5 deletions(-) diff --git a/assets/entities.png b/assets/entities.png index 1961067b29d699671e68dd687e3d7c2d8905f211..eb4ee937d77060fba48b7a108f0601e855ab3494 100644 GIT binary patch delta 1616 zcmZ9Mc{J2(7{`CZL}L#vS28L@Wo@is$U24*Swgl#bFW51j4Z$5>X7X+Q+6q9_sVi2 zXCgC0jpY!+G$9Q`D3X!k7G|!l+qvnF_nh~f_xYaZ`F_s#dB^i0(|M3A9kBld)c-&y zvIR@G^Azs(mvoc3t!ns4LZh%zHLa(2VWGCbd#Lvcu{!M9SqV0q*#^>FpE%oP6W_eq zY_^?>&KPx=FMbV*`c6KBhh5jjtKV~v;XPdSaIWDkfj6$%UN zIG?_fmCHXkP(N__tp(MFU~scglHAQ?@i9(Ppq%rGyEXW8^{Uol8>?Z;D6xySWHFivE5atroO1}l0v*Yd^SLgO%I#G726uZWT_)oSjYh8po)MN8*c&zZL;N`ShzbMHY)A93ceZgw1=K-*Rr@fQ4QGy>&a>M0rypoDwz=ghyZlAl;Xb^9MoE68YjKo| zAib{Bag{sIs5wZdh)SlRNPu@8YbM|UdWQrWq+B0eKWR@xnowL^;Mv1h5!zX}=d(=5 zhj+U9j;Gz%3o_S0cEdGXL@Vzhh8PL^uh(`{Gp_^+jL-zbM^>&a#B<(#ETmBAG1t+| zdFG+2sqb@b*V3Ls-K=*Vmsw(Wxxh9?7fX6>lu7e8uDqGpGUIa$BmcjVZ-N0!Kdit# zoB(f{4p!;#YFo#sYg1Eg)Kmt8v7D309y0}|?3nZVZBZwGK(M9E%cTt{0NDg;{8wM! z4ciIOFfImriQ0zg5CW@0Ox0KlSIYVb%|6t=1BWbj!iY~YV~G&>GD~6m`L+|)?wrC1 zjXL&au-Kapr*{T-rncdo#CpoKiN>#Y7{oR zzL(Yr16TZpS>PBaPQdTtAJ+1rtG#cR$Nygc=$7O&G~I&Q$TLo1h%g4rd5EcV$=?Us zcGm0Zhm|BaL5@QDl*l2;tFC(M)uwQFr1U!ZYl(7*MT*S=QmUexA~5v4t|Mc1Pn6b7 zxvSXqIC+~N$begu&8XE+Ld^=H%|-X44dWHeJHAg}L{Iffl59lV`HvujJ*%Q_R#qMo|D*Rhn z-75&yeC*{T@NRHuP$gc2TZd6XWPHMt?h9kV0nPfr`Bfid@{SB|0TVqgb&Fp{h386= z0MQ#n@w6QfbG#I#dAaTq+*P=V8wPk9!+)hj3j>wY@9rqu=b%X9U*N&JsW5`o>7I_A z*+Q$IHFDs|w3`Cx%{yB79a%q*NO0=rmu9@g|FkiKqU1s9iZ29ca1suZBhiFf#75e^ zvj9L5Kv|l*G-L~@9BiNojY44j^&R ft|S6FbAN(~)az1}WNS=E=(l&26~?mmj9=nEDCoB+ delta 1613 zcmZ8hdoLW-63zR2GKqw*>5S2BF zQK_}Xmgw|hgiLQpjUl$-E&JLMYy;O<@;2AMB>KDtHOgvAZ~4K12C>Xlt~pP>$oPS^ z`YOJj$#Ucx<=)x^+1)a3;0wA4Z|JtwPs3W`9r|de7nS3-V>;Ox7%{fEm7=^o@969; z>Ry@Y`HlR+6x>OoCpTsiEa8)4iC$v65GyVh7`$|=Fr21q8Z~i9Ef1BXFE(z`^H)g> zE+x4?>)fX*zb8|vS!gBm^uq;5#@iev{Z98s2X$F@-AhmKEz1u81=PIMJ@Q5PU5w1t zre%+{%XtZ>1>~_-pdZA zao8l%wAW0V>9kCRZh!e&cy}+Rv#?#4ew*qp7r#En(4FUa1EB7KUH|~Zt{ry?1OOei z&kJ%h2YZ8343Ri{C<^H$2e9sWWXB@|yaR{cMVD7QK+T}O4k@Zc+Ui?@7C>Dn~sd)>fa#oxfk)ezWC0r*)efs@LX|X)f~CifoW^krEK32s*bdNpCZKr6d%=?#cqPn8rXok`q>jT{SAv zg&DmvM33_`vfKP7Ya49p2~C_6`CXR9cv^$tamiTii8%y+!$;cg4JXXdzZJK`3iN`M zoGaj50WfdYJAz7r_d`qkBbBhvJRZM?Ebu)n5X;Q0JfNB?l%r90jDAa z+$DA<#|k3oMKQ^~?+uLF2U+apygl!Rvkf0d1SvAl#jNcZ1VAuBNQ^)hL5RnP@x8E6 z?tZ>DrK5l+A6N-iyZd129veI^>DZ+$Z~DinKX@ZUTN^|U8VJQ0PEG(dl8f&nvC-B4 zFh3S-=zSP%PEv2D(hM|OTT9t)?wECkYD*z!Hl2CS9z|Qt>&mp6?y>*jQBD&|je&eT zq|-Hmti%P&#q(BBKyKWV+~%aJffx9R>CtRa5{?mq6!=$}J;mJG2yWHB`+XFkq6+Gt zd(4TTU_r9Iws5ea>|amr3XXGX@cCu02`D|#MtvQvdgSL3)rr-8UaA*~OWtQ3Jyu(8V<}68Ku!akVLM!FST7Og@nUOQ^+i_4^gO;fdCM?Ey_ zR}@k;&oZKtA2zA-IoNvNB2H)!jah(53X_Elqi5@)O|Ecg6moU2tL$7&yd*=Qjq&3a z>sWM37wb|^!M#CmPgYC&JF~i>Zf&)lDN(+LhGs1axQykc^HQwiY0{(}xrPWWAS{{$ z>s3x7C~S>~4p6swu|w6gwxvvJ2aa$RR>tcd7G(3PfSv_I|DbO|zp$Ao_vD*C<#o4w zf_Nu5|8HVjNzdP=?i}Vqlmd0<$R)kq8x!~gICXTn3OsQ)#UB1pf;7=?3;@ai&cf_; zIRsw0yWAdb4U-T*DVzuZi107R91)V3R3o_1Ly*||t{RoW`H;{%@su$eA4camera.zoom += ((float) GetMouseWheelMove() * 0.05f); Vector2 worldPos = GetScreenToWorld2D(GetMousePosition(), game->camera); + if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) + game->targetPos = worldPos; int tileX = (int) worldPos.x / 16; int tileY = (int) worldPos.y / 16; @@ -165,7 +168,7 @@ void imguiRender(float dt, Game *game) { } if (igCollapsingHeader_TreeNodeFlags("Entities", 0)) { - + igSliderFloat("Frame duration", &game->frameDuration, 0.0f, 1.0f, NULL, 0); } igEnd(); igShowDemoWindow(NULL); diff --git a/game/map_init.c b/game/map_init.c index a1ed813..d2f7a9d 100644 --- a/game/map_init.c +++ b/game/map_init.c @@ -37,12 +37,12 @@ bool initEntityObjectsLayer(BzTileMap *map, BzTileObjectGroup *objectGroup) { ecs_set(ECS, e, Animation, { .firstFrame=(TextureRegion) { objectTileset->tiles, - bzTilesetGetTileRegion(objectTileset, object.gid) + bzTilesetGetTileRegion(objectTileset, object.gid + 1) }, .currAnimation=ANIMATION_IDLE, .currFrame=0, - .frameCount=2, - .frameDuration=0.36f + .frameCount=4, + .frameDuration=0.20f }); } return true; diff --git a/game/systems/animations.c b/game/systems/animations.c index 0669993..8436b5b 100644 --- a/game/systems/animations.c +++ b/game/systems/animations.c @@ -1,5 +1,7 @@ #include "systems.h" +#include "../game_state.h" + void updateAnimations(ecs_iter_t *it) { Animation *anim = ecs_field(it, Animation, 1); TextureRegion *t = ecs_field(it, TextureRegion, 2); @@ -7,6 +9,7 @@ void updateAnimations(ecs_iter_t *it) { float dt = GetFrameTime(); for (i32 i = 0; i < it->count; i++) { + anim[i].frameDuration = GAME->frameDuration; anim[i].elapsed += dt; if (anim[i].elapsed < anim[i].frameDuration) continue; diff --git a/game/systems/entity_renderer.c b/game/systems/entity_renderer.c index 1bd1a5b..2cd2bda 100644 --- a/game/systems/entity_renderer.c +++ b/game/systems/entity_renderer.c @@ -9,6 +9,9 @@ void renderEntities(ecs_iter_t *it) { for (i32 i = 0; i < it->count; i++) { Rectangle dst = {p[i].x, p[i].y, s[i].x, s[i].y}; Vector2 origin = {dst.width * 0.5f, dst.height * 0.5f}; - DrawTexturePro(t[i].texture, t[i].rec, dst, origin, r[i], WHITE); + Rectangle src = t[i].rec; + if (t[i].flipX) src.width *= -1.0f; + if (t[i].flipY) src.height *= -1.0f; + DrawTexturePro(t[i].texture, src, dst, origin, r[i], WHITE); } } diff --git a/game/systems/systems.h b/game/systems/systems.h index 7759ade..aa0563f 100644 --- a/game/systems/systems.h +++ b/game/systems/systems.h @@ -8,4 +8,38 @@ void renderEntities(ecs_iter_t *it); void updateAnimations(ecs_iter_t *it); +#include "../game_state.h" +#include +#include +static void updatePos(ecs_iter_t *it) { + Position *pos = ecs_field(it, Position, 1); + TextureRegion *t = ecs_field(it, TextureRegion, 2); + + Vector2 target = GAME->targetPos; + if (target.x == 0 && target.y == 0) return; + + for (i32 i = 0; i < it->count; i++) { + target = Vector2Subtract(target, pos[i]); + float dX = 0, dY = 0; + if (target.x > 0) dX = 1; + else if (target.x < 0) dX = -1; + if (target.y > 0) dY = 1; + else if (target.y < 0) dY = -1; + + dX *= 20; + dY *= 20; + + if (Vector2Length(target) < 1) continue; + + pos[i].x += dX * it->delta_time; + pos[i].y += dY * it->delta_time; + + f32 ddx = GAME->targetPos.x - pos[i].x; + if (ddx < 0) ddx *= -1.0f; + + if (ddx > 5) + t[i].flipX = dX < 0; + } +} + #endif //PIXELDEFENSE_SYSTEMS_H diff --git a/rawAssets/entities.kra b/rawAssets/entities.kra index 5c20fff612a568723403ce1d5f9ddb0ef3bf3053..f01f53b5ed137faeebaa542966cbecf7f288676c 100644 GIT binary patch delta 4672 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 VAe;)KSdjn{$Y1~f@2Avz^Iy0&jmiK3 delta 4337 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 Js25q_e*hl)`W^rP diff --git a/rawAssets/entities.png b/rawAssets/entities.png index 1961067b29d699671e68dd687e3d7c2d8905f211..eb4ee937d77060fba48b7a108f0601e855ab3494 100644 GIT binary patch delta 1616 zcmZ9Mc{J2(7{`CZL}L#vS28L@Wo@is$U24*Swgl#bFW51j4Z$5>X7X+Q+6q9_sVi2 zXCgC0jpY!+G$9Q`D3X!k7G|!l+qvnF_nh~f_xYaZ`F_s#dB^i0(|M3A9kBld)c-&y zvIR@G^Azs(mvoc3t!ns4LZh%zHLa(2VWGCbd#Lvcu{!M9SqV0q*#^>FpE%oP6W_eq zY_^?>&KPx=FMbV*`c6KBhh5jjtKV~v;XPdSaIWDkfj6$%UN zIG?_fmCHXkP(N__tp(MFU~scglHAQ?@i9(Ppq%rGyEXW8^{Uol8>?Z;D6xySWHFivE5atroO1}l0v*Yd^SLgO%I#G726uZWT_)oSjYh8po)MN8*c&zZL;N`ShzbMHY)A93ceZgw1=K-*Rr@fQ4QGy>&a>M0rypoDwz=ghyZlAl;Xb^9MoE68YjKo| zAib{Bag{sIs5wZdh)SlRNPu@8YbM|UdWQrWq+B0eKWR@xnowL^;Mv1h5!zX}=d(=5 zhj+U9j;Gz%3o_S0cEdGXL@Vzhh8PL^uh(`{Gp_^+jL-zbM^>&a#B<(#ETmBAG1t+| zdFG+2sqb@b*V3Ls-K=*Vmsw(Wxxh9?7fX6>lu7e8uDqGpGUIa$BmcjVZ-N0!Kdit# zoB(f{4p!;#YFo#sYg1Eg)Kmt8v7D309y0}|?3nZVZBZwGK(M9E%cTt{0NDg;{8wM! z4ciIOFfImriQ0zg5CW@0Ox0KlSIYVb%|6t=1BWbj!iY~YV~G&>GD~6m`L+|)?wrC1 zjXL&au-Kapr*{T-rncdo#CpoKiN>#Y7{oR zzL(Yr16TZpS>PBaPQdTtAJ+1rtG#cR$Nygc=$7O&G~I&Q$TLo1h%g4rd5EcV$=?Us zcGm0Zhm|BaL5@QDl*l2;tFC(M)uwQFr1U!ZYl(7*MT*S=QmUexA~5v4t|Mc1Pn6b7 zxvSXqIC+~N$begu&8XE+Ld^=H%|-X44dWHeJHAg}L{Iffl59lV`HvujJ*%Q_R#qMo|D*Rhn z-75&yeC*{T@NRHuP$gc2TZd6XWPHMt?h9kV0nPfr`Bfid@{SB|0TVqgb&Fp{h386= z0MQ#n@w6QfbG#I#dAaTq+*P=V8wPk9!+)hj3j>wY@9rqu=b%X9U*N&JsW5`o>7I_A z*+Q$IHFDs|w3`Cx%{yB79a%q*NO0=rmu9@g|FkiKqU1s9iZ29ca1suZBhiFf#75e^ zvj9L5Kv|l*G-L~@9BiNojY44j^&R ft|S6FbAN(~)az1}WNS=E=(l&26~?mmj9=nEDCoB+ delta 1613 zcmZ8hdoLW-63zR2GKqw*>5S2BF zQK_}Xmgw|hgiLQpjUl$-E&JLMYy;O<@;2AMB>KDtHOgvAZ~4K12C>Xlt~pP>$oPS^ z`YOJj$#Ucx<=)x^+1)a3;0wA4Z|JtwPs3W`9r|de7nS3-V>;Ox7%{fEm7=^o@969; z>Ry@Y`HlR+6x>OoCpTsiEa8)4iC$v65GyVh7`$|=Fr21q8Z~i9Ef1BXFE(z`^H)g> zE+x4?>)fX*zb8|vS!gBm^uq;5#@iev{Z98s2X$F@-AhmKEz1u81=PIMJ@Q5PU5w1t zre%+{%XtZ>1>~_-pdZA zao8l%wAW0V>9kCRZh!e&cy}+Rv#?#4ew*qp7r#En(4FUa1EB7KUH|~Zt{ry?1OOei z&kJ%h2YZ8343Ri{C<^H$2e9sWWXB@|yaR{cMVD7QK+T}O4k@Zc+Ui?@7C>Dn~sd)>fa#oxfk)ezWC0r*)efs@LX|X)f~CifoW^krEK32s*bdNpCZKr6d%=?#cqPn8rXok`q>jT{SAv zg&DmvM33_`vfKP7Ya49p2~C_6`CXR9cv^$tamiTii8%y+!$;cg4JXXdzZJK`3iN`M zoGaj50WfdYJAz7r_d`qkBbBhvJRZM?Ebu)n5X;Q0JfNB?l%r90jDAa z+$DA<#|k3oMKQ^~?+uLF2U+apygl!Rvkf0d1SvAl#jNcZ1VAuBNQ^)hL5RnP@x8E6 z?tZ>DrK5l+A6N-iyZd129veI^>DZ+$Z~DinKX@ZUTN^|U8VJQ0PEG(dl8f&nvC-B4 zFh3S-=zSP%PEv2D(hM|OTT9t)?wECkYD*z!Hl2CS9z|Qt>&mp6?y>*jQBD&|je&eT zq|-Hmti%P&#q(BBKyKWV+~%aJffx9R>CtRa5{?mq6!=$}J;mJG2yWHB`+XFkq6+Gt zd(4TTU_r9Iws5ea>|amr3XXGX@cCu02`D|#MtvQvdgSL3)rr-8UaA*~OWtQ3Jyu(8V<}68Ku!akVLM!FST7Og@nUOQ^+i_4^gO;fdCM?Ey_ zR}@k;&oZKtA2zA-IoNvNB2H)!jah(53X_Elqi5@)O|Ecg6moU2tL$7&yd*=Qjq&3a z>sWM37wb|^!M#CmPgYC&JF~i>Zf&)lDN(+LhGs1axQykc^HQwiY0{(}xrPWWAS{{$ z>s3x7C~S>~4p6swu|w6gwxvvJ2aa$RR>tcd7G(3PfSv_I|DbO|zp$Ao_vD*C<#o4w zf_Nu5|8HVjNzdP=?i}Vqlmd0<$R)kq8x!~gICXTn3OsQ)#UB1pf;7=?3;@ai&cf_; zIRsw0yWAdb4U-T*DVzuZi107R91)V3R3o_1Ly*||t{RoW`H;{%@su$eA4