From 7cf2bb7c3abd3854fbe904b90778db29d2f00cb1 Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Sat, 17 Aug 2024 13:34:32 -0500 Subject: [PATCH] Add in wheel and extra Animate2D helper functions. --- assets/hamster.png | Bin 1483 -> 2466 bytes assets/hamster.xcf | Bin 0 -> 19253 bytes src/Hamster.cpp | 11 ++++++++++- src/Hamster.h | 5 +++-- src/HamsterGame.cpp | 2 ++ src/HamsterGame.h | 2 ++ src/olcUTIL_Animate2D.h | 20 ++++++++++++++++++++ 7 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 assets/hamster.xcf diff --git a/assets/hamster.png b/assets/hamster.png index 05820802618795b1b1ef826828dd1d411e47c0df..404137c5a55f4bc750f4fcc8d0776274bcc38c04 100644 GIT binary patch delta 1989 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 E0JWCYLjV8( diff --git a/assets/hamster.xcf b/assets/hamster.xcf new file mode 100644 index 0000000000000000000000000000000000000000..27240c8d8d21071adc051bdcd1af51b23b2d0624 GIT binary patch literal 19253 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,h.rot,wheelBottomImg.GetSourceRect().size/2,wheelBottomImg.GetSourceRect().pos,wheelBottomImg.GetSourceRect().size); tv.DrawPartialRotatedDecal(h.pos,img.GetSourceImage()->Decal(),h.rot,img.GetSourceRect().size/2,img.GetSourceRect().pos,img.GetSourceRect().size); + tv.DrawPartialRotatedDecal(h.pos,wheelTopImg.GetSourceImage()->Decal(),h.rot,wheelTopImg.GetSourceRect().size/2,wheelTopImg.GetSourceRect().pos,wheelTopImg.GetSourceRect().size,{1.f,1.f},{255,255,255,192}); } } @@ -140,6 +147,8 @@ void Hamster::TurnTowardsTargetDirection(){ void Hamster::MoveHamster(){ pos+=vel*HamsterGame::Game().GetElapsedTime(); + + distanceTravelled+=vel.mag()*HamsterGame::Game().GetElapsedTime(); #pragma region Handle Friction if(frictionEnabled){ diff --git a/src/Hamster.h b/src/Hamster.h index cbc30a9..2f0c659 100644 --- a/src/Hamster.h +++ b/src/Hamster.h @@ -48,7 +48,7 @@ class Hamster{ NPC=false, }; - enum PlayerState{ + enum HamsterState{ NORMAL, BUMPED, }; @@ -74,12 +74,13 @@ class Hamster{ bool frictionEnabled{false}; float collisionRadius{12.f}; float bumpTimer{}; + double distanceTravelled{}; std::string img; Animate2D::Animationanimations; Animate2D::AnimationState internalAnimState; PlayerControlled IsPlayerControlled; static std::optionalplayerHamster; - PlayerState state{NORMAL}; + HamsterState state{NORMAL}; public: Hamster(const vf2d spawnPos,const std::string_view img,const PlayerControlled IsPlayerControlled=NPC); static const Hamster&GetPlayer(); diff --git a/src/HamsterGame.cpp b/src/HamsterGame.cpp index f446547..d604f0d 100644 --- a/src/HamsterGame.cpp +++ b/src/HamsterGame.cpp @@ -57,6 +57,8 @@ void HamsterGame::LoadAnimations(){ }; LoadAnimation(DEFAULT,"hamster.png",{{0,32},{32,32}},0.3f); + LoadAnimation(WHEEL_TOP,"hamster.png",{{0,96},{32,96}},0.1f); + LoadAnimation(WHEEL_BOTTOM,"hamster.png",{{64,96},{96,96}},0.1f); Animate2D::FrameSequence&waterAnimFrames{(*ANIMATED_TILE_IDS.insert({1384,Animate2D::FrameSequence{0.2f}}).first).second}; for(vf2d&sourcePos:std::vector{{192+16*0,784},{192+16*1,784},{192+16*2,784},{192+16*3,784},{192+16*4,784},{192+16*5,784},{192+16*6,784},{192+16*7,784}}){ waterAnimFrames.AddFrame(Animate2D::Frame{&GetGFX("gametiles.png"),{sourcePos,{16,16}}}); diff --git a/src/HamsterGame.h b/src/HamsterGame.h index bead40a..a9edb7d 100644 --- a/src/HamsterGame.h +++ b/src/HamsterGame.h @@ -52,6 +52,8 @@ class HamsterGame : public olc::PixelGameEngine public: enum AnimationState{ DEFAULT, + WHEEL_TOP, + WHEEL_BOTTOM, }; HamsterGame(); diff --git a/src/olcUTIL_Animate2D.h b/src/olcUTIL_Animate2D.h index 580b68f..21961d0 100644 --- a/src/olcUTIL_Animate2D.h +++ b/src/olcUTIL_Animate2D.h @@ -117,6 +117,11 @@ namespace olc::utils::Animate2D m_nStyle = nStyle; } + inline void ChangeFrameDuration(const float fFrameDuration){ + m_fFrameDuration = fFrameDuration; + m_fFrameRate = 1.0f / m_fFrameDuration; + } + // Adds a frame to this sequence inline void AddFrame(const Frame& frame) { @@ -165,6 +170,7 @@ namespace olc::utils::Animate2D // that are animated. Under normal circumstances, it is never updated manually struct AnimationState { + private: size_t nIndex = 0; float fTime = 0.0f; @@ -212,10 +218,24 @@ namespace olc::utils::Animate2D { m_vSequences.emplace_back(sequence); m_mapStateIndices[sStateName] = m_vSequences.size() - 1; + m_mapIndexStates[m_vSequences.size() - 1] = sStateName; + } + + inline const FrameSequence&GetFrames(const StatesEnum&sStateName)const{ + return m_vSequences.at(m_mapStateIndices.at(sStateName)); + } + + inline const FrameSequence&GetFrames(const AnimationState& state)const{ + return m_vSequences.at(state.nIndex); + } + + inline const StatesEnum&GetState(const AnimationState& state)const{ + return m_mapIndexStates.at(state.nIndex); } private: std::vector m_vSequences; std::unordered_map m_mapStateIndices; + std::unordered_map m_mapIndexStates; }; } \ No newline at end of file