diff --git a/assets/radaricons.png b/assets/radaricons.png new file mode 100644 index 0000000..1b79999 Binary files /dev/null and b/assets/radaricons.png differ diff --git a/src/Checkpoint.cpp b/src/Checkpoint.cpp index aa0b240..c87110c 100644 --- a/src/Checkpoint.cpp +++ b/src/Checkpoint.cpp @@ -63,6 +63,9 @@ void Checkpoint::UpdateCheckpoints(const float fElapsedTime){ } } } + std::sort(checkpoints.begin(),checkpoints.end(),[](const Checkpoint&c1,const Checkpoint&c2){ + return geom2d::line(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){