From 3f9a30c16ab5d85a1a92c78408a8b93381ac0162 Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Fri, 16 Aug 2024 22:26:14 -0500 Subject: [PATCH] Added a Border class and cycle timers for some cool color cycling. --- hamster.vcxproj | 8 ++++ hamster.vcxproj.filters | 6 +++ src/Border.cpp | 91 ++++++++++++++++++++++++++++++++++++++++ src/Border.h | 71 +++++++++++++++++++++++++++++++ src/Hamster.cpp | 2 +- src/HamsterGame.cpp | 5 ++- src/HamsterGame.h | 2 + src/olcPixelGameEngine.h | 1 + 8 files changed, 184 insertions(+), 2 deletions(-) create mode 100644 src/Border.cpp create mode 100644 src/Border.h diff --git a/hamster.vcxproj b/hamster.vcxproj index ae1c84f..d7bf606 100644 --- a/hamster.vcxproj +++ b/hamster.vcxproj @@ -324,6 +324,10 @@ if %errorlevel% neq 0 goto :VCEnd + + + + @@ -346,6 +350,10 @@ if %errorlevel% neq 0 goto :VCEnd + + + + diff --git a/hamster.vcxproj.filters b/hamster.vcxproj.filters index 4c5c28a..b3c8a46 100644 --- a/hamster.vcxproj.filters +++ b/hamster.vcxproj.filters @@ -16,6 +16,9 @@ Source Files + + Source Files + @@ -70,5 +73,8 @@ Header Files + + Header Files + \ No newline at end of file diff --git a/src/Border.cpp b/src/Border.cpp new file mode 100644 index 0000000..1e60985 --- /dev/null +++ b/src/Border.cpp @@ -0,0 +1,91 @@ +#pragma region License +/* +License (OLC-3) +~~~~~~~~~~~~~~~ + +Copyright 2024 Joshua Sigona + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions or derivations of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions or derivative works in binary form must reproduce the above +copyright notice. This list of conditions and the following disclaimer must be +reproduced in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may +be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +Portions of this software are copyright © 2024 The FreeType +Project (www.freetype.org). Please see LICENSE_FT.txt for more information. +All rights reserved. +*/ +#pragma endregion +#include "Border.h" +#include "HamsterGame.h" +#include + +const std::unordered_map>Border::BORDER_TEMPLATES{ + {Border::DEFAULT,{"border.png",{{{170,97,124},{114,109,163}},0.6f},{{{252,119,144}},1.2f},{{{231,129,97}},3.6f}}}, +}; + +Border::CycleTimer::CycleTimer(const std::vectorcycle,const float repeatTime) +:cycle(cycle),repeatTime(repeatTime),currentTime(repeatTime),borderParent(nullptr){} + +void Border::ChangeBorder(const Border::BorderTemplate borderTemplate){ + const std::tuple&borderData{BORDER_TEMPLATES.at(borderTemplate)}; + decorative=std::get<1>(borderData); + highlight=std::get<2>(borderData); + background=std::get<3>(borderData); + decorative.borderParent=this; + highlight.borderParent=this; + background.borderParent=this; + img.Create(HamsterGame::GetGFX(std::get<0>(borderData)).Sprite()->width,HamsterGame::GetGFX(std::get<0>(borderData)).Sprite()->height); + for(int y:std::ranges::iota_view(0,img.Sprite()->height)){ + for(int x:std::ranges::iota_view(0,img.Sprite()->width)){ + img.Sprite()->SetPixel(x,y,HamsterGame::GetGFX(std::get<0>(borderData)).Sprite()->GetPixel(x,y)); + } + } + img.Decal()->Update(); +} + +void Border::CycleTimer::Update(const float fElapsedTime){ + currentTime-=fElapsedTime; + if(currentTime<=0.f){ + const Pixel currentCol{cycle[currentInd]}; + currentInd=(currentInd+1)%cycle.size(); + const Pixel newCol{cycle[currentInd]}; + for(int y:std::ranges::iota_view(0,borderParent->img.Sprite()->height)){ + for(int x:std::ranges::iota_view(0,borderParent->img.Sprite()->width)){ + if(borderParent->img.Sprite()->GetPixel(x,y)==currentCol){ + borderParent->img.Sprite()->SetPixel(x,y,newCol); + } + } + } + borderParent->img.Decal()->Update(); + currentTime+=repeatTime; + } +} + +void Border::Update(const float fElapsedTime){ + decorative.Update(fElapsedTime); + highlight.Update(fElapsedTime); + background.Update(fElapsedTime); +} +void Border::Draw(){ + HamsterGame::Game().DrawDecal({},img.Decal()); +} diff --git a/src/Border.h b/src/Border.h new file mode 100644 index 0000000..40234b1 --- /dev/null +++ b/src/Border.h @@ -0,0 +1,71 @@ +#pragma region License +/* +License (OLC-3) +~~~~~~~~~~~~~~~ + +Copyright 2024 Joshua Sigona + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions or derivations of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions or derivative works in binary form must reproduce the above +copyright notice. This list of conditions and the following disclaimer must be +reproduced in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may +be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +Portions of this software are copyright © 2024 The FreeType +Project (www.freetype.org). Please see LICENSE_FT.txt for more information. +All rights reserved. +*/ +#pragma endregion +#pragma once + +#include "olcPixelGameEngine.h" + +class Border{ +public: + enum BorderTemplate{ + DEFAULT, + }; +public: + class CycleTimer{ + friend class Border; + float repeatTime; + float currentTime; + std::vectorcycle; + size_t currentInd{}; + Border*borderParent; + public: + CycleTimer()=default; + CycleTimer(const std::vectorcycle,const float repeatTime); + void Update(const float fElapsedTime); + }; + Renderable img; + CycleTimer decorative; + CycleTimer highlight; + CycleTimer background; +private: + static const std::unordered_map>BORDER_TEMPLATES; +public: + Border()=default; + void ChangeBorder(const Border::BorderTemplate borderTemplate); + void Update(const float fElapsedTime); + void Draw(); +}; \ No newline at end of file diff --git a/src/Hamster.cpp b/src/Hamster.cpp index fca843f..1736473 100644 --- a/src/Hamster.cpp +++ b/src/Hamster.cpp @@ -116,7 +116,7 @@ void Hamster::HandlePlayerControls(){ if(aimingDir!=vf2d{}){ targetRot=aimingDir.norm().polar().y; const vf2d currentVel{vel}; - vel=vf2d{std::min(maxSpd,currentVel.polar().x+(maxSpd*HamsterGame::Game().GetElapsedTime())/timeToMaxSpd),currentVel.polar().y}.cart(); + vel=vf2d{std::min(maxSpd,currentVel.polar().x+(maxSpd*HamsterGame::Game().GetElapsedTime())/timeToMaxSpd),rot}.cart(); frictionEnabled=false; } } diff --git a/src/HamsterGame.cpp b/src/HamsterGame.cpp index 63e7a93..fc9fcf9 100644 --- a/src/HamsterGame.cpp +++ b/src/HamsterGame.cpp @@ -21,6 +21,8 @@ bool HamsterGame::OnUserCreate(){ LoadGraphics(); LoadAnimations(); LoadLevel(); //THIS IS TEMPORARY. + + border.ChangeBorder(Border::DEFAULT); return true; } @@ -64,12 +66,13 @@ void HamsterGame::UpdateGame(const float fElapsedTime){ camera.Update(fElapsedTime); tv.SetWorldOffset(-SCREEN_FRAME.pos+camera.GetViewPosition()); Hamster::UpdateHamsters(fElapsedTime); + border.Update(fElapsedTime); } void HamsterGame::DrawGame(){ tv.FillRectDecal({10,10},{500.f,150.f},WHITE); Hamster::DrawHamsters(tv); - DrawDecal({},GetGFX("border.png").Decal()); + border.Draw(); } bool HamsterGame::OnUserUpdate(float fElapsedTime){ diff --git a/src/HamsterGame.h b/src/HamsterGame.h index 09add84..9867b85 100644 --- a/src/HamsterGame.h +++ b/src/HamsterGame.h @@ -41,6 +41,7 @@ All rights reserved. #include "olcUTIL_Animate2D.h" #include "olcPGEX_TransformedView.h" #include "olcUTIL_Camera2D.h" +#include "Border.h" class HamsterGame : public olc::PixelGameEngine { @@ -72,4 +73,5 @@ private: static std::unordered_mapGFX; static std::unordered_map>ANIMATIONS; static PixelGameEngine*self; + Border border; }; \ No newline at end of file diff --git a/src/olcPixelGameEngine.h b/src/olcPixelGameEngine.h index 8fb2f5a..9fe62ff 100644 --- a/src/olcPixelGameEngine.h +++ b/src/olcPixelGameEngine.h @@ -1,3 +1,4 @@ +#include "olcUTIL_Geometry2D.h" #pragma region license_and_help /* olcPixelGameEngine.h