From 8160ca1b0b86158441fbc73227f0a35d3df199f5 Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 4 Jan 2022 09:48:00 +0100 Subject: [PATCH] Added god --- QUESTIONS.md | 3 +- assets/hand_closed.png | Bin 0 -> 2477 bytes assets/hand_open.png | Bin 0 -> 2477 bytes headers/game.h | 13 +++++- headers/god.h | 37 ++++++++++++++++ headers/pixelManager.h | 19 ++++++--- headers/utils.h | 5 ++- scores.kus | 3 +- src/game/display.cpp | 50 ++++++++++++++++++++++ src/gameBasics.cpp | 43 +------------------ src/godThings.cpp | 95 +++++++++++++++++++++++++++++++++++++++++ src/pixelManager.cpp | 67 +++++++++++++++++------------ 12 files changed, 256 insertions(+), 79 deletions(-) create mode 100644 assets/hand_closed.png create mode 100644 assets/hand_open.png create mode 100644 headers/god.h create mode 100644 src/game/display.cpp create mode 100644 src/godThings.cpp diff --git a/QUESTIONS.md b/QUESTIONS.md index f4424dd..191fc79 100644 --- a/QUESTIONS.md +++ b/QUESTIONS.md @@ -9,4 +9,5 @@ Questions que je (Thomas Rubini) voudrais poser - Que pensez-vous de la sémantique de déplacement, plutot que la référence constante ? - Est-ce qu'on doit forcément utiliser const pour des valeurs primitives (int, float...) qu'on ne touche pas en paramètres de fonction ? - Est-ce que vouloir faire des structures optimisées (pas de redondance de mémoire) est une bonne chose, ou pas importa,t ? -- Pour import MinGL, il vaut mieux utiliser "" ou <> ? \ No newline at end of file +- Pour import MinGL, il vaut mieux utiliser "" ou <> ? +- copier ou ref constante pour Position (Vec2D) ? \ No newline at end of file diff --git a/assets/hand_closed.png b/assets/hand_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..bc73786c782cbc03feef0410749fce0d43ba5d0f GIT binary patch literal 2477 zcmV;e2~zfnP)E-ouz+D=RI8goS>7f18_}p`oHZJw8oMPenyXHa0o&@$uT)+V1Y}FfcRT z-rtIfi!CiMK|w=gWMy1jUCYbNE-o=kOHEiwTyi`FMezDJ*Voa9&`~>Tz*$F)=jN)zz=ButP&d_4W1r{r-rE ziR9$unwpzyYiyB`lI`v7NJvTW@bFz-Uf+!gF(V+1c8{!o$hQ%9NCqL_|fduCK<%$IZ>nnVFihva@1hW9;ngrKP5f zjEU1(L`KEM#ZyyMh=__MB`43%&)eJFCfum6xon ztVc&lI5;~$KR~myv)0zuc6N6;IXwCK`cP0(xVX5Gkdf@{?Qd^z*x1?j_V#aYajUDW zq@<ys(tm$|dwYD6l9Sih z*e@?KJUl)9{rthQ#<>6h2DV8=K~z}7jhFX-6h#<^XX|%%_x8HnU3wuQkq!yH_g;n2 ziwcNxJ-eH57p%>V{^I~KF~24G!B z0<@h)&#s4~+*;Tl<~^y{2WR_l8NZ0(>k9_$6IkJ;REMgnWP z#5uFA<@o@nO5Rd&q<{dS-+<#$0k{HestIr&nR_sg4Gd`l6{`fmcN=Ie0gHjMH*Lmi z`wq@$#CLXeFD8?>^y|!WZvyXG0x*q?VKY+daA6+6>DLu);$Yx|`f6rrS5p9g1sJnJ zqtrZrE^aJ3pc}B4+^8#6z%@qav>rfra)RaNje}b2qV8J&oOB7WdB|PBA3#ZnvubT; zzDN|?L!FE8p^r1YU_8*v7JzZUmL-JrSCWTv0_Kvb<2T;HZn{tRPa?^M>RJn6sZh$_ zJ|CcKkaK&=Xxs@3z_`1Btz=e3XL^Sr`2dSacOJZh*76(~zfRars{mGPCdX1duM13&elU4iliB02Ko5o1G~YQUOm( z|4+rDz5)JEsB(*5v7cW+KFnE9Xmk)Lof_8GoVrE9$Kp|8|AZjpr#QYO2FIbDTsl- zn`CvJUUDswMS{XX^5*-|$+dW-V;LThMp=c1R&maQeZCd-?j=1KTreX`I-jB&ZM_sL z{}zASVXQ`g4$orK9xCr5$W;s+L8WED#4Lb*6mYDz7j`P5s-DL{0Z^XBx|pcW4+-68 zIkbiIEP(a|;Nh|4H8T1eb=XoLWih22ddaN3LITX7UPV7x7Qkoz7}wohm^xxg)VAB9 zbdO^N-3cg>5jhS;7%2S7Fd%g5>SY#8JabwIYNSY zRAERL#_j0C*%}L(dHLSS+gr4#to*&j|7&PK7*Y8J=tfCJS#=<5XEJcr>Y$`8zsn?m zvUw;43Z=_)SvwQz+6JO}`mzL|TA7cBbz6Lm@6Qfc?2EF@E2@>?mWU6E>B6k7ZB5^} zuu}8I7M4FU7&}GV*8LSQvjN0RLy7N8TcKb?@AMuTSJw(Bx?4QH@&MY!-rzhmbjR5H zJnMmyy8fz)9b$6fk(x!G2E$TKaNbTff()gLx^{c%M5nj6L3se(!^s+!P!q*He=RKR zSzP=PeO^kKR0)c<$uQK;c%#h&I3zpJR1}-(*PA9DlRjj8y;ndFU@Q$c`Zr_fiZ!io zkD0vn!pNUT_89-;@gmUJP$GOlCC|vA!t6Y#D>yyebc|a&w-fB9G?0`8Ez$kpFf;0uPOoXUi zu;(PstUX-0A$>^j0Nzdl1cQC2IIinzjxAGx$86;+$drbG9DoWT@^XX8u5sWcfWF}$itGu?lyxd<$6R4*QEq%~m5^2Vdk1?%fzDZRQ5>NW#$?Vl5j^D31fn*fB9nWPvpB~B- r#`7PEG^MXBX-y$Cb2QY9@BjY+VaP`VW2r|)00000NkvXXu0mjf;i28? literal 0 HcmV?d00001 diff --git a/assets/hand_open.png b/assets/hand_open.png new file mode 100644 index 0000000000000000000000000000000000000000..bc73786c782cbc03feef0410749fce0d43ba5d0f GIT binary patch literal 2477 zcmV;e2~zfnP)E-ouz+D=RI8goS>7f18_}p`oHZJw8oMPenyXHa0o&@$uT)+V1Y}FfcRT z-rtIfi!CiMK|w=gWMy1jUCYbNE-o=kOHEiwTyi`FMezDJ*Voa9&`~>Tz*$F)=jN)zz=ButP&d_4W1r{r-rE ziR9$unwpzyYiyB`lI`v7NJvTW@bFz-Uf+!gF(V+1c8{!o$hQ%9NCqL_|fduCK<%$IZ>nnVFihva@1hW9;ngrKP5f zjEU1(L`KEM#ZyyMh=__MB`43%&)eJFCfum6xon ztVc&lI5;~$KR~myv)0zuc6N6;IXwCK`cP0(xVX5Gkdf@{?Qd^z*x1?j_V#aYajUDW zq@<ys(tm$|dwYD6l9Sih z*e@?KJUl)9{rthQ#<>6h2DV8=K~z}7jhFX-6h#<^XX|%%_x8HnU3wuQkq!yH_g;n2 ziwcNxJ-eH57p%>V{^I~KF~24G!B z0<@h)&#s4~+*;Tl<~^y{2WR_l8NZ0(>k9_$6IkJ;REMgnWP z#5uFA<@o@nO5Rd&q<{dS-+<#$0k{HestIr&nR_sg4Gd`l6{`fmcN=Ie0gHjMH*Lmi z`wq@$#CLXeFD8?>^y|!WZvyXG0x*q?VKY+daA6+6>DLu);$Yx|`f6rrS5p9g1sJnJ zqtrZrE^aJ3pc}B4+^8#6z%@qav>rfra)RaNje}b2qV8J&oOB7WdB|PBA3#ZnvubT; zzDN|?L!FE8p^r1YU_8*v7JzZUmL-JrSCWTv0_Kvb<2T;HZn{tRPa?^M>RJn6sZh$_ zJ|CcKkaK&=Xxs@3z_`1Btz=e3XL^Sr`2dSacOJZh*76(~zfRars{mGPCdX1duM13&elU4iliB02Ko5o1G~YQUOm( z|4+rDz5)JEsB(*5v7cW+KFnE9Xmk)Lof_8GoVrE9$Kp|8|AZjpr#QYO2FIbDTsl- zn`CvJUUDswMS{XX^5*-|$+dW-V;LThMp=c1R&maQeZCd-?j=1KTreX`I-jB&ZM_sL z{}zASVXQ`g4$orK9xCr5$W;s+L8WED#4Lb*6mYDz7j`P5s-DL{0Z^XBx|pcW4+-68 zIkbiIEP(a|;Nh|4H8T1eb=XoLWih22ddaN3LITX7UPV7x7Qkoz7}wohm^xxg)VAB9 zbdO^N-3cg>5jhS;7%2S7Fd%g5>SY#8JabwIYNSY zRAERL#_j0C*%}L(dHLSS+gr4#to*&j|7&PK7*Y8J=tfCJS#=<5XEJcr>Y$`8zsn?m zvUw;43Z=_)SvwQz+6JO}`mzL|TA7cBbz6Lm@6Qfc?2EF@E2@>?mWU6E>B6k7ZB5^} zuu}8I7M4FU7&}GV*8LSQvjN0RLy7N8TcKb?@AMuTSJw(Bx?4QH@&MY!-rzhmbjR5H zJnMmyy8fz)9b$6fk(x!G2E$TKaNbTff()gLx^{c%M5nj6L3se(!^s+!P!q*He=RKR zSzP=PeO^kKR0)c<$uQK;c%#h&I3zpJR1}-(*PA9DlRjj8y;ndFU@Q$c`Zr_fiZ!io zkD0vn!pNUT_89-;@gmUJP$GOlCC|vA!t6Y#D>yyebc|a&w-fB9G?0`8Ez$kpFf;0uPOoXUi zu;(PstUX-0A$>^j0Nzdl1cQC2IIinzjxAGx$86;+$drbG9DoWT@^XX8u5sWcfWF}$itGu?lyxd<$6R4*QEq%~m5^2Vdk1?%fzDZRQ5>NW#$?Vl5j^D31fn*fB9nWPvpB~B- r#`7PEG^MXBX-y$Cb2QY9@BjY+VaP`VW2r|)00000NkvXXu0mjf;i28? literal 0 HcmV?d00001 diff --git a/headers/game.h b/headers/game.h index 58b8229..ac625ae 100644 --- a/headers/game.h +++ b/headers/game.h @@ -10,6 +10,7 @@ #include "configData.h" #include "projectiles.h" #include "scoresManager.h" +#include "god.h" using namespace std; @@ -19,6 +20,7 @@ private: PixelManager pm; ConfigData confData; ScoresManager sm; + God god; Position basePos; InvadersGrid grid; @@ -34,10 +36,15 @@ private: unsigned fireCooldown=120; // basic methods - void display(); void updateColumns(); void handleScoreSaving(); + // drawing methods + void display(); + void displayGod(); + void displayInvader(const Position& basePos, unsigned size, InvaderType type); + + // managers void managePlayers(); void manageOnePlayer(unsigned); @@ -51,6 +58,10 @@ private: bool checkTorpedosAndInvaders(); bool invadersTouchPlayer(); + // god things + void manageGod(); + void _manageGod_retrieve(bool back); + public: // in case someone wants to mess with the code, here's a minimal API, costs nothing to us Game(); diff --git a/headers/god.h b/headers/god.h new file mode 100644 index 0000000..1195f7f --- /dev/null +++ b/headers/god.h @@ -0,0 +1,37 @@ +#ifndef GUARD_GOD_H +#define GUARD_GOD_H + +#include "utils.h" + +enum class GodState{ + NONE, + LOAD, + WAIT, + RETRIEVE1, + RETRIEVE2, + THROW, +}; +// I don't want to put that in config, I feel like it would be useless and overkill at this point +#define GOD_BENCH_SIZE 64 +#define GOD_HAND_SIZE 64 +#define GOD_HAND_DISTANCE 100 + + +/* + * Hand position is determined + */ + + +class God{ +public: + GodState state; + unsigned counter; + + Position throwedInvPos; + InvaderType thrownInvType; + Position thrownVector; + Position thrownTransition; + +}; + +#endif diff --git a/headers/pixelManager.h b/headers/pixelManager.h index b41f56b..0d9a94b 100644 --- a/headers/pixelManager.h +++ b/headers/pixelManager.h @@ -11,6 +11,7 @@ #include "utils.h" using namespace std; +using namespace nsGraphics; class PixelManager{ public: @@ -19,12 +20,13 @@ public: nsGui::Sprite background = nsGui::Sprite("./assets/bg.sl2"); // you cant create an empty sprite for some reasons explicit PixelManager(MinGL&); - void drawInvader1(const nsGraphics::Vec2D& baseVector, unsigned size); - void drawInvader2(const nsGraphics::Vec2D& baseVector, unsigned size); - void drawInvader3(const nsGraphics::Vec2D& baseVector, unsigned size); - void drawPlayer(const unsigned x, unsigned width, const nsGraphics::RGBAcolor &color); - void drawTorpedo(const nsGraphics::Vec2D& baseVector, unsigned width, const nsGraphics::RGBAcolor& color); - void drawMissile(const nsGraphics::Vec2D& baseVector, unsigned width, const nsGraphics::RGBAcolor& color); + + void drawInvaderA(const Position& baseVector, unsigned size, RGBAcolor& color); + void drawInvaderB(const Position& baseVector, unsigned size, RGBAcolor& color); + void drawInvaderC(const Position& baseVector, unsigned size, RGBAcolor& color); + void drawPlayer(const unsigned x, unsigned width, const nsGraphics::RGBAcolor& color); + void drawTorpedo(const Position& baseVector, unsigned width, const nsGraphics::RGBAcolor& color); + void drawMissile(const Position& baseVector, unsigned width, const nsGraphics::RGBAcolor& color); void drawBackground(); unsigned showInitialMenu(); @@ -36,6 +38,11 @@ public: void askPlayerNameMenu(playerID pID, string& name); + // y will be negative sometimes, so not unsigned + void displayGodBench(int y); + + void displayGodRightHand(const Position& pos); + void displayGodLeftHand(const Position& pos); }; diff --git a/headers/utils.h b/headers/utils.h index a944976..1c35710 100644 --- a/headers/utils.h +++ b/headers/utils.h @@ -7,6 +7,9 @@ // hardcoded values #define PLAYER_HEIGHT 100 #define PROJ_LENGTH_FACTOR 2 +// TODO utiliser ca de partout +// ou alors faire une method dans Game ? +#define INV_POS(i) confData.invadersSize*(i)+confData.invadersDistance*(i) enum class WinValue{ NOBODY, // should never be used @@ -27,7 +30,7 @@ public: size_t getOutterInvader(); }; typedef vector InvadersGrid; -typedef nsGraphics::Vec2D Position; +typedef nsGraphics::Vec2D Position; // in case we need to ad dmore methods, we defined our own type typedef unsigned playerID; // 0 for player 1, 1 for player 2 // didn't want to use Position because of the semantic with x and y diff --git a/scores.kus b/scores.kus index 019cf10..af13bd1 100644 --- a/scores.kus +++ b/scores.kus @@ -1,5 +1,6 @@ -1722516557529414056 +13651974094361129891 Thomas,1000 Thomas,0 Thomas,0 Thomas,0 +Thomas,0 diff --git a/src/game/display.cpp b/src/game/display.cpp new file mode 100644 index 0000000..27690b7 --- /dev/null +++ b/src/game/display.cpp @@ -0,0 +1,50 @@ +#include "game.h" + + +/** Displays the screen once, and returns + * + */ +void Game::display() { + pm.drawBackground(); + for (unsigned i = 0; i < this->grid.size(); ++i){ + for (unsigned j = 0; j < this->grid[i].size(); ++j){ + Position vec( + basePos.getX() + i * confData.invadersSize + i * confData.invadersDistance, + basePos.getY() + j * confData.invadersSize + j * confData.invadersDistance + ); + displayInvader(vec, confData.invadersSize, grid[i][j]); + } + } + + for(missile& miss : missiles){ + pm.drawMissile(miss, confData.missilesWidth, confData.missilesColor); + } + for(torpedo& tor : torpedos){ + pm.drawTorpedo(tor, confData.torpedosWidth, confData.torpedosColor); + } + + for(size_t i=0;igrid.size(); ++i){ - for (unsigned j = 0; j < this->grid[i].size(); ++j){ - nsGraphics::Vec2D vec( - basePos.getX() + i * confData.invadersSize + i * confData.invadersDistance, - basePos.getY() + j * confData.invadersSize + j * confData.invadersDistance - ); - switch(grid[i][j]){ - case InvaderType::TYPEA:{ - pm.drawInvader1(vec, confData.invadersSize); - break; - } - case InvaderType::TYPEB:{ - pm.drawInvader2(vec, confData.invadersSize); - break; - } - case InvaderType::TYPEC:{ - pm.drawInvader3(vec, confData.invadersSize); - break; - } - } - } - } - - for(missile& miss : missiles){ - pm.drawMissile(miss, confData.missilesWidth, confData.missilesColor); - } - for(torpedo& tor : torpedos){ - pm.drawTorpedo(tor, confData.torpedosWidth, confData.torpedosColor); - } - - for(size_t i=0;i