From 1c1ee35ca0895668cd894e3a6cf6382127c149fd Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Tue, 15 Apr 2025 17:29:54 +0200 Subject: [PATCH] basic structure --- .gitignore | 3 +- .vscode/launch.json | 26 +++++++++ .vscode/settings.json | 8 +++ .vscode/tasks.json | 41 ++++++++++++++ build/release/cub3D | Bin 222896 -> 0 bytes compile_commands.json | 7 --- compile_flags.txt | 6 ++ inc/allowed.h | 24 ++++++++ inc/cub3d.h | 64 ++++++++------------- inc/errors.h | 20 +++++++ inc/game.h | 22 ++++++++ inc/render.h | 20 +++++++ inc/screen.h | 21 +++++++ inc/types.h | 62 +++++++++++++++++++++ src/errors.c | 26 +++++++++ src/game.c | 56 +++++++++++++++++++ src/main.c | 125 ++++++++---------------------------------- src/render.c | 23 ++++++++ src/screen.c | 49 +++++++++++++++++ 19 files changed, 451 insertions(+), 152 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json delete mode 100755 build/release/cub3D delete mode 100644 compile_commands.json create mode 100644 compile_flags.txt create mode 100644 inc/allowed.h create mode 100644 inc/errors.h create mode 100644 inc/game.h create mode 100644 inc/render.h create mode 100644 inc/screen.h create mode 100644 inc/types.h create mode 100644 src/errors.c create mode 100644 src/game.c create mode 100644 src/render.c create mode 100644 src/screen.c diff --git a/.gitignore b/.gitignore index dd7aac1..4bfcdb2 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ *.d *.a cub3D -build/ \ No newline at end of file +build/ +.cache/ \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..245caf4 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,26 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Debug Run Debug", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/build/debug/cub3D", // Replace with your executable path + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "miDebuggerPath": "/usr/bin/gdb", // Adjust if gdb is in a different location + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ], + "preLaunchTask": "Debug" + }, + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7f7aa60 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "files.associations": { + "game.h": "c", + "cub3d.h": "c", + "screen.h": "c", + "mlx42.h": "c" + } +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..a7f1a0b --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,41 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Debug", + "type": "shell", + "command": "make", + "args": ["debug"], + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [], + "detail": "Runs the make target for run_debug" + }, + { + "label": "Run ASAN", + "type": "shell", + "command": "make", + "args": ["run_asan"], + "group": { + "kind": "build", + "isDefault": false + }, + "problemMatcher": [], + "detail": "Runs the make target for run_asan" + }, + { + "label": "Make Run", + "type": "shell", + "command": "make", + "args": ["run"], + "group": { + "kind": "build", + "isDefault": false + }, + "problemMatcher": [], + "detail": "Runs the make run command" + } + ] +} \ No newline at end of file diff --git a/build/release/cub3D b/build/release/cub3D deleted file mode 100755 index e8d560dfb1973cf797e7a69145e9d22b232f35fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222896 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

