From 766eba4444bc3b75db2410b00057c0dcf4d146c3 Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Wed, 21 Aug 2024 03:10:41 -0500 Subject: [PATCH] Added a radar. --- assets/radaricons.png | Bin 0 -> 1648 bytes src/Checkpoint.cpp | 3 ++ src/Hamster.cpp | 10 +++++++ src/Hamster.h | 3 ++ src/HamsterGame.cpp | 64 ++++++++++++++++++++++++++++++++++++++++-- src/HamsterGame.h | 2 ++ src/Powerup.cpp | 3 ++ 7 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 assets/radaricons.png diff --git a/assets/radaricons.png b/assets/radaricons.png new file mode 100644 index 0000000000000000000000000000000000000000..1b79999b3e77f367bfeda48be9b2225d9a8215c4 GIT binary patch literal 1648 zcmV-$29NoPP)000mO1^@s6kp*;E0004mX+uL$Nkc;* zaB^>EX>4Tx04R}tkv&MmKpe$iQ>8_!g6$yUkf92KT~x%eRIvyaN?V~-2b1e3G-*gu zTpR`0f`cE6RRU2TkN3P2bzi}?vEbz>bo=MFUhls^e7t3AD%DO^4LmbX4D&-4V zhx44bI4jjUYu}Tuie$2%`V*8WilF3y8 zBgX=2P$1cU@IUz7tx=qwa*_fup!dbHKE?pwF3@UN*7vbxwN3!^`WJ_L}La_+EpV2qvfZ#3Ax90TL-pAn`v1clY-1nRb6ax7>2Vt#32K00006VoOIv0NenB0D~fgUSt3O010qNS#tmY zE+YT{E+YYWr9XB6000McNliru=m-@D4=C0aeUktH02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00c-$L_t(&-tC%CNK`=_$A2rYi$RAFiLl83v z#?K|TS@E~)&PKul(9?jDfJGSa?Hk+MmK0+jAF^)R+m;kMgz>dS@nvj=6(3()6gq@{ zVnmcyRo-v@(2hp@S0 zU9>(gV!rlup+h*A*cRVEonb}KCALLa5Jn_a>8>I020B?m+SrH=U%c)S?Ocgrb=-36 zwQ@oi_@u73)G8-*fln&6vZ9>O1wI6!azYz?jfDm3cw%!)9pAmbq@2(NJ_X@)OgSM1 z-|Q$rO>6eC)M(F!azYpQq^?x`3B?Ij3Ql(oWh^lOLTwxg-(+GqtHswagrB>AgDZR( z!WXLx;0hmx@J{<1aD@*;xb&(3T;anIUSGHg6ntZA=k}eq6#pV2tonHmFnl_A0A>(J zdp6*4!+CIp&jO*Xlq0Wsvcntb6aWBE+TYr9_P_&Ut*8S=U9*kJdcgI|&^H}Z?Q!YH zM&{XFE{Yt<{dD+b9|fWAdO;3Ix#1x_E0Ip8Gt79N@fmuUPC3Y?&aPJZB_e3TB2%#` zCEK8r|KVZ5H#MGwhNkF|K^x?LF7R<7G(lF=didbwJPF~zhbc!88o|R(=K>)Gqdb>j z2EisJp>u%`{e7W0Ut?i`6NCqm1Pr%2ocfr3pzpr;XYd}$bpcxte2I7>Dh6fEd`at@)dmC7a(0uZ-X2VLuiDPIT?{o zhd;T%=aK;qyVeVGL6Z~8K9l?DHJ)rueL*g$r(RPE_9R^T!^VC3brX<5%Pia_nB!b> z2}2W`TV%RD=xms?1cTj=I@X<%17T2~%?0%u(6n?Hab1Sd;3K!;{->P~QwrwpgqU=a zcS2GrKPwgMePQo}7?)I-u}*uz7(NB91B4hpDHjMad(Hamster::GetPlayer().GetPos(),c1.pos).length()>geom2d::line(Hamster::GetPlayer().GetPos(),c2.pos).length(); + }); } void Checkpoint::DrawCheckpoints(TransformedView&tv){ for(Checkpoint&checkpoint:checkpoints){ diff --git a/src/Hamster.cpp b/src/Hamster.cpp index 3e9a569..b059ddc 100644 --- a/src/Hamster.cpp +++ b/src/Hamster.cpp @@ -578,4 +578,14 @@ const bool Hamster::CollectedAllCheckpoints()const{ const bool Hamster::HasCollectedCheckpoint(const Checkpoint&cp)const{ return checkpointsCollected.contains(cp); +} +const std::vector&Hamster::GetHamsters(){ + return HAMSTER_LIST; +} +const Hamster::HamsterState&Hamster::GetState()const{ + return state; +} + +const bool Hamster::BurnedOrDrowned()const{ + return GetState()==WAIT; } \ No newline at end of file diff --git a/src/Hamster.h b/src/Hamster.h index 6705cf5..9a07ad3 100644 --- a/src/Hamster.h +++ b/src/Hamster.h @@ -159,4 +159,7 @@ public: void SetState(const HamsterState state); const bool CollectedAllCheckpoints()const; const bool HasCollectedCheckpoint(const Checkpoint&cp)const; + static const std::vector&GetHamsters(); + const HamsterState&GetState()const; + const bool BurnedOrDrowned()const; }; \ No newline at end of file diff --git a/src/HamsterGame.cpp b/src/HamsterGame.cpp index 1266921..5bc5163 100644 --- a/src/HamsterGame.cpp +++ b/src/HamsterGame.cpp @@ -34,7 +34,7 @@ bool HamsterGame::OnUserCreate(){ std::vectorradarCircle; for(int i=360;i>=0;i-=4){ float angle=util::degToRad(float(i))-geom2d::pi/2; - if(i==360){radarCircle.push_back(vf2d{cos(angle),sin(angle)}*42+43);} + if(i==360){radarCircle.push_back(vf2d{cos(angle),sin(angle)}*43+vf2d{43,44});} radarCircle.push_back(vf2d{cos(angle),sin(angle)}*43+vf2d{43,44}); } radar=ViewPort{radarCircle,{5.f,8.f}}; @@ -66,6 +66,7 @@ void HamsterGame::LoadGraphics(){ _LoadImage("speedometer_overlay.png"); _LoadImage("radar.png"); _LoadImage("checkpoint_arrow.png"); + _LoadImage("radaricons.png"); UpdateMatrixTexture(); } @@ -161,6 +162,13 @@ void HamsterGame::LoadLevel(const std::string&mapName){ void HamsterGame::UpdateGame(const float fElapsedTime){ vEye.z+=(Hamster::GetPlayer().GetZ()+zoom-vEye.z)*fLazyFollowRate*fElapsedTime; speedometerDisplayAmt+=(Hamster::GetPlayer().GetSpeed()-speedometerDisplayAmt)*fLazyFollowRate*fElapsedTime; + + if(GetMouseWheel()>0){ + radarScale=std::clamp(radarScale/2.f,6.f,96.f); + }else if(GetMouseWheel()<0){ + radarScale=std::clamp(radarScale*2.f,6.f,96.f); + } + UpdateMatrixTexture(); UpdateWaterTexture(); cloudOffset+=cloudSpd*fElapsedTime; @@ -255,8 +263,8 @@ void HamsterGame::DrawGame(){ } } DrawStringDecal(SCREEN_FRAME.pos+SCREEN_FRAME.size-speedometerStrSize-vf2d{4.f,4.f},speedometerStr,speedometerCol); - radar.FillRectDecal({},{128,128},GREEN); DrawDecal({2.f,4.f},GetGFX("radar.png").Decal()); + DrawRadar(); } const Terrain::TerrainType HamsterGame::GetTerrainTypeAtPos(const vf2d pos)const{ @@ -492,6 +500,58 @@ const float HamsterGame::GetCameraZ()const{ return vEye.z; } +void HamsterGame::DrawRadar(){ + const vf2d radarOffset{43.f,44.f}; + const auto WorldToRadar=[this,&radarOffset](const vf2d&pos){ + vf2d relativeWorldPos{pos-Hamster::GetPlayer().GetPos()}; + return relativeWorldPos/radarScale+radarOffset+vf2d{5.f,8.f}/radarScale; + }; + + enum IconType{ + CHECKPOINT, + WHEEL, + GRASS, + SAND, + SWAMP, + LAVA, + FOREST, + ICE, + JET, + HAMSTER, + }; + + const std::unordered_map>icon{ + {CHECKPOINT,{{16.f*0,0.f},{16.f,16.f}}}, + {WHEEL,{{16.f*1,0.f},{16.f,16.f}}}, + {GRASS,{{16.f*2,0.f},{16.f,16.f}}}, + {SAND,{{16.f*3,0.f},{16.f,16.f}}}, + {SWAMP,{{16.f*4,0.f},{16.f,16.f}}}, + {LAVA,{{16.f*5,0.f},{16.f,16.f}}}, + {FOREST,{{16.f*6,0.f},{16.f,16.f}}}, + {ICE,{{16.f*7,0.f},{16.f,16.f}}}, + {JET,{{16.f*8,0.f},{16.f,16.f}}}, + {HAMSTER,{{16.f*9,0.f},{16.f,16.f}}}, + }; + + for(const Powerup&powerup:Powerup::GetPowerups()){ + IconType powerupIcon{IconType(int(powerup.GetType())+1)}; + uint8_t iconAlpha{255U}; + if(Hamster::GetPlayer().HasPowerup(powerup.GetType()))iconAlpha=64U; + radar.DrawPartialRotatedDecal(WorldToRadar(powerup.GetPos()),GetGFX("radaricons.png").Decal(),0.f,{8.f,8.f},icon.at(powerupIcon).pos,icon.at(powerupIcon).size,{1.f,1.f},{255,255,255,iconAlpha}); + } + for(const Checkpoint&cp:Checkpoint::GetCheckpoints()){ + uint8_t iconAlpha{255U}; + if(Hamster::GetPlayer().HasCollectedCheckpoint(cp))iconAlpha=64U; + radar.DrawPartialRotatedDecal(WorldToRadar(cp.GetPos()),GetGFX("radaricons.png").Decal(),0.f,{8.f,8.f},icon.at(CHECKPOINT).pos,icon.at(CHECKPOINT).size,{1.f,1.f},{255,255,255,iconAlpha}); + } + for(const Hamster&h:Hamster::GetHamsters()){ + if(&h==&Hamster::GetPlayer())continue; + uint8_t iconAlpha{255U}; + if(h.BurnedOrDrowned())iconAlpha=64U; + radar.DrawPartialRotatedDecal(WorldToRadar(h.GetPos()),GetGFX("radaricons.png").Decal(),0.f,{8.f,8.f},icon.at(HAMSTER).pos,icon.at(HAMSTER).size,{1.f,1.f},{255,255,255,iconAlpha}); + } +} + int main() { HamsterGame game("Project Hamster"); diff --git a/src/HamsterGame.h b/src/HamsterGame.h index 599b8fa..19cae73 100644 --- a/src/HamsterGame.h +++ b/src/HamsterGame.h @@ -115,4 +115,6 @@ private: vf2d cloudOffset{}; float speedometerDisplayAmt{0.f}; ViewPort radar; + void DrawRadar(); + float radarScale{48.f}; }; \ No newline at end of file diff --git a/src/Powerup.cpp b/src/Powerup.cpp index b61a4df..4f7b779 100644 --- a/src/Powerup.cpp +++ b/src/Powerup.cpp @@ -107,6 +107,9 @@ void Powerup::UpdatePowerups(const float fElapsedTime){ if(powerup.spinSpd>=3.f)powerup.spinSpd=0.f; } } + std::sort(powerupList.begin(),powerupList.end(),[](const Powerup&p1,const Powerup&p2){ + return geom2d::line(Hamster::GetPlayer().GetPos(),p1.pos).length()>geom2d::line(Hamster::GetPlayer().GetPos(),p2.pos).length(); + }); } void Powerup::DrawPowerups(TransformedView&tv){