Added a radar.

sigonasr2 5 months ago
parent 7eda510317
commit 766eba4444
  1. BIN
      assets/radaricons.png
  2. 3
      src/Checkpoint.cpp
  3. 10
      src/Hamster.cpp
  4. 3
      src/Hamster.h
  5. 64
      src/HamsterGame.cpp
  6. 2
      src/HamsterGame.h
  7. 3
      src/Powerup.cpp

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -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<float>(Hamster::GetPlayer().GetPos(),c1.pos).length()>geom2d::line<float>(Hamster::GetPlayer().GetPos(),c2.pos).length();
});
}
void Checkpoint::DrawCheckpoints(TransformedView&tv){
for(Checkpoint&checkpoint:checkpoints){

@ -579,3 +579,13 @@ const bool Hamster::CollectedAllCheckpoints()const{
const bool Hamster::HasCollectedCheckpoint(const Checkpoint&cp)const{
return checkpointsCollected.contains(cp);
}
const std::vector<Hamster>&Hamster::GetHamsters(){
return HAMSTER_LIST;
}
const Hamster::HamsterState&Hamster::GetState()const{
return state;
}
const bool Hamster::BurnedOrDrowned()const{
return GetState()==WAIT;
}

@ -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<Hamster>&GetHamsters();
const HamsterState&GetState()const;
const bool BurnedOrDrowned()const;
};

@ -34,7 +34,7 @@ bool HamsterGame::OnUserCreate(){
std::vector<vf2d>radarCircle;
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<IconType,geom2d::rect<float>>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");

@ -115,4 +115,6 @@ private:
vf2d cloudOffset{};
float speedometerDisplayAmt{0.f};
ViewPort radar;
void DrawRadar();
float radarScale{48.f};
};

@ -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<float>(Hamster::GetPlayer().GetPos(),p1.pos).length()>geom2d::line<float>(Hamster::GetPlayer().GetPos(),p2.pos).length();
});
}
void Powerup::DrawPowerups(TransformedView&tv){

Loading…
Cancel
Save