From 3b9c96ea8d067604d52a7d322f35f8fd6077469f Mon Sep 17 00:00:00 2001 From: Bram Verhulst Date: Thu, 28 Mar 2024 18:53:36 +0100 Subject: [PATCH] Rework Tile detection system --- .../.idea/copilot/chatSessions/blobs/version | Bin 0 -> 4 bytes .idea/.idea.Motherload/.idea/vcs.xml | 6 + .idea/.idea.Motherload/.idea/workspace.xml | 169 ++++++++++++++++++ Assets/PlayerWalk.aseprite | Bin 0 -> 9918 bytes Assets/PlayerWalk.png | Bin 0 -> 16165 bytes Engine/utils.cpp | 11 +- Game/Game.cpp | 4 +- Game/Game.vcxproj | 3 - Game/Player.cpp | 10 +- Game/TextureManager.cpp | 4 +- Game/WorldGridManager.h | 14 ++ Game/WorldLevel.cpp | 21 ++- Game/WorldTile.cpp | 6 +- Game/WorldTile.h | 45 +++-- Prog2Engine.sln => Motherload.sln | 0 15 files changed, 252 insertions(+), 41 deletions(-) create mode 100644 .idea/.idea.Motherload/.idea/copilot/chatSessions/blobs/version create mode 100644 .idea/.idea.Motherload/.idea/vcs.xml create mode 100644 .idea/.idea.Motherload/.idea/workspace.xml create mode 100644 Assets/PlayerWalk.aseprite create mode 100644 Assets/PlayerWalk.png rename Prog2Engine.sln => Motherload.sln (100%) diff --git a/.idea/.idea.Motherload/.idea/copilot/chatSessions/blobs/version b/.idea/.idea.Motherload/.idea/copilot/chatSessions/blobs/version new file mode 100644 index 0000000000000000000000000000000000000000..720d64f4baafc33efdf971f02084aca5f25b34a5 GIT binary patch literal 4 LcmZQzU|<9Q00jU7 literal 0 HcmV?d00001 diff --git a/.idea/.idea.Motherload/.idea/vcs.xml b/.idea/.idea.Motherload/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/.idea.Motherload/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/.idea.Motherload/.idea/workspace.xml b/.idea/.idea.Motherload/.idea/workspace.xml new file mode 100644 index 0000000..6827606 --- /dev/null +++ b/.idea/.idea.Motherload/.idea/workspace.xml @@ -0,0 +1,169 @@ + + + + Game/Game.vcxproj + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + "customColor": "", + "associatedIndex": 1 +} + + + + { + "keyToString": { + "C++ Project.Game.executor": "Run", + "RunOnceActivity.OpenProjectViewOnStart": "true", + "RunOnceActivity.ShowReadmeOnStart": "true", + "node.js.detected.package.eslint": "true", + "node.js.detected.package.tslint": "true", + "node.js.selected.package.eslint": "(autodetect)", + "node.js.selected.package.tslint": "(autodetect)", + "nodejs_package_manager_path": "npm", + "vue.rearranger.settings.migration": "true" + }, + "keyToStringList": { + "rider.external.source.directories": [ + "C:\\Users\\Bram\\AppData\\Roaming\\JetBrains\\Rider2023.3\\resharper-host\\DecompilerCache", + "C:\\Users\\Bram\\AppData\\Roaming\\JetBrains\\Rider2023.3\\resharper-host\\SourcesCache", + "C:\\Users\\Bram\\AppData\\Local\\Symbols\\src" + ] + } +} + + + + + + + + + + + + + + + + + 1711617171269 + + + + + + + + \ No newline at end of file diff --git a/Assets/PlayerWalk.aseprite b/Assets/PlayerWalk.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..c2c0cc296498a34224cf12717346662ecb06cc07 GIT binary patch literal 9918 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 literal 0 HcmV?d00001 diff --git a/Assets/PlayerWalk.png b/Assets/PlayerWalk.png new file mode 100644 index 0000000000000000000000000000000000000000..ff6cce18e5b74d1f4365a4d07da102a0cd000beb GIT binary patch literal 16165 zcmd73BD9FBtq#d;y#&Y*V8E!vV&g6d;l(gPnrK2-aiABdgXM%7C z$_}u?V$mavv{t-Wu0y*`N^xRux}zMGY^DaPWSgiEBMKOb{jkjgZY)mhAsKjp)FY$MhB5LLZ`=mo(u0@l&0cP?(nxd@6S>pMd~)WdkW* zeST>D-c+(78@b(5al}et`z< z%ERQ>V%MD!W|h8M1k9xCPpXK|A!@bSU> zvp>?0NvQq}D^IWgwt7=?TLSz$o&2A#X8j)f1B1knUE9!ny46fj!(R3};BjzVwuNw- zLTooJX?`Gkjr^nkzQG5Fp9u1qJO@>l3NXv@ImHF>hjyAeEi`!A-QF>NGfpIM?2hc4 zeO^7-KTq_effi@|@8S0U&((AUjJCzF(`;*NV0_u{v7s%m%RdkgCx-N4MF06wl1$e3 zsMJJPd~tDZdA`eroLOD>0pWL5sj>NVYzg*#M&4T_0D6!8pXsb_xw6^JXHZ((Ql|dZ zes*D^w-k*viZ_lLyR*&#GsKqum+ju0AE-q4&};JL&$oe1TEK=MX$lO?@b>$k+9+&*|+x4vf34BZwa%5YeDik*}*TS};HeE(Cw~-{SpPDpz6w zUV*rPO1P#1Nr2O6mvFST4 z%Z&kRPLQ%2XypZIe{Lv@^#5O|w*Rq;9}LqQpv|o@lws-n!spz(Cn7Kk^PROE-R3{D zN@3bj$@^MVK$5fD0uOos)~qvgUdLS!Q7LQq_<;vM75-UQWTmLdzw*kWs2|l$P^|W| z)aS0B=Pm6Q-VxR0sh%ft*qD9jbRuCJT6}%cN4}b=lx<-!6foq>eW&61>T7AIDb}KR z!&&>|$@6)CDCH;%Q?Q(BfFO}X*@RmqJnC&r9XxOEJ`83peLqW{pQjhI5Bc;SERZ3) z#cQz%5#pHA*C)Ri{++zUU&_+5N0P^La|-1s4~Vz7|1(b^NKzn#C>3w-R- zEcIN5l6f9GsGpsCx8JwedEP#)ZjCFAu;72o<3{6woJlZp!IVFRYP1l@2|(UoOzhb~ zo4l@$Zr%VHA)69idUzYo_@k3Gd@R7S)n4~WNw`tl!$?dz12r^xjuIy(Yb-GM0Vz1)qZsX;q74dMX6 zh@f&d&i;$a?Du{$DnrCd7TBClXJnZ{O2!h;n$PnS5lPGTa3{{wDRwEWm77y(iD&zh zPspW^X&8r2^6zAvQoqTR!#!e6^mfZJbICqKC2|L(o z5Mg$R@J@$GdcC(Wp%`ajM)$yEDOEZVX~8p%VR-Yj>vm<6E&Y_7`9yuyLl(n=FYn;! zxb}2$vv#~q@iAo`jp&91UF>D6&plz=&3WmyyWe$J={@-QtM5P8A$Oz8dr2+TH`LML z4@4u?pLqF*bK89@PK?3B<$Z`_olTNgTqh@EFX?lg#Q2~AJT0K092dR^rm~KQ=IP7)9=sLbBN;C@@_U`Pi7;;!FkzQk z`jTXsrrl)`Lw|2%%L?Pe(8}|R|2n>LI8Ojc@Yg|wX$6~M%SoPcqgl{JIXjJ9DH;dr zQLPJ(8l^2_-Zoih>K%Dt(bC%c%L|bxy6L?NCdQR3dTfh0KZy$9Z!heTrNXoc2{0}c zCwzCY&hvv(l`|{PL*WHmO0QaCjKJ`mcQUNz&AEBTpu~nY6lWy}o^Vyf{rdh)XAAJF zQfbupy0WzpvR8RkcvaLP0p5p{#8a!%xiueozl~{59|^eJ<-5**c-X46Ovd?kf_`b^ z?B_-dj$%Nm5-!k)v2u33d$NK0dXY$qser9`BOd=79~-*TYkcR689=KeQMv|^%Fm7) zNv(Zme2F}6MLps!0m50Hk`Oxe5$=ceQ9tk(hcc9o_pH{~{6ss=R}s4DIEjfx5srmu zF{Id>r};Y>+DhTyZq6q-A>owUy}327y9j`CB{+<3m1G(HYFA$mKq$Ci3C0J8)es#q z7|i7M-)L!#QUdIJwBrdr;O$SjE`~RV=f6Nb?z|iKZ~4>(xEq%Qo43FF050j|Wv)$% zKNp1kD|XR-`x^h48k``%vtXR7q*M+3;8PNfmcnk~3CmT&x=_MOgehKfj22pMET1Z2 zZ77=YOZyN*MLB@Tuhvoj+Ib$7*5g(mKe%2cr8Ha3o*cI~h}yg2QN=0RVL_mSMmwOG z9HLF%e+oyGuTSV|7WuY|DB|)tE11m%?m)4-iQ6<~t?~+oh6E7Q^Y*$COk*U=`Gpyv z_nU^JYD68Kkn9W-Z=deS)*aO;lkE^4Rc5_O~!9x?e(lh$4nX^w4#Yb&VOtk zUdF=#4BP5;GTLUtzQjKl+EU!M;{`_U#_d4EW^&J?N`?`(``Q_5JV0>k8qbB!c8^5N zPKa(A6*!8df@c2lFfv&-Ll_8H&<;xu_}G$azRT^AELMSUp9%Y2fsIsT3cvIZFJcZZcdMmSchZ}+(4jl*xjv|1;dDc z7ep5MJM-3M8@=u-YY$sf^^MKc6B3rBI?OaNXUCjp<{8!`V2U_c_o>dG5%}z;I!cFZ(JM|BU9I((8@RSe?5p$Y73SoT+z@#tbUUYn0;gK28&L`W z(XaxKJT|~Ocm$Yv(;smPluN z*F)}BX;Tr~CngC7>YAC^oq})%;nl^$FTF}X8eWkEr@%DWC1T+U7{CP5dr3-MTN*=f z4kY+bxwkx+Vk^H)DQpet+iM`yiY;>s(I*7ZxR1&)GxsQBtsk^XJZ0$=V?07FAn4wg z91$MX&0St}ZC?39_sCtq{kF2&t#LD)UM z<4f95{ztMX|MdArf3PRPAjH4?PwM?S>ff%RA=OSq-+crnGh1+M66|ST>}~Fsfj=q{ z7yXHpP-Sqz)$U_|B&Sr`Os?V);$9zI;zj&V3kzJ1E6pJwb!QJBG-q-ad^uK? zs7|d+T-)pT3kUoWDx+D99Xe=6w>yrJzFZUUrWDUJ$28}8V&V&ln;Mf2EJmNHg7(jG zBOjW2OsUrHu4qkdg-={`XE99gUr=F4b8MdpMCT^M^K9`4slS)1MNw^Brv!Tu|2xcY zJ%3~n0d5^+QUFD*S1a)Po#T?MT%E8t>A*ubZSTM(D~#yUS=Hpww2;g-|Yjs=0Je zLOK^<)Cq;3_`mz3KeXRH8saRk-~cixj-1~feAx9JV#hM@6FlMM&tG8n=G;}$P~^WS z5H#7^qy+x%5J8}jo4y_evjqX13h21OSsw^c^3f_W zoQjlC`e~IFt*|O?x)I1ai@^t#&mbt6vD7z^%u8eL?@>YX*TKylC-!V`)7BAM=-qlf z>vVHW9~IB&V$YBOb2IWwcR59UccIgEVtK0L?)4#8 z?P9Vn*^igrDObE957A%4Qdz~@FIoB42-1RYdP*0;IL z!Xga-x=c8PAwX>P&gvbY$(Ej_@b{i+v`|r%``_Og{*-$?g*~t8 zfB4C&JV|a=8q_&Lk#Mknc!&Alo;ia629=!X(=Ca0kWTdQKt2CLbjtdYv~L`Ea2F{y_~h)N&YcT%7cF8&D$*osqw z9!NP-zCJx0J%UFU_~XYFC)61i{8qcyqHv0~7v~>zV_%RFa z?pooOXZ!XibS(^)4%h|`HDw!Yqij!yA^JSP4;ubk`{Qs2W8%BUlQvh#;}s)s2<-fN z5(-bN{cj4mfQZ$tEHAedj|K@3;2dmnjK$RXUI3vvden0-{W$s@SyNYsMEeas9n1qw zGARXO#vlB(%!ynC_yqejT0+{dA~QeG()u`*-Pk?rafY0M>Yq{6m6znFAC1&UKj`XM z5~~siw>_PNeUz>djtMlNV+ZbxRG3;=VD!9ACPRL*oWe0og#EY@#B1Q02`&fcU9Jw{Y`^WiqACm^vK7ft-(>Z~mFp~!)dULhbuktNGgEgv6=AMsk&5v_~ z4YI?2Ty5==u(=TdL*pf2yY4M1uzS5K=K@y_Xz^s+r{BLB%gTbK7P7-GXv>4NP)%i_ z&Pz>RQwJV(3`-5>N5^JIYA^2R=bEca;AxVAEzkvSy6Iz=4E1@~)m0+PJdCTPS-02x zdTaAxoLkaBy2eP_N9$f-R1-+I_t@=sT53nWmrB@8tY2Y-38*?dTA=>vJY_wjM}m&R z!EDMM6pO0DMf}6V`Ra~BCy5!>@L!dkhVQ48A-1x3Q#zR`lszUA6PLDJrx{jRT%sOrIkp{7|<9Y;G|-CgTI zl6zyew|uo!i4{q5K-JNAv@3VZ)#qJ(4elG2)bNBYHcRR}@_~<`YmULCvkiO<2MIgc zP)^rsY@kYtIf#xYky1?QKg@ROa@6AH_cPh z-;3u2xc|wgpdID;)xq4TJMte?8wr(O0Bph-q)vA+(A&Z|BJd>l<+trP;dCEke#?O? zzM9iHbL`lh|Kj?IcSo!rWxvyDE4>Q!%}`f2I_%O8ceB6XpKjri)#7@kZ#ytMxOgpz>0t zo`4PFo(*&f#Ol8`w*E44sq<3|Z~7S0ymw6Mq?=qy89N^I4KFaM6!|~)A?Me2NT$fq zlTMLeCy50g$^S}E;g8k|nA>-LY7II>&;<=ri6&d15)DI@-0h0$&^#lQ2L&6UY(@w z3%WAcX1;-fL`*6du;8N)Cp@jnhu^FAJKTx)XeF^-n&e(*JH+}F{tr&2Fius{g{Wl^ zRi;K`#sDggITM429srh-s+v>BdQcQVjLu)b=YR6MpeKJfgX6QP9KZbA!@zVFMgH`fA(?{>Ihg~|P(-e>>Xw>?^B2Mul&Sbg+ zxzxUXy~6M_D+Nm|3`)}N?>7RU+42)h;f;)sZ(bADi}5O=UT?4k4zMfz2F6o5M&LC0 z$4*KNulItiMg*$f(WT0x9!o-tH}X?ZKiK8iKr>igL-;{AU5z22%BBTXH2J%&z(a&bLxD3VTJLHKavFYGXpI(O5nqSzcHti1LG(G{SCb%NFe$pHJZ76G97x8ndMQNG^a07=Yv`cdXvCby%2N8c?E<Z1wOg>Fb>8cvkiY#IN@b488Oc zQiBbxu)lzcYJ5U@1yAt6KCw3`@j`zmzS?|3z#fPfm2=j1ogW=35asiUB03coKb<@D zNd-?R$&g$xW{OoyIzpPu&*aJO+qf)}m-&5uHPw&v8ffmav@wyZ_%N>hSc?O;Iup46 zc7|~}@mks~wTFN!I%aSjiPp$Lls zK5hCP7fpqRC>bjtPzwBTd}DRqB|2OD`{mNduut&DXm2K8z&jq2WHH)}sG)h-hQ|W1 z^;~}EKV9bSA$IyG;^n!3y|v6z)L0f5OT~eP;?vet1+j~!eAfmt;;l%%1cr_0ih)aN zUdmkP{DE_$c|*?R;I~Wj*S)*r5_HpT38KYabCf}r>OYe@5$9JnKw$qLO&(z3Y78Ge-wC| zOAm;T8ffi6Y#SrFRumt8hiF49y?-}WEoKeGHiTK~ddj-G)pctDZP=^Erq>m ztKN2{r%Gm2GrZ1pA7b#4s>OF{F&;3*bZ)nKMyBuihIBXt^5QGp$D$IxIl+skSDnTw zhk?|?e(qn1c}Pw;>(~_S|~fzkA8MD$jU_&G2nk z)`>SZO6fER5PaL{ykY$9X7QQC^Tcr@gwjNugm>un!8${yTn~#2c8baf4u^5EcbLNy z>nU77+xL+T3?;&d;?HzWb-B{9>WUf$Z{LsReKohTHY7Co@YcxOA z7{b@U8UY@x>DC8{yzf>GIQI^IqA-F@VuGK?H<76!#O6*Rm$a%yZXEv-;v{cmxZ$I ze7pDQ+On8c^5QZc7ZAL<>(PRZ`ZXqCo+vE*R_b=G@H7PYjrvpHY3oVbcl%l1?h6CR zX=hlq^EEfGQ6nSZG?(!a`+4p8(Ua=XA;9vXgC0s0X`S&@q@x3iz1Y+ARX_nCSno z{rN%a(59B+m{t&{@!cgmqkc3}>z-6v%Z~^;|J~Ho)UOFl%qqk)3y>#4CtuRQiosq^r=takYIT2$ z(TtC3j_cGCi~kjbL`Rn_l)3qcg6_r!sSGsnuk>%=6G@*lKTK)*ki?9xS$c|e8h(Wb zcbZ}Yh;*8p2l{}LM(5Yvkx98i_+Y6$r|ZIsttB?PoVL) zciQ`b#FSGPF=a~kmNwi#=TIdE<0(cT%?1_{(a*f)nNk^j0KwCa$AeKce_~WF*gzs! zaMTr}A7vGQ+Z@lBjcylUK;G|s{mq>Y3l~=aM#WCYHCkNbi?~T4Nq{5K!v2D=!l)^#ostrykWVgMSn$xPRYqw zX@!>VZ*xtJkOtr=uW8`OyEzz{r<`>zgYQ1y&2z8~xW2h~Z8|dlYe4y5yX|JL4rcOe zhcC;WTd!e-n_Jmo405H@eI{+^0u^l+K1QwQ6zibCggYte%en4RlO_-QVmP2<{_5$X z;=rH$po5wc3BKS(Mm*etb#QX89v#fMmbqnkT^Q^)JOQfB6?THv`22V1;$(TwfD1^O z`QV?UfD+9s9MjKvZa(jZlxuv;ySXKQHlbVKt9CBHK6!nHgs-Cq$F9RE185uSVZ6Z1 z=V9F;XE*&Lc;9i-6*eD&K0fLAADuY7|CqvyoV{ydsq_VS$m?>(@ay_^%h!eV56o__ z?+qJZ_9lSUNa;t;H#9%uc1R^Qw6p}bFf451ZvX&>$^U8rI^=%qZ1sHOIf$!oX>f*y zN|&5>3HS^(qG8b{I^EU49ecTz5@H-e8spKgvt`)RnFH^2(^>~(+&El{_1kM!eIZgtz%&ne-4c`X!C0}R3f3-Kk1O| zd5vO#157=L>2wuz{Fgc}*(|9gMq|^mOAYSr8G~GUP&6Oap#eByNLJZ2wU~#D(Qn<1 z?K7bq`;r?1j$I8yV$=_*w#g?5`-K8ClXN(hBo`ub&C=BsNuxS`$q;K1&xUMh88zSj zGT8oYLEeiU_yH7MJ3k4ck#`E!qcXTRZ;qis4``@j*h1!v ze?#y)m`Q%{6$v{kEHM9#?}9tiL&tJ^r^LOv$N0=VtR(Z55FnrYY?rs~W?kg^HrJVs z`A0*o`cTMnt&EX)99py)<%AIjiVimlQsPj$dv~(NhnXKvNI^%G9$f*s{>IqjUgiWt zOFj1x$!E>mOU+h|*oy6%-|;e1aX7)}r+NZ3IKok+4|A73q3l@TW6G;}ta_VLOUH@* zf`NSyO~|1{kOpcjhQ;C{Lx61xMcC&(K$uoTQ7q-@10W9sFQ=LNE&vRXPaI0$#_)PA z;_NbD6kv%u4w4nRL#Z&iXMU)P(cA65aX~U+oy}g!WVEZK%%wz~PG`4BFHTo`^2Svy zRa16#W=ldjBSXCP<~$p-qoC%031}iUI2YoHh=nDq;JXm`I|wztpTB2iTeOEK{m}@n zOR~8&-cmDSHoNX_GnEzpGn-hy?sRI}-DH!@4EF~)@7ZlXu0cqj~IXH^_~qW~7g<)hwK zs?Srh=|;Vk2N7bhp-LdK5L|M54zW6hKnsuMz|w_c{r)JxisKm)@(hn)jZ5REN=J(9a~i^*-;#&g$ckvb}wr% zce&cN8msAgQdWip6D72TUqbcj=O0Jsb+`1)WhJnGm;Pu1j82YJnKLerWW530du6}O zAWe^n5jogjCFYP|9n@fAzCIEqI?l1@wh=D9oG3qix~x903QUQ65UGa-+k@EPj-zQx27(XC(kIGc$9e zFvlL}gW{%_t4n3btQ#!*eR&Ai!y`0S4lqUnF%pVFeW|62d}a8*s%@rL(W13*+_)W&Iq@cX`EK z{fj3Q`^yZ9X;!d|a)^*RNxv{b>=_>vn2dU?gE=0?s8K{eG>XO_)?@3yH+K3^CcEeYXQrpn+tBX*B%c zCcFMi*3JcNn(M|J#g!C-D_CGB2az_|tN}YP`fYA_1%&J43H)VF!!h^2JGT^+qS4<+7p+h3arPQKk^%KCUv8Hk5Mo=Idu z*V0l<@K++n)G}Y>Y%+u)S+H>k{_CYTU{&s8i~XY;b5OaSe^gV44W*%{`?ZsWg?s~m z10&2*y0sP%>S`OZj2#t=%oZ`0i46KvbxxBsgGIPULbOD)jPNnVa1(U07jaO+zg8Lv@kx0gZUip-wFYRC)!*xTgqhN&Jy##m2hOK?vy9-IS~;Cq_Yfpz3TfKs=>YY z)Ku(qhMxk4U1_hv%&_|!eU1dqwhd>~HT}+6R7WY$(xe*#AQGWEsAj}3X}U3mb(FP+ z#%&LF_;$WKjW7o*q_AE$%dU1hb55|1)4PXz90%Kou9;8N4mum5OQA5WX%QJY1)F`> zdtK#2&fzSBqnMJ?CW^?EOu51E_b?Q-CCKHFi{O@jMlw^ zlmRr^yi{b!oHqWq)HiW2!(yRlZM=aUNL9!!om5u*va@EGh9w3>Y=k8xppUUQlKJ5PIS(7q0ZUSrk)MR!GeK6E4rm^eDdY`Iya;o$kJJ2iy zCT{ZQWCfyaK?mlD_*Np9;jtSf=KT5=neoD~R~}GMFvbuo+eYSlvzU(EU*o7lMb7?mzPFx0yH=y!SJIzMA$kUiq8K9bf`*ffWqd9aL zku6S&tICI(Ci};twmQ!4i(Gxf&Io8i6@U#`N*xutQns|r0ULQJ_g_8Gy}32i7He}^<@NE&-h2$1a5h% z{VO1t>MtLU`3dDXho}`TqCRtWV50`|9lpdj6zdSACn(OyuB^BoJMf5O-3EYoYFS2zfAlFw z)@jMrP2zS_yeC}~R|99ZArS)?zC6-*BgOqrr_Y|UD8&TFbYbQeJ_KugsFdG^`0PZ- z1HzKX3_t|o)6*GSr4j|O(}j=5d*+R_FJzDNKK{8t#Se}9a!ek&#;QCpJ>jVttav(R z=N?ypk0kOb1tAvG0YOT1m(BEAs{9dv7|^QXf`|JXj=}I5qIk}1uz%eX7|BY~?n`|X zdMQ>_JXq?;$YiW#1N~(pCTK*jWLgj=9(ft{z^0)u8_JVW+MEG=+*bcI2>k=qEUyZO zRj5c0YKtg4a>~RWt33(M5GOui^Cj7{umHBh9k} zM*_jIxN-%tI&xbEGu}(Q5@fscrm(EVX$00Q@2vj1qg}T<-DZnG#t~6e6W1=$8mtUV zDU8^C`Xpn?nw>ORRh*>cngn#^?3UVrJYHIc>147bXO4XP!*>N^PV3`?KWVSXk-RxH zcTiMLtWW;lL{K4hUDkyAUX0%#OWD3 zgWk&X+6QY}lwmwz+xEBZUjj?*V6(>zfgI# zf}QcdAu5W`x`=5v%DqdSXsMuJ(@I4 z$Ck(Cy!?qi`kjE`V;@O9YH)zZ;X>mtWl5RJMcFyr%Y`o}f(N*Uvd#(}mt~{540oli z#cvG3Q`*>~zazLo@+n;9r-z?^;{%9)kkR{pAKdx;n_jGuSULWE<&mzr?qB$T&6S?l z+~2>l4NECrZG70{b`5oDo0AsN^2pX2mekKcwGryP*tx$8$ow|7VI_IL1-evq=HhRA z)4Njo+Ab}TS8nh6ejw`-gNGyC>ch01yBtbur}EQ(ZwJ41dx_U8K+p5JXefLY--%=4 zOY88br&h+=D;ISV859mX8n^4N+$(yC7}^BVFT{xo)e&YV^3vuczm&!qG>Ry*R!ouy zRSG9jEyV2Y9e!*FBQKy}#^3X$DQG)1sJV6?MTuj7uTy7mKE0!zO=|h3U{o7Xwq`2w zTjRqJU3&DBL=&;%Sk}oOXLJeG>S|}qDE?A3nQU=n^e7!mk9c&a3v_Hi<3#)XNq9|- z3lv?Uy^%K0jmKO8F32a3a)u;O%%5xxy%Qz-f=U^$XhGc%q03zy7gaa>`z~Nv_3IGt zubpevX5ISg(0FhI8Z%ld3K{_HRMGPC0Dr})2dSe5AUCmTGJx66F7ocT>0|AfTKOx^ ztc0FMh!w32IYK^RmuGh?&?wiU)lq3NXF?!-F#5Wgo|RL64wv1xd7$jwzdcsPA*$d3 z*i zUXp}P%GKbb2Us5%0+711#*fsgQu2}FilT#eX*OpL8$z%5Uvy2_vreke z9^=#)zE3HE#wYVDcE1fB9{#QsSXamUR=d`%8}SRkmO>U!;6yKJ&)+Zoi*24mW6aiD zc#bU1jGUdS(7`^#w;yf)gUoL6JWaU?NowDtv zk_c3bmpet?#Lv>zMGRLy4P$xW1Ky_uS{hjgqS5V&)RWkM|u|OzNtpE5b%LS!Bzq!ppD0oB17%N#NYJF>_gRif8 zrZB(Da&C2G>US~|LL!%3GzV1Y&TTcDJ;EAZY`G=C&NUlyXxWyR;L-GFiU21Y_TtF8 zBY7manOsNJZ9(eT5!gO5@>#v8QpD?5e!9o&F%*pW-U%~8Rbzz>@}9xMz;Gc;;-=qT zFK(x1%55a67d^QAN5F-gK{}*okOj@|e3=Z`x<8%j9uwV|@7cXHycwCi`VXY-4=-^2 z3^sFhr41&wH*#ZPPDk~i!vQtd=S$cNgz9cLi#1O=%3_;MHpuMu`=(3uzd9gFM4 zVNec8_rS|gazLk7Dt!Za19_36=gkjgq zGe)aj9y4JpGc&o+zwlh(DKdIV!+w1OAihQMS~{Nk1zqtlbd{3~v=Lf%ji_oO%CFTv zzS1M956q`LQ%$B6w}Vu_Nzo7ua11lIw8Y3Ar^-0VopgLrSWrORgz8>5d0cC#l^tV~ zwwoNq66v5)q?<3r1L7C2$L?~PnBr2W{+!WWR4^~A)5ge|=YgJY;BVRGY*QVipn-w! z4>l*2>$vbqJMkz(8DFHls!4Qbe?9R4B_Y@R{GA1HS=?A~-S0#iLw1UfEg#4?^+}?Y z`*nevn957m@DbGfJr{e^;MnguAFU6**H{;(IrA=g*hD(jrGZX^>bHAtUR|^5FO2JI zy6SLy!}`0-lR3CSaj{Nx5qwj1tPCjYB&q9)oB`UyM~}()r!Gz7D1ij~5m~aR#75+5 zG;Qt`C9HUINm=|I_{Y$f*g;#z z^?S9CDtZmrM#DZJUW||`j6EGy2=AEVy`FTREoLY6XN`!hL8pa2RUGZKTRQZGJ{pZY zp^!=jiBTo-OJ>&(4x)_5O^hS#=M%U|EiX^^G^HG4h)nkYOciy{{@2vOq(_CuA$n9< zOXq8#yed4gEaE^GK9`B}LN_b`>dMN-ieiPo1hRCr+E)xAfW7yUYb0ARD}zW6J!NYl z83_otAzwy5aq_&;2J32B(a;PUjRtzR5_&CFd};sEV}PAKYRzFMI%GJL@Y5zlievAk zx~{mmQ00Y0pq?6DVfZCJU05J-fMbKjv(^0W&AlS+7c(?W7NM!h#AhLVVoD7Vew~Fz zWcnLRjV?WZaCLekUDTn-TggDj${#}Gdxjg1L!IP&$(G!-$ZTTL#qgvimnys9lgn7g zuMVVZ{qcOcV^7pkCSh0#ajYbbN|q^t9gdEr%{`kE)N^|x`~<6vjk&=nAAh}u-q4+d?W%SooI&r$C(+3VS3 z&$4+xVC8#}^2KEjxl%4(%Lr(PPQ5E_-lihlAU0RoV~$ZE^di&U-PK`5){ z6Io`SXz@an?NaCE9637~uVf6luaf#dW-_GUpR;(RarDv<4B6Q&|A8zlbfvS?ZS+?W zJeOqT-XYCUB1T`E+6pH2i1L~Yz_j?b{R@gr@!HYX;OjyfT3WpGl)&V+LuIbqelq@G zRGQ=HLx(;P!G4_NfgkqoF5!9-WX$zL7yH%0$Xc&t7J1X7=As1Jxa~1oKD>GR{HeV{7jjfAaysyY6#U=b2_i za_QxjWcbG`;l$SH@~F5z%9=XUtA3BanvWgR5>5K*Msa~2@MJe=7*cwoFQvZJ@s}NO zn*n}dsqvk1;Y)^0@61>USiNr`@G_4Id4d;HPxan=pBlPodH2+VA?{g)`~;9L5zzHbc#mBl{(hf=?T^3;Xs*Oa#vD1Ch#|hf?qF zv(*q+koR@eo9j?m^SkfRP{pmhAr*6Ufv44NI*n*@x&9C)KX}}=SCDR9LE0~sX7C3K3w+j?qa%$qK_gg zlpBe4+ZOKjnsr*}^Fl2Ge5ugfK znqD@y04$pKl0Mb*wV+0IDLSLt_2qHZ%Vo?)7WuU(m27|JjisXm@dXoB zy?VQo=drl^rD}>|be}q<7DfI|5yCY*-Fz{n*j>9xre&#G5M38yvu_LnsI~wQWi_7Z zbWvwHp?x(L&F*!dO2!veiz(+;lG`v5p?elcN|g8R>-=TVb%v>@M09!l_rCCQcV{Eq z3`>vuSN_GXK5O%?6(m=n<)8~7BIm2Yh(1uV!6K&HcJF26o<|V@okmU&2jHQ_@0oqX zI-{w`NZ*gQ;Iwhp7Nxh9ntq-ks@8(*QmydvY9em@b&Oa2IOC{*LQ}B*!1px`Z2GBu zl_((|4-ASEc}`BRoOg|w(OSi z6dqIJSQwPv*)fxd;-y1Mp@u4km#BVqICwF3Tp-}i*E8PF#5Y?@G)9(wo~+Wng#9=@ zouk&A!Ufrqkf%bosS{IFS9UzQ-ku?BJ1d82yaQ9k*ULMTryfRZzf#dn4GCYL!t7R& zBk8SPvdUn^PY_dVRkb=W;K-NhqzANgnFhZ2G-m@?mB8A;hZm^`#P5u;$iy9G)W&_} zjmi{GrJ$O`Xid<#x79tQ?WYSD8K+OesqN|z#-gWCg!}W(Tt%?FiW*Li{==1dJ=vU& zo!Jb0{NNudMo8S0X7}0iCA;yEQD7|b&aok91PS|B`|ClpUqXq38XtG9#0vJ(9(}6q z!}yI`&7WQVEv&Ya&;lwKE1@6XYj1`~Tr z45$nZ=SRkHj)>mbmwM=EfrW)z4UJ$Oy_<6sAJ9*%M>AxTEGK;%sSa);JM=UJ_^gZ= zPx#W$gp*4X_Lji_K5h>VefPbd#QowJ$&#VR7e5o`uQXlD8f3`}br)0qOU5Uc&rY8e z0(~I+9U;(Jo|t5BgKKJK_aX*}b;c-YnAPmIlZbs(OUmR`h1130{>3Qt3$*O6IbN*G zNBaGJsgc({{|61{q)fl%k4q4Pq#r{c|NT2rbd-AP=^na}a2h$%>w^Av)@o8A6TWDU z!hzo{h$p3O9$;t57aF*?xF$V;^$QiNyi z2l7Z|>f>j>ptz2~zi{mr+M!Iwv zy^(i(e?}N*z3?;dEAeggYBRm6+d7k!g1Z?D`uGetTexture("dingus.png")->Draw(Point2f{0,0}, {}, true); - TextureManager::GetInstance()->GetTexture("dingus.png")->Draw(Point2f{0,300}, {}, false); } void Game::ProcessKeyDownEvent(const SDL_KeyboardEvent& e) { @@ -76,7 +74,7 @@ void Game::ProcessMouseUpEvent(const SDL_MouseButtonEvent& e) { //case SDL_BUTTON_LEFT: // std::cout << " left button " << std::endl; // break; - //case SDL_BUTTON_RIGHT: + //case SDL_BUTTON_RIGHT:k // std::cout << " right button " << std::endl; // break; //case SDL_BUTTON_MIDDLE: diff --git a/Game/Game.vcxproj b/Game/Game.vcxproj index a30b7d4..2540025 100644 --- a/Game/Game.vcxproj +++ b/Game/Game.vcxproj @@ -315,9 +315,6 @@ xcopy "$(SolutionDir)Resources\*.*" "$(TargetDir)" /y /d /s - - - diff --git a/Game/Player.cpp b/Game/Player.cpp index 876caa7..fdd46b4 100644 --- a/Game/Player.cpp +++ b/Game/Player.cpp @@ -67,7 +67,6 @@ void Player::Update(float elapsedTime, WorldLevel& level) { m_ContactMap[Collision::CollisionDirection::Bottom] = nullptr; } - } } if(utils::isKeyDown(SDL_SCANCODE_A)) { @@ -93,7 +92,7 @@ void Player::Update(float elapsedTime, WorldLevel& level) { if(m_DidJustDigRight) { if(!utils::isKeyDown(SDL_SCANCODE_D)) { m_DidJustDigRight = false; - } + } } m_ContactMap[Collision::CollisionDirection::Top] = nullptr; @@ -112,9 +111,10 @@ void Player::Update(float elapsedTime, WorldLevel& level) { for (int x { 0 }; x < WORLD_WIDTH; ++x) { for(int y { 0 }; y < WORLD_HEIGHT; ++y) { - if(gridManager.GetTileAtIndex(x,y)->GetTileType() == Tiles::DIRT) { - gridManager.GetTileAtIndex(x,y)->m_Hightlight = false; - if(Collision::DynamicRectVsRect(this->GetCollisionRect(), elapsedTime, gridManager.GetTileAtIndex(x, y)->GetCollisionRect().getCollisionRect(), intersectionPoint, normal, t)) { + WorldTile* tile = gridManager.GetTileAtIndex(x,y); + if(*tile->GetTileType() != Tiles::AIR) { + tile->m_Hightlight = false; + if(Collision::DynamicRectVsRect(this->GetCollisionRect(), elapsedTime, tile->GetCollisionRect().getCollisionRect(), intersectionPoint, normal, t)) { contactTimes.push_back(std::pair{x + y * WORLD_WIDTH, t}); } } diff --git a/Game/TextureManager.cpp b/Game/TextureManager.cpp index 9be57bc..cd5c72b 100644 --- a/Game/TextureManager.cpp +++ b/Game/TextureManager.cpp @@ -15,6 +15,4 @@ Texture* TextureManager::GetTexture(const std::string& name) { Texture* pTexture = new Texture(name); m_Textures[name] = pTexture; return pTexture; -} - - +} \ No newline at end of file diff --git a/Game/WorldGridManager.h b/Game/WorldGridManager.h index ad01747..c513737 100644 --- a/Game/WorldGridManager.h +++ b/Game/WorldGridManager.h @@ -1,5 +1,6 @@ #pragma once #include +#include #include "structs.h" @@ -11,6 +12,19 @@ static const int TILE_HEIGHT = 50; class WorldTile; +struct surroundingTiles { + std::array tiles; + + //Center of the surrounding tiles is 0, 0 + void SetTile(int x, int y, WorldTile* tile) { + tiles[x + y * 3] = tile; + } + + WorldTile* GetTile(int x, int y) { + return tiles[x + y * 3]; + } +}; + class WorldGridManager { public: diff --git a/Game/WorldLevel.cpp b/Game/WorldLevel.cpp index b9b45d7..0ff10ac 100644 --- a/Game/WorldLevel.cpp +++ b/Game/WorldLevel.cpp @@ -23,8 +23,23 @@ WorldLevel::WorldLevel(Camera* camera, Rectf viewport): for (size_t y { 0 }; y < WORLD_HEIGHT; ++y) { int actualX = x - WORLD_WIDTH / 2; Point2f pos = Point2f{ float(actualX * TILE_WIDTH), -float(y * TILE_HEIGHT) - TILE_HEIGHT}; - GroundTileType type = rand() % 2 == 0 ? Tiles::DIRT : Tiles::DIRT; - m_gridManager.SetTileAtIndex(x,y, new WorldTile{ pos, Tiles::DIRT, TextureManager::GetInstance() }); + GroundTileType* type = Tiles::AIR; + switch(utils::randRange(0,2)) { + case 0: + type = Tiles::DIRT; + break; + case 1: + type = Tiles::IRON; + break; + case 2: + //AIR + break; + default: + std::cout << "??" << std::endl; + } + + + m_gridManager.SetTileAtIndex(x,y, new WorldTile{ pos, type, TextureManager::GetInstance() }); } } for (size_t x { 0 }; x < WORLD_WIDTH; ++x) { @@ -92,7 +107,7 @@ void WorldLevel::Draw() const { //loop over worldtiles for (int x { 0 }; x < WORLD_WIDTH; ++x) { for (int y { 0 }; y < WORLD_HEIGHT; ++y) { - if(m_gridManager.GetTileAtIndex(x,y)->GetTileType() == Tiles::DIRT) { + if(*m_gridManager.GetTileAtIndex(x,y)->GetTileType() != Tiles::AIR) { Collision::CollisionRect rect = m_gridManager.GetTileAtIndex(x,y)->GetCollisionRect().getCollisionRect(); utils::SetColor(Colors::GREEN); utils::DrawRect(rect.pos, rect.size.x, rect.size.y); diff --git a/Game/WorldTile.cpp b/Game/WorldTile.cpp index 5e923c1..3e8803d 100644 --- a/Game/WorldTile.cpp +++ b/Game/WorldTile.cpp @@ -6,16 +6,16 @@ #include "utils.h" -WorldTile::WorldTile(const Point2f& position, GroundTileType groundTileType, TextureManager* pTextureManager) : m_Position { position }, m_GroundTileType { groundTileType } { +WorldTile::WorldTile(const Point2f& position, GroundTileType* groundTileType, TextureManager* pTextureManager) : m_Position { position }, m_GroundTileType { groundTileType } { // const std::string dirtPath = + "tiles/dirt/dirt" + std::to_string(utils::randRange(1, 5)) + ".png"; // m_pTexture = new Texture(dirtPath); - m_pTexture = pTextureManager->GetTexture(groundTileType.getPath()); + m_pTexture = pTextureManager->GetTexture(groundTileType->getPath()); } WorldTile::~WorldTile() { delete m_pTexture; } void WorldTile::Draw() const { - if (m_GroundTileType == Tiles::DIRT) { + if (*m_GroundTileType != Tiles::AIR) { m_pTexture->Draw(m_Position); if(m_Hightlight) { utils::SetColor(Colors::GREEN); diff --git a/Game/WorldTile.h b/Game/WorldTile.h index caaf47e..ea5836c 100644 --- a/Game/WorldTile.h +++ b/Game/WorldTile.h @@ -24,16 +24,20 @@ public: return m_type != rhs.m_type; } - bool operator== (const GroundTileType* rhs) const { + virtual bool operator== (const GroundTileType* rhs) const { return rhs->m_type == m_type; } - bool operator!= (const GroundTileType* rhs) const { + virtual bool operator!= (const GroundTileType* rhs) const { return rhs->m_type != m_type; } - virtual std::string getPath() { + virtual std::string getPath() const { return m_filePath; } + + virtual GroundTileTypes getType() const { + return m_type; + } protected: std::string m_filePath; private: @@ -42,37 +46,48 @@ private: class RandomGroundTile: public GroundTileType { public: - RandomGroundTile(const std::string& filePath, GroundTileTypes type, int maxRandom): GroundTileType(filePath, type), m_variant(utils::randRange(1, maxRandom)) { + RandomGroundTile(const std::string& filePath, GroundTileTypes type, int maxRandom): GroundTileType(filePath, type), m_maxRandom(maxRandom) { } ~RandomGroundTile() override = default; - std::string getPath() override { + bool operator== (const GroundTileType* rhs) const override{ + return rhs->getType() == this->getType(); + } + + bool operator!= (const GroundTileType* rhs) const override{ + return rhs->getType() != this->getType(); + } + + std::string getPath() const override { + int variant = utils::randRange(1, m_maxRandom); std::string toReplace{ "[0]" }; - std::string replacement = std::to_string(m_variant); + std::string replacement = std::to_string(utils::randRange(1, m_maxRandom)); size_t found = m_filePath.find(toReplace); - std::string newFilePath{ m_filePath }; + std::string newFilePath{ m_filePath }; + if(found != std::string::npos) { newFilePath.replace(found, 3, replacement); } + return newFilePath; } private: - int m_variant; + int m_maxRandom; }; namespace Tiles { - static GroundTileType AIR = GroundTileType("", GroundTileTypes::Air); - static GroundTileType DIRT = RandomGroundTile("tiles/dirt/dirt[0].png", GroundTileTypes::Dirt, 6); - static GroundTileType IRON = GroundTileType("tiles/ores/Ore_Ironium.png", GroundTileTypes::Iron); + static GroundTileType* AIR = new GroundTileType("", GroundTileTypes::Air); + static GroundTileType* DIRT = new RandomGroundTile("tiles/dirt/dirt[0].png", GroundTileTypes::Dirt, 5); + static GroundTileType* IRON = new GroundTileType("tiles/ores/Ore_Ironium.png", GroundTileTypes::Iron); } class WorldTile { public: WorldTile() = default; - WorldTile(const Point2f& position, GroundTileType groundTileType, TextureManager* pTextureManager); + WorldTile(const Point2f& position, GroundTileType* groundTileType, TextureManager* pTextureManager); ~WorldTile(); void Draw() const; @@ -82,8 +97,8 @@ public: Point2f GetSize() const { return Point2f{ 50, 50 }; } - GroundTileType GetTileType() const { return m_GroundTileType; } - void SetTileType(GroundTileType type) { m_GroundTileType = type; } + GroundTileType* GetTileType() const { return m_GroundTileType; } + void SetTileType(GroundTileType* type) { m_GroundTileType = type; } Collision::TileCollisionRect GetCollisionRect(); @@ -92,7 +107,7 @@ public: private: Point2f m_Position; - GroundTileType m_GroundTileType; + GroundTileType* m_GroundTileType; Texture* m_pTexture; diff --git a/Prog2Engine.sln b/Motherload.sln similarity index 100% rename from Prog2Engine.sln rename to Motherload.sln