From 7eda51031795024e2d6604427d333a00d9a2ca05 Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Wed, 21 Aug 2024 01:39:21 -0500 Subject: [PATCH] Add checkpoint arrow indicators for offscreen checkpoints. --- assets/checkpoint_arrow.png | Bin 0 -> 670 bytes assets/checkpoint_arrow.xcf | Bin 0 -> 1541 bytes src/Checkpoint.cpp | 18 ++++++++++++++++++ src/Hamster.cpp | 4 ++++ src/Hamster.h | 1 + src/HamsterGame.cpp | 5 +++++ src/HamsterGame.h | 1 + src/util.cpp | 4 +++- src/util.h | 3 +++ 9 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 assets/checkpoint_arrow.png create mode 100644 assets/checkpoint_arrow.xcf diff --git a/assets/checkpoint_arrow.png b/assets/checkpoint_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..ce55739ed3f72297fbcd78355c24107cfdf752c4 GIT binary patch literal 670 zcmV;P0%84$P)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-@CCIUz)L74ym02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{004GLL_t(o!|j#L4uCKSgIB}*KQRejJvjV<$<%(=WuYsS zwMGc}I|$ylXpOJ{RqY;%$YGr{2YNy_B6jN`sg>r5@Z3P+Jl%2w0|xt&8yJ+X({A8_ zsGBEZdHW)ovIS*BSQ^8!MHF7e5`FqKpHV^52q7O~1+`8!6WC6`{r~^~07*qoM6N<$ Ef)dsq7XSbN literal 0 HcmV?d00001 diff --git a/assets/checkpoint_arrow.xcf b/assets/checkpoint_arrow.xcf new file mode 100644 index 0000000000000000000000000000000000000000..e16392391370a6a7c604282338278bf0f5603eb0 GIT binary patch literal 1541 zcmd^7%Wl&^6uo{Vb{r}m32hfh9bQtph?H#DBGCn6fy6JQj^i4VxN;n5S0MQd*zgZX zEchV*1ACs{PfqpA9mxf*f5;5&M|nZH>q>!V0&`V{04;MuxwCgG*?u3h!8o9wCvxZQpI4Lh6%xXwpA6-S_Ff=G zUQFDE5#JEtyKmmtm|-giuu;&}a1MAqyNLyI;HZEP23soN14`ZEnhH#~+u=iT zMMWWeK)VApK7hN$&3Cj|6S@oTH9CAi-Z47AV0^e!fe%eTd@#N2Iecj9@S&;0ho)|m z#td6IfQ^E#hI7Dq?z{NkefUbh$=3(e(fiZ|0ucj!Xf$8Checkpoint::checkpoints; Checkpoint::Checkpoint(const vf2d pos) :pos(pos){ @@ -71,6 +73,22 @@ void Checkpoint::DrawCheckpoints(TransformedView&tv){ HamsterGame::Game().SetDecalMode(DecalMode::NORMAL); } tv.DrawPartialRotatedDecal(checkpoint.pos,frame.GetSourceImage()->Decal(),0.f,frame.GetSourceRect().size/2,frame.GetSourceRect().pos,frame.GetSourceRect().size); + geom2d::lineplayerToCheckpointLine{geom2d::line(Hamster::GetPlayer().GetPos(),checkpoint.pos)}; + + if(!Hamster::GetPlayer().HasCollectedCheckpoint(checkpoint)){ + const float screenDistance{playerToCheckpointLine.length()*(1.325f/(HamsterGame::Game().GetCameraZ()))}; + if(screenDistance>226){ + const vf2d dirVec{playerToCheckpointLine.vector().norm()}; + const float dir{dirVec.polar().y}; + std::optionalprojCircle{geom2d::project(geom2d::circle({},16),HamsterGame::SCREEN_FRAME,geom2d::ray(HamsterGame::SCREEN_FRAME.middle(),dirVec))}; + if(projCircle.has_value()){ + Pixel arrowCol{PixelLerp(GREEN,BLACK,std::clamp((screenDistance-226)/1000.f,0.f,1.f))}; + uint8_t iconAlpha{uint8_t(util::lerp(255.f,0.f,std::clamp((screenDistance-226)/1000.f,0.f,1.f)))}; + HamsterGame::Game().DrawPartialRotatedDecal(projCircle.value(),HamsterGame::GetGFX("checkpoint.png").Decal(),0.f,{64,64},{},{128,128},{0.125f,0.125f},{255,255,255,iconAlpha}); + HamsterGame::Game().DrawRotatedDecal(projCircle.value(),HamsterGame::GetGFX("checkpoint_arrow.png").Decal(),dir,HamsterGame::GetGFX("checkpoint_arrow.png").Sprite()->Size()/2,{1.f,1.f},arrowCol); + } + } + } } } std::vector&Checkpoint::GetCheckpoints(){ diff --git a/src/Hamster.cpp b/src/Hamster.cpp index 471e183..3e9a569 100644 --- a/src/Hamster.cpp +++ b/src/Hamster.cpp @@ -574,4 +574,8 @@ void Hamster::SetState(const HamsterState state){ const bool Hamster::CollectedAllCheckpoints()const{ return checkpointsCollected.size()==Checkpoint::GetCheckpoints().size(); +} + +const bool Hamster::HasCollectedCheckpoint(const Checkpoint&cp)const{ + return checkpointsCollected.contains(cp); } \ No newline at end of file diff --git a/src/Hamster.h b/src/Hamster.h index 825a02b..6705cf5 100644 --- a/src/Hamster.h +++ b/src/Hamster.h @@ -158,4 +158,5 @@ public: const Terrain::TerrainType GetTerrainHoveringOver()const; void SetState(const HamsterState state); const bool CollectedAllCheckpoints()const; + const bool HasCollectedCheckpoint(const Checkpoint&cp)const; }; \ No newline at end of file diff --git a/src/HamsterGame.cpp b/src/HamsterGame.cpp index 78c7655..1266921 100644 --- a/src/HamsterGame.cpp +++ b/src/HamsterGame.cpp @@ -65,6 +65,7 @@ void HamsterGame::LoadGraphics(){ _LoadImage("speedometer.png"); _LoadImage("speedometer_overlay.png"); _LoadImage("radar.png"); + _LoadImage("checkpoint_arrow.png"); UpdateMatrixTexture(); } @@ -487,6 +488,10 @@ const bool HamsterGame::IsInBounds(const vf2d pos)const{ return !(pos.x<=-160.f||pos.y<=-160.f||pos.x>=currentMap.value().GetData().GetMapData().width*16+160.f||pos.y>=currentMap.value().GetData().GetMapData().height*16+160.f); } +const float HamsterGame::GetCameraZ()const{ + return vEye.z; +} + int main() { HamsterGame game("Project Hamster"); diff --git a/src/HamsterGame.h b/src/HamsterGame.h index f1f49f1..599b8fa 100644 --- a/src/HamsterGame.h +++ b/src/HamsterGame.h @@ -80,6 +80,7 @@ public: void SetZoom(const float zoom); const float GetZoom()const; const bool IsInBounds(const vf2d pos)const; + const float GetCameraZ()const; private: void UpdateGame(const float fElapsedTime); void DrawGame(); diff --git a/src/util.cpp b/src/util.cpp index 8457b08..c993c82 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -1,5 +1,4 @@ #include "util.h" -#include "olcUTIL_Geometry2D.h" std::random_device rd; std::mt19937 rng(rd()); @@ -53,4 +52,7 @@ float olc::util::lerp(float n1,float n2,double t){ } float olc::util::degToRad(float deg){ return deg*(geom2d::pi/180); +} +vf2d olc::util::pointTo(vf2d posFrom,vf2d posTo){ + return geom2d::line(posFrom,posTo).vector().norm(); } \ No newline at end of file diff --git a/src/util.h b/src/util.h index c24bc8c..44ed90f 100644 --- a/src/util.h +++ b/src/util.h @@ -37,6 +37,7 @@ All rights reserved. #pragma endregion #pragma once #include +#include "olcUTIL_Geometry2D.h" namespace olc::util{ //Returns 0-range (as a float). @@ -49,4 +50,6 @@ namespace olc::util{ void turn_towards_direction(float&angle,float target,float rate); float lerp(float n1,float n2,double t); float degToRad(float deg); + //Returns a normalized vector pointing from posFrom towards posTo. + vf2d pointTo(vf2d posFrom,vf2d posTo); }; \ No newline at end of file