bf#KP{ z$t#K2MU2TcTM>b+@SN>D-i01Kx%XznnQ)VSxQ|TVm2iqct z=?)Cr?xL6Fu%!kO?A5mVQM#k@kl>%=v^)pkL^ z(6d|n=*V1sDPgX|Q~|@b<%+qCG0Rp5TM>b64fC9Bq1I&J14Z)We1BK*Z&dKpr>(SN zH?BB~EBMK|>b?jyKL5dwWC5=vVyh{P zI^UEZ;B6ey+au}c!F3Mv+&?fA6mvggo>9yg#Z=<;h^(36$$5dpOaq1|+fOm)Gv-3V z$ax?ln5^(H1bYAHEU_(d_q(_25AbbX3FpE7sNu7AA+IE2J8?}nwY^U?-sY`v{Jav5{|sRG>{_Up(TwTF^77eDCOEg76)wyozC`nCYB`Rfg_y;Cu9cR2{QGaP0DFl>94V&aT>fiPk#A}QPdb2->g zYa;ho)xyQAzpL2_HEjFG8DiT>H=^iRwf&kSx(=k#63aX0e^Em|Azc3TMJphv`Rqq-J}H zV!ANq3Bri2h`?5O&UTR2_?t&K6Sj3Vm!XDjJI0Ic8C)|$Z9n0NK3|!BD_g}Y;h+x( zhG+YjV)kOprWH0@CcsvB&h|>Jsc<#H_FPx<-M2Orwmm{?)>0VVMKu)dub5JY39}vG zFpa>l?VqR1K|jQpU@JUl+rqmvH(riTpw!(9^uktSR$1q(@uziwO!cg9c{A_R5 znpY@{K7CzmuTo5%!vx#&9Oiyt*!D=pR5Rvo!pNB*BCr*nv(46;dRG%{|1L?{9*r8F z?Z>>5h#kl^`D*(HNA$^1hY7Ze9cBk$*!E7vbY;vpOM|V5z*cz9_H3=Gbv41Z*wrli z+Rt`BtyxH6bOY5;^UjJ%I!v(b=`gne!?s_aA_qO4F^8C~h&0nfAbKR+oD`n^OWtyL zo_C@53S3RFeUMk|LWvrlZKc-i#Wn9WiR~qd>2R1}d%DB)28L}9Qq0Ex5hg(xITJ)g z{m52$`Y*BFLTfr*O|bpt`<_U;5czub7W1jNX4W*op{jh39OK)tUlV6KoH4HTR>2ZFka|YOa|?H56^B zm|TYmw!fZ`I_L|5;n}{+D~Z@ijM>9%MFh6ObGCK73w_76tC^`!q2{=n9Zr-X4T8VRzzScJZC#XYvQgZ*ba3yy-~xq z*;=#lbE-L)YAD(?P7b=nVS?>?UI_>NDeaMZH2wy!Bw}wcW`Nm>2yBJtZ12*VDpwP1 zXS$l(P{X!oYt3}7S@e?F9;cW_hY7ZY4s$LrJlmZWa~xwP6GqMi5rM7noNZJrLn(GO z!S(}Q2}9WdHEjDluh8$qb4{k&KA@ONhY7Z~I?T79`Pp8gnD;4+nwA7x5rM7nobAC{ z)8J}?ZJw+74{F$U3$3Z*n$xI;qMwhGgD!KJVEY-bgoC~m7@qBGypo7bV9a)AD_)bMQUcqI`#m}`DnB(@2~)HzJBo#rru zfMMHH6_dr7rwAjqA_80CIorWn)9Px1ZC_XO;irDKKOHT$%P5SFQrmSL(K8+Q;$N^` z%`4%cp9F?&pHR%*jM@A`uoV&53eVYAgc|pfP_RAU)trSIp6v*&8Ot@bR724a#Z;#M z2FXB&*#{W5-84oHdI!dgGuxWfE4K0Gr0|^WO5TNr;%b6zBd>&^tffJv&fB}RW+{cy zx6h0148_zrOqlHyhj|bfwmnWU3C27`7(H*9fY}Pq+4k3(23Heod%2opP{Xs0M$1qN zxaLr`eV-$Gv)^H8HG{sG=5<~P2fZUOZ2N#>x-;h2=Yp+>z*cz9c9PcAx|(1+-qkGs z*w6N0t!bbznnN|zyoX}y9VXar?=ZIk!?r)i<)EiCW|Y~A2yBJtY?HhTz53y5g6-41 z5{6QU8lLSfT9d~$?azwsRK>J7Ot78kFk1n`wj&kO`Cr1!BaEC0A_80CIooZuCh6X# z54IVu<|QJg&f8B%$xt5QnxSgDiX*yrSe*8}>_uJ)2R#cIw!K?1<&0VXOt2LZ*b2|t zo~t!wt|r(X?`npihG(0vHT}6}Ce=_hKr!VG6K31nVgCNe4w`MhIZ6)t8w#UBvlS88 z3eVXt;$7$~Zqwh|Tfi$}D379sZEw(;xm@!>gV;`1OpC(=+X)Uc1sJwHL^0zTb1Px= z-hm0Q6`r%r)S6aT6K1<{WXiTbYS{KYUP;8Z*C(N_)xD23mqn+EcM(W zp_q3mj6Pc!Y()gN!gIE#X-$KxsnnXdtGN?3Y&%$MD!Jxrs-b8*#gyVp2;^HBdN@QW z5Iol}M#upl&4_=SsYt+7STLpE0Sj#UTTt}Qk$el<=5F%7@m&ma?;FpNf9w0koozNC zHosVFzo0NmJ}u^_aztOcm;R3YD2I9XADG=0^D1MeDrQ^76gv#PSHqX^42Nj|hKKO! zkurpP88ehHa&n0Xh9Eo)f$sl#7rH*Un()5yJYESmg{x4*2Yr>+oXs_>o|1z;S24-d zkBh$r?PP}-0|dWsJWLTWMpO|(Kh&Li3(MX&7B9#P-pOw`LgZ`kR@&uPQfoV>LHyUX z{-^aSuOwpa6h_;s_!EkV=nSyet-|}p^BkrL7=GXQD#bj>m{m`bJil)&1m||Vf?Lu* z+h63s6#(;KcTw;;48D}W6!lh2Yx?hf{XRT(m_@+wX|R@860yA*vp4(khq^@slN6q_ zUBJ80tAMU1Tw~_Cn&<;R&2p`Im%?b-6Jk3-F_FWBkC7bhFb%-4?VgIcmoe86Mr=g{ zw!(9^8;iuY3MZ|6j3nYT{M;v@f`4EucqI`#l`D4Q3jTq~-hk5gWdvGtav!@KtlL^H z2R8{g^)Zs`T+u!#;ve7yE!u&Lo_SnGGKQn(ri}D&Qz~$n-`@9=?WdT}DU2>uOgF`3 zI!w46{CIfku$KeFlYNU<60rux{EIL$SrNfxg@+-`F1(L-q0bAut9Q5@-0W(~QNssa zrZuN?&C8F;L7$|UPGIC?B%>T+6cBtl*j*7r88MX*ayckY|58Npg1q3J{JO(LUiM3U zjO1-j!)fv5dw$Fdc_k5hi^8azir=S*2p>?&ni(z!H#^J=!0_2srkFa$yj&m7E+II# zBNbeQ3nV@~FvNi?0OrAFDfk=)pF?1Z{wkD1Y;>6LkmFlk35Piv7(NYJc!mB124niO zpL_)v6EI2PIomt6CNKTN12bIBAMg5Uo~1QkQ5e1OsMsE>m|TYmwud@Q3ovZElVYA@ z%p}5yt%$%@c+U3gLuDwP3sTqcaPfMdSHe)Hp@wJs9Iqr|=X1@LYFnq64u=W0a~$Sq zVA%Fz#T>|(v}O|5Jn^vDj!;aV z!vx!*4pRaQ+h!}~NXDE?7&#L}1h&F+wx1jiAnmMRp+dmHy z+o@c0oZ3bl(X$zc3AP{bN;v2nM!=ejwP22yBJt zY_HOqTKCIv!S*~?b1!Px_DHR{k!$Xz8jA82QpGf7z$pVZL1BXM3z--l8yi zkT7y4hzM+j=WKV@nxv}ngrEQG&o@Ja1p;X(br)< zqdijR?N7txpxQ7OHNo~NUI|0F6*X)-TWhZ7nsxV!ZG~d8 z9VX27e1|y`7@qA2#f)K0En(zL5E0l4&)IIHHAU{BUa;MKK+1M2)UfR*ypo7@zDYGh z)OICD^x;_d-a@c#beOfYM{2frDP}2SzWq`)kcb zTr-1eDC)16c>3>n^m3R{!0>FNp>ohe8FQ%FiU@3l=WJi#UFbIe-JMXF?L)j0&V(OV z*-+T_dae1G!sz|`#CDQmik9tEw3bEiztlt<_dngD|-Xl+*B55&B=Uwy4%@Rp6=EPIQ4Y5#uatL zvG7PHY0-w2RJ8P78OiA!(S^rd)Wc*)JItH3hn{YX*+Vgl88b~WeHBxc{&csi!`ulB zPqsZ@4!e>u!w4gj6%kBUco+ix{U_dq-W+l@x9bn^US0|3!En^D?NqJVhig{fBL{uH zVv=|fNuKVOI7BuO{B-v~Mf~{&A#NswJl$>Kz17WL{Sq(83*O0h>@V`NU+U@Z=bQ%d zr>Gz`<|MBqVzu1bSH+)FM4tO;(GQqkWW3j5t^kJ5uBnPCWz6b%;p`HEb30MN*$!N( z;3FJ(Z-9BQxeD&b;L8b2(N>D-NDcOAa@)LL>Ja~Gu|woj;1ga+#J;958p3Y;R97T0 zMPb2|UIh+{&BItq*lyN;D}yrcV||(9SnDv z(tltED&}a$T&9>lis^K}A@QBg@sE8|Ll_1O521}$=+81TW*@@H5JUt+5FUm=-+#%w z(BB1dkLbef;C5HDp7uzcPE)kz0}7+%cgsPap_qDLhF=qK);dUSdO6Y&YZLETe95|c?2Rm>EzFPWLNQM<=8Zdot%$%@ zc+U0+ttn2wAmqE6OHsqNTWie(t~r}(DEf0xIp`9H3A6o%SHeM$1cq&!c_k6cXUxuK zDC8rQCh+WhUJM>8|2EUa_kHYIwHK@(NuAxMmBrov)Z$_u_A`O*qVO zVA%E|#q7hF*X9OW5lPuH&)F7eO*S6R;U%@fu4d!wezx7U<}(VT5~`u*ANP=h&UBby zyN*}FL9YgeZC~M)M68i9+nBA0z*cz9_GYcgaWyk_wiT}CI@IuNPu7|Xx#scP#P&$V zz_4wWVh&-Qn-yDNG%@A{!icSiz_x*T&UQbosdF{Kw!f>n1vNa|KXw<} ztGMP^wf&kSdd%%G!S;P#2?u>9Fl_srV#Y9LOS2Ub*b2|tR%%Vs)dbr~u4V_+uB=>Ax5{h}QcR7*1lv6v=KCi55wUF##k5fvok|#)t%$%@c+U2nK{AwDR}*ZLyb^}8 z05xoTKd;aWfL!y_9I>6Pn0ki^wo@JEYGBy*6vdp!m?sD$wju&s;W^tuT9fHs%@4NQ zx|(6AVcU*>iS0nH8KJhHa7178?J&W16|aPY-Ub-9eM~WbB?+@B5o|>Sw!(9^S87eU zyAukw=en9@L`*&EIznp}a?M>-L(Tgurov%@?Er_V1%_?^+)WO824jvhTM>b+@SJT6 z@6y~<=4yiNB3=nYIT|%Q+dH)8K(2{y5!>q(Q|d6mcCy3l0u0+8qnMtId4Mo-CWr`Z zh39N{(wchr%qiGrx|%hw`Pu$&R~gES6h;TD?YkV&?>ae5ux;X%aL^9}!?yDkQ^S~_ zX9rsmfvxbI?ZsM??=I`X_B2;>CTe)L1zIzPYi^+$igs5_p2Gy&?HuMvVA%G@Tsi3d z7&FprMFh6ObGEPYF7zk=((fIfidY2{hyU0Pm%9umURzzScJZJkn@6z0q>uSPmALNyACR~piwyo5fi@D~#DzUvp zF(nT3NrpV|Jl$cA0fuLLkYWlLlOT+o2_gbp;W^taw5HV61lwN*q-=kG*@nWl@9;_@ z_9cbUV6}aXBl_)lhY7Y%Im~ik*mkyJ8W^+greG@~uoa%OEzz1XR}*ZHay8RY!?uI8 zW+K;APz^=fD5k<;g6-!1se?WN7`FX{R}!(q7&F9dMFh6ObGDE3F7%w&)dbsGSCfGn zw!Kno*1tqGD{mCra}-nMFu``5!>pz~Qs?ddifLrb48q8nAR@38p0oXHXR)nuHNo~< zUJ2*z)u>_H7G6oj&f}W?YWsp>^4*O!*goVi0-?HpHAgBrHISZk(nO>(B#o~oEyhY7Z$9Of)wc(%JMW-Mc-5=PDh5rM7n zob69Lifx^%3AXLL63&EeQNy;c@=7AM=|!s9R&Ae9Oo2P0g6%wqSx0-MW_y)lRx)PQ zj9@Dwuoa%O9icTvt|r(Hbu|gpux+;1RB+9?R726G969K?!vx#)yb=!jG+=nPZ}3VY zHj*&|%vMBTD?Dd=m)7LDnqWKA)$~LS+n%j8zcf)NJ|B z&Xesj#!M!RoCzWVTj4p|Xa^Zev8xHTAMi>T%1x+Y+vj;D5xbOYGS&70#Z=+Lw7BQJ z)nQ72;n`lIm?Ig}bbYWD5!edP*&eJlx$c2!u+4Kd-B81}TWHOO#Z+?|)ll?vKRM`5 z_kCAkwx97zIOsLBM{2gO@k%20B4f5QTM>b+@SN=}T9cptChXO&W(I25wnS?tam|yJ zVmneX8SZ7^V0(bWoC*xjb{oZvV9a@hkuyO=U@JUl`|0*FluTC>X8R_ugrQ`ihHW3` zl|<~1MO5?mbz*zBVsafO*v@j8cG@E~+jA7NiZP1`Beo&}Tj4p|e67iLHNkclS2Gti zZ2MPVvAu?Ciq-ZTj_C9D4ijwG@=7@9^MK*mzMz<5#`H8>5rM7nob3%-ljmxJZMm!I zhZ?p$R%^O&&4bsb_H>vpU+}ZtQZa8)7@bZSy(X{-Y=!4+-`h@x(&lP{ z?NVL|L#ag#+t%?)A~u6-ez`_$6N+iU2d!~UnC37S0mHLBRWTJ-EhZMd%BG~qIH3Lz@wm)qvw!OIKD79V35&hPi!-O+oHLrw&{^@x?+b0zB35C(- z>A_Y+U@JUlTcI^It|r)??`j@F4cm^;n%lUhmTD*(qL>ng3AO_r=4xPgwwtz*gFcTj zU@JUlyOMWlZYp&(!M2fC!cg`_4cp$OH91`K?KH8Sp_np<3AR%lrVB7^dz@mv zdyX&<5k}4g5rM7noNa%tDR(u&wwJ4UfrxtPVcRHMhEm5hhpO%S9MQJ{I!v&Aomav^ z-wX`fKA@N@81w7Z!B#|ID?DdANo(rUuL@cSFV{uH5Bckm^z0Ew%a>Q zPhi;g=PWtsU!En*D6+ z%%mD>9-x?ZhY7a59i|!>w*6)+Iq1t7Q)sp#0$brZ+eN%fb5rDMg6#rc2}3yyH9XrJ zv}RAP`QR$C<-eazm=1>twi6s?8(`S>5XJn}K$u$zBWHq$z*cz9HdAX_-J6KPc4MEE z?NTD9X8RtmBw|l-O`h5|aYWze>Q4V)yU<~3fMMH&Vx}?XvnzwGh`?5O&h|8|DM)|B z7%b2Zgaw4GvV946RyahRQeVcT`R<)C{o<^Z!55!edP**?j;(2vj! zCCv67UI}Nyn+yGHE3{@Yh0&W=i0yfbDNg^@i4z>=4q(`Jh+?i|%q+slnIIyt6`r&G zyO-FOxSC-59j^r2Le%hVSMo|Cmd7=_sO@6KlsZh9?ZXbU1u$$oLoq)-O_;Tp2U`(= zt?-;}vDTEinqYgFt650I)Op)qYwqEia;l-`o{A}Vm|*)`&(uLr1%_?k=aoe4T*mBa zwju&s;W^s}c^A4Sr2jqJ8dsBx8lLSWt?A7*OD_{!{(I1b$xOE$?J!?GWe3f+dnl%r z!e|;{^qRmTuoa%O{UuXsvRzG>?dQA_&V-v$!?sCYNyM(;n!alLlwxumCd~F;hdB-y zww(qJnhuoa%OJxXixTurbY=4yU_(uTse+iK016h`M$4Mm%`l!MN9m|*)o zuY`kM1`OM-;*~^fA!7!bt%$%@c+R#~YYJRVu)WdMOhygco~t#daZTeCu^p$FB8LgK zhdWFmFl;+OF?o!cLKry{LeBBFl;+nF%L23^>RCJnE+eiIom_EChmq3X1kZGnTQ&mZKl>7&o$$zhN544 z$U$c~%v^on;R{{~2b~WL+cxn^BDOPQwl`Z5fvxbI?HsMiMU8y$xYAX8^tjEHKN5F_ zRxGD5dUi4mgguPKVd2nv(_gfy*&njMR3^QYPk2UnqS;?$9Khn7~!YivAU$Ui*UZU}8Rw))WZY&5&a&b-$_%d=*T*t~hO9ANc^;hXyo8eP32UfmpB z9QtOw-X&hWF8bu6zc-JrZswo<3uCJ{kFDMqul^_+bqNjdVO~$rf5n@7tn8{sHGKBS z?jwh69Nv3m#_+5=SJ0347FwZig19_8I$k%uDr`EUx+6YgS;6VU#}A({{EXpePIx_Q z;E0TjlZKx%{N&*$4L|XO_>Aug;?;kSZeAYUbwtMK=8<|liNascpjo|3hgwdDI=Z_1 zppip1lVH}�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 diff --git a/compile_commands.json b/compile_commands.json deleted file mode 100644 index 6d1b83f..0000000 --- a/compile_commands.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - { - "command": "cc -c -Wall -Werror -Werror -O2 -I./inc -I./lib/libft/inc -I./lib/MLX42/include/MLX42 -o build/release/obj/main.o src/main.c", - "directory": "/home/whaffman/Projects/cub3d", - "file": "/home/whaffman/Projects/cub3d/src/main.c" - } -] \ No newline at end of file diff --git a/compile_flags.txt b/compile_flags.txt new file mode 100644 index 0000000..1e38c10 --- /dev/null +++ b/compile_flags.txt @@ -0,0 +1,6 @@ +-I +./inc +-I +./lib/libft/inc +-I +./lib/MLX42/include/MLX42 \ No newline at end of file diff --git a/inc/allowed.h b/inc/allowed.h new file mode 100644 index 0000000..f665beb --- /dev/null +++ b/inc/allowed.h @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* allowed.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/15 15:31:54 by qmennen #+# #+# */ +/* Updated: 2025/04/15 15:57:15 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef ALLOWED_H +# define ALLOWED_H + +# include +# include +# include +# include +# include +# include +#include +# include // TODO: Check if this is allowed? +#endif diff --git a/inc/cub3d.h b/inc/cub3d.h index 3ccdb7d..e8644a8 100644 --- a/inc/cub3d.h +++ b/inc/cub3d.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 12:22:29 by qmennen #+# #+# */ -/* Updated: 2025/04/15 12:51:19 by qmennen ### ########.fr */ +/* Updated: 2025/04/15 16:53:27 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,48 +15,28 @@ # include # include +# include +# include "types.h" +# include "errors.h" +# include "game.h" +# include "screen.h" +# include "render.h" -typedef enum TILE -{ - TILE_VOID = -1, - TILE_EMPTY = 0, - TILE_WALL = 1, - TILE_PLAYER = 2, -} t_tile; +# define FAILURE 0 +# define SUCCESS 1 -typedef struct s_vec2 -{ - float x; - float y; -} t_vec2; +# define WIDTH 1280 +# define HEIGHT 720 +# define TITLE "Cub3D" -typedef struct s_player -{ - t_vec2 pos; - float speed; - float angle; - float fov; -} t_player; +# define RESET "\033[0m" +# define BLACK "\033[0;30m" +# define RED "\033[0;31m" +# define GREEN "\033[0;32m" +# define YELLOW "\033[0;33m" +# define BLUE "\033[0;34m" +# define MAGENTA "\033[0;35m" +# define CYAN "\033[0;36m" +# define WHITE "\033[0;37m" -typedef struct s_map -{ - unsigned int width; - unsigned int height; - t_tile **grid; -} t_map; - -typedef struct s_screen -{ - mlx_t *mlx; - mlx_image_t *img; - unsigned int width; - unsigned int height; -} t_screen; - -typedef struct s_game -{ - t_map *map; - t_player *player; -} t_game; - -#endif \ No newline at end of file +#endif diff --git a/inc/errors.h b/inc/errors.h new file mode 100644 index 0000000..7337d4d --- /dev/null +++ b/inc/errors.h @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* errors.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/15 15:42:55 by qmennen #+# #+# */ +/* Updated: 2025/04/15 15:59:42 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef ERRORS_H +# define ERRORS_H + +# include "cub3d.h" + +void game_error(t_game *game, const char *msg, int mlx_error); + +#endif diff --git a/inc/game.h b/inc/game.h new file mode 100644 index 0000000..0d2ed6d --- /dev/null +++ b/inc/game.h @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* game.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/15 15:46:16 by qmennen #+# #+# */ +/* Updated: 2025/04/15 17:21:36 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef GAME_H +# define GAME_H + +# include "cub3d.h" + +int game_create(t_game **game); +void game_loop(void *param); +void game_terminate(t_game *game); + +#endif diff --git a/inc/render.h b/inc/render.h new file mode 100644 index 0000000..07ae0ce --- /dev/null +++ b/inc/render.h @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* render.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/15 16:28:16 by qmennen #+# #+# */ +/* Updated: 2025/04/15 16:30:51 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef RENDER_H +# define RENDER_H + +# include "cub3d.h" + +void render_clear(t_screen *screen); + +#endif diff --git a/inc/screen.h b/inc/screen.h new file mode 100644 index 0000000..960982e --- /dev/null +++ b/inc/screen.h @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* screen.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/15 15:30:34 by qmennen #+# #+# */ +/* Updated: 2025/04/15 16:48:24 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef SCREEN_H +# define SCREEN_H + +#include "cub3d.h" + +t_screen *screen_create(); +void screen_center(t_screen *screen); + +#endif diff --git a/inc/types.h b/inc/types.h new file mode 100644 index 0000000..2bed026 --- /dev/null +++ b/inc/types.h @@ -0,0 +1,62 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* types.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/15 15:52:44 by qmennen #+# #+# */ +/* Updated: 2025/04/15 15:53:29 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef TYPES_H +# define TYPES_H + +# include "cub3d.h" + +typedef enum TILE +{ + TILE_VOID = -1, + TILE_EMPTY = 0, + TILE_WALL = 1, + TILE_PLAYER = 2, +} t_tile; + +typedef struct s_vec2 +{ + float x; + float y; +} t_vec2; + +typedef struct s_player +{ + t_vec2 pos; + float speed; + float angle; + float fov; +} t_player; + +typedef struct s_map +{ + unsigned int width; + unsigned int height; + t_tile **grid; +} t_map; + +typedef struct s_screen +{ + mlx_t *mlx; + mlx_image_t *img; + unsigned int width; + unsigned int height; +} t_screen; + +typedef struct s_game +{ + t_map *map; + t_player *player; + t_screen *screen; +} t_game; + +#endif diff --git a/src/errors.c b/src/errors.c new file mode 100644 index 0000000..b7669c4 --- /dev/null +++ b/src/errors.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* errors.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/15 15:40:14 by qmennen #+# #+# */ +/* Updated: 2025/04/15 16:10:57 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "MLX42.h" +#include "cub3d.h" + +void game_error(t_game *game, const char *msg, int mlx_error) +{ + if (mlx_error) + printf(RED"%s\n"RESET, mlx_strerror(mlx_errno)); + else if (msg == NULL) + printf(RED"%s\n"RESET, strerror(errno)); + else + printf(RED"%s\n"RESET, msg); + game_terminate(game); + exit(FAILURE); +} diff --git a/src/game.c b/src/game.c new file mode 100644 index 0000000..fb01e68 --- /dev/null +++ b/src/game.c @@ -0,0 +1,56 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* game.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/15 15:46:08 by qmennen #+# #+# */ +/* Updated: 2025/04/15 17:23:29 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game.h" + +int game_create(t_game **game) +{ + *game = malloc(sizeof(t_game)); + if (!game) + { + printf("malloc: game failed\n"); + exit(FAILURE); + } + (*game)->player = NULL; + (*game)->map = NULL; + (*game)->screen = screen_create(); + if ((*game)->screen == NULL) + return (FAILURE); + if (((*game)->screen->mlx == NULL) || ((*game)->screen->img == NULL)) + return (FAILURE); + mlx_image_to_window((*game)->screen->mlx, (*game)->screen->img, 0, 0); + return (SUCCESS); +} + +void game_loop(void *param) +{ + t_game *game; + + game = (t_game *)param; + render_clear(game->screen); +} + +void game_terminate(t_game *game) +{ + if (game->screen) + { + mlx_close_window(game->screen->mlx); + mlx_delete_image(game->screen->mlx, game->screen->img); + mlx_terminate(game->screen->mlx); + free(game->screen); + } + if (game->player) + free(game->player); + if (game->map) + free(game->map); + free(game); +} diff --git a/src/main.c b/src/main.c index 97a8a43..b27cb00 100644 --- a/src/main.c +++ b/src/main.c @@ -1,108 +1,29 @@ -#include -#include -#include -#include +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/15 16:01:29 by qmennen #+# #+# */ +/* Updated: 2025/04/15 17:23:45 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ -#include "MLX42.h" +# include "cub3d.h" -#define WIDTH 1024 -#define HEIGHT 1024 - -typedef struct s_things t_things; -typedef struct s_things +int main(void) { - mlx_t* mlx; - mlx_image_t* img; -} t_things; + t_game *game; -// Exit the program as failure. -static void ft_error(void) -{ - fprintf(stderr, "%s", mlx_strerror(mlx_errno)); - exit(EXIT_FAILURE); -} - -static int check_bounds(int x, int y, int width, int height) -{ - if (x < 0 || x >= width || y < 0 || y >= height) - return (1); - return (0); -} - -static void draw_circle(mlx_image_t* img, int x, int y, int radius, uint32_t color) -{ - for (int i = -radius; i <= radius; i++) - { - for (int j = -radius; j <= radius; j++) - { - if (i * i + j * j <= radius * radius) - { - if (check_bounds(x + i, y + j, img->width, img->height)) - continue; - mlx_put_pixel(img, x + i, y + j, color << 8 |(int)(((float)radius * radius - i * i - j*j ) / (float)(radius * radius) * 255)); - } - } + game = NULL; + if (! game_create(&game)){ + game_error(game, "Failed to create game", 0); + return (EXIT_FAILURE); } -} - -static void draw_random_circle(mlx_image_t* img) -{ - int x = rand() % img->width; - int y = rand() % img->height; - int radius = rand() % 50 + 10; // Random radius between 10 and 60 - uint32_t color = (rand() % 256 << 16) | (rand() % 256 << 8) | (rand() % 256); - draw_circle(img, x, y, radius, color); -} - - -// Print the window width and height. -static void ft_hook(void* param) -{ - t_things *arg = param; - const mlx_t* mlx = arg->mlx; - mlx_image_t* img = arg->img; - static float last_time; - - last_time += mlx->delta_time; - // printf("delta_time: %f last_time: %f\n", mlx->delta_time, last_time); - if (last_time > 0.05) - { - - draw_random_circle(img); - printf("FPS: %d\n", (int)(1.0 / last_time)); - last_time = 0; - } -} - -int32_t main(void) -{ - t_things *things; - // MLX allows you to define its core behaviour before startup. - - things = malloc(sizeof(t_things)); - if (!things) - ft_error(); - - mlx_t* mlx = mlx_init(WIDTH, HEIGHT, "42Balls", true); - if (!mlx) - ft_error(); - - things->mlx = mlx; - /* Do stuff */ - - // Create and display the image. - mlx_image_t* img = mlx_new_image(mlx, WIDTH, HEIGHT); - if (!img || (mlx_image_to_window(mlx, img, 0, 0) < 0)) - ft_error(); - things->img = img; - - // Register a hook and pass mlx as an optional param. - // NOTE: Do this before calling mlx_loop! - mlx_loop_hook(mlx, ft_hook, things); - mlx_loop(mlx); - mlx_delete_image(mlx, img); - mlx_terminate(mlx); - free(things); - + screen_center(game->screen); + mlx_loop_hook(game->screen->mlx, game_loop, game); + mlx_loop(game->screen->mlx); + game_terminate(game); return (EXIT_SUCCESS); -} \ No newline at end of file +} diff --git a/src/render.c b/src/render.c new file mode 100644 index 0000000..420ba89 --- /dev/null +++ b/src/render.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* render.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/15 16:28:10 by qmennen #+# #+# */ +/* Updated: 2025/04/15 16:38:13 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "render.h" +#include "MLX42.h" + +void render_clear(t_screen *screen) +{ + int i; + + i = 0; + while (i++ < screen->width * screen->height) + mlx_put_pixel(screen->img, i % screen->width, i / screen->width, 0x212121ff); +} diff --git a/src/screen.c b/src/screen.c new file mode 100644 index 0000000..2ffdc25 --- /dev/null +++ b/src/screen.c @@ -0,0 +1,49 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* screen.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/15 15:30:27 by qmennen #+# #+# */ +/* Updated: 2025/04/15 16:47:25 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "screen.h" +#include "MLX42.h" +#include + +t_screen *screen_create() +{ + t_screen *screen; + mlx_image_t *img; + mlx_t *mlx; + + screen = malloc(sizeof(t_screen)); + if (!screen) + return (NULL); + screen->width = WIDTH; + screen->height = HEIGHT; + mlx = mlx_init(WIDTH, HEIGHT, TITLE, false); + screen->mlx = mlx; + img = mlx_new_image(screen->mlx, WIDTH, HEIGHT); + screen->img = img; + return (screen); +} + +void screen_center(t_screen *screen) +{ + int m_width; + int m_height; + + m_width = 0; + m_height = 0; + mlx_get_monitor_size(0, &m_width, &m_height); + if (m_width == 0 || m_height == 0) + { + printf(RED"Failed to retrieve monitor size to center window\n"RESET); + return ; + } + mlx_set_window_pos(screen->mlx, (m_width - screen->width) / 2, (m_height - screen->height) / 2); +}