From 6c0490596a0a662af919eea565d9e12109fac37c Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Sat, 24 Aug 2024 20:54:36 -0500 Subject: [PATCH] Redo shadow text to use a shadow decal. --- assets/font_shadow.png | Bin 0 -> 15212 bytes assets/highlight_button.png | Bin 0 -> 793 bytes src/FloatingText.cpp | 8 +-- src/Hamster.cpp | 23 +------- src/HamsterAI.cpp | 14 +---- src/HamsterGame.cpp | 19 +------ src/HamsterGame.h | 1 - src/HamsterLeaderboard.cpp | 7 +-- src/Menu.cpp | 2 +- src/Menu.h | 3 + src/TODO.txt | 2 + src/olcPGEX_TransformedView.h | 22 +++++++ src/olcPixelGameEngine.h | 104 +++++++++++++++++++++++++++++++++- 13 files changed, 140 insertions(+), 65 deletions(-) create mode 100644 assets/font_shadow.png create mode 100644 assets/highlight_button.png diff --git a/assets/font_shadow.png b/assets/font_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..530cb331b393176e56714d98e8ab0a770f2b2bc2 GIT binary patch literal 15212 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 EFR|eO)Bpeg literal 0 HcmV?d00001 diff --git a/assets/highlight_button.png b/assets/highlight_button.png new file mode 100644 index 0000000000000000000000000000000000000000..a5542e9d38e19ea3741fbfd745d0c8a6cc51db15 GIT binary patch literal 793 zcmV+!1LpjRP)EX>4Tx04R}tkv&MmKpe$iQ^lec2P=p;WT;Mdu_BJ8ibb$c+6t{Ym|Xe=O&XFE z7e~Rh;NZt%)xpJCR|i)?5c~jfc5qU3krMxx6k5c1aNLh~_a1le0HIlBs@W3*RLwHd ziMW`{uZn%I2w(&Qh$1L4Q%`0Vv+x{W_we!cF2b|C&;29%C|}6A ztZ?4qtXAu+eNXeSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{008kxL_t(o!|j+m5`!QRK-UaM5gTq`X+dq3d)V1!(%E^B zRMr&Uf+iluR1o}v3@IS{DreYTXWk&Po8?701L6%)50mJC@)jo19R{bq?i!=w006SQ zC})?1t1pN#|7vZ@+oiy|8TF!+0vO}gB1dttCIq!f6toxm7}p|A7~ zB<6NhmY=TzP3`cwzc-)yEyTIS%x7KrlvBx-?(KPV6dqCgag0*xCtV(&^01%_&U zQtw1e$k~k>u|w9Kh%)@kW;~UF#b%h`LdbDY?D>?p-(EPx3(OwztVRm?i*Xj7Wd3{r X-FLf_>EYLz00000NkvXXu0mjfkQ-d$ literal 0 HcmV?d00001 diff --git a/src/FloatingText.cpp b/src/FloatingText.cpp index 9871921..16cd97f 100644 --- a/src/FloatingText.cpp +++ b/src/FloatingText.cpp @@ -73,14 +73,8 @@ void FloatingText::Draw(TransformedView&tv){ uint8_t alpha{uint8_t(util::lerp(0U,255U,lifetime/4.f))}; - HamsterGame::Game().SetZ(0.014f); - for(int y:std::ranges::iota_view(-1,2)){ - for(int x:std::ranges::iota_view(-1,2)){ - tv.DrawRotatedStringDecal(pos+vi2d{x,y},text,0.f,strSize/2,{0,0,0,alpha},scale); - } - } HamsterGame::Game().SetZ(0.015f); - tv.DrawRotatedStringDecal(pos,text,0.f,strSize/2,{currentCol.r,currentCol.g,currentCol.b,uint8_t(currentCol.a*(alpha/255.f))},scale); + tv.DrawShadowRotatedStringDecal(pos,text,0.f,strSize/2,{currentCol.r,currentCol.g,currentCol.b,uint8_t(currentCol.a*(alpha/255.f))},{0,0,0,alpha},scale); HamsterGame::Game().SetZ(0.f); } void FloatingText::CreateFloatingText(const vf2d&pos,const std::string&text,const std::vector&colorCycle,const vf2d&scale){ diff --git a/src/Hamster.cpp b/src/Hamster.cpp index 8f39ad2..00a6c59 100644 --- a/src/Hamster.cpp +++ b/src/Hamster.cpp @@ -393,23 +393,11 @@ void Hamster::DrawOverlay(){ if(GetPlayer().HasPowerup(Powerup::JET)&&!GetPlayer().hamsterJet.has_value()){ const std::string readyText{"READY!"}; const vi2d textSize{HamsterGame::Game().GetTextSize(readyText)}; - for(int y:std::ranges::iota_view(-1,2)){ - for(int x:std::ranges::iota_view(-1,2)){ - if(x==0&&y==0)continue; - HamsterGame::Game().DrawRotatedStringDecal(jetDisplayOffset+vf2d{48.f,116.f}+vi2d{x,y},readyText,0.f,textSize/2,fmod(GetPlayer().readyFlashTimer,1.5f)<=0.75f?DARK_RED:BLACK); - } - } - HamsterGame::Game().DrawRotatedStringDecal(jetDisplayOffset+vf2d{48.f,116.f},readyText,0.f,textSize/2,GREEN); + HamsterGame::Game().DrawShadowRotatedStringDecal(jetDisplayOffset+vf2d{48.f,116.f},readyText,0.f,textSize/2,GREEN,fmod(GetPlayer().readyFlashTimer,1.5f)<=0.75f?DARK_RED:BLACK); HamsterGame::Game().DrawDecal(HamsterGame::SCREEN_FRAME.pos+vf2d{HamsterGame::SCREEN_FRAME.size.x,0.f},HamsterGame::GetGFX("fuelmeter.png").Decal()); const std::string launchText{"(SPACE)x2\nto Launch!"}; const vi2d launchTextSize{HamsterGame::Game().GetTextSize(launchText)}; - for(int y:std::ranges::iota_view(-1,2)){ - for(int x:std::ranges::iota_view(-1,2)){ - if(x==0&&y==0)continue; - HamsterGame::Game().DrawRotatedStringDecal(jetDisplayOffset+vf2d{48.f,224.f}+vi2d{x,y},launchText,0.f,launchTextSize/2,BLACK); - } - } - HamsterGame::Game().DrawRotatedStringDecal(jetDisplayOffset+vf2d{48.f,224.f},launchText,0.f,launchTextSize/2,WHITE); + HamsterGame::Game().DrawShadowRotatedStringDecal(jetDisplayOffset+vf2d{48.f,224.f},launchText,0.f,launchTextSize/2,WHITE,BLACK); }else{ HamsterGame::Game().DrawPartialDecal(HamsterGame::SCREEN_FRAME.pos+vf2d{HamsterGame::SCREEN_FRAME.size.x,0.f},HamsterGame::GetGFX("fuelmeter.png").Decal(),{0,0},{96,200}); } @@ -425,12 +413,7 @@ void Hamster::DrawOverlay(){ if(fmod(HamsterGame::Game().GetRuntime(),2.f)<1.f&&GetPlayer().boostCounter>i)HamsterGame::Game().DrawDecal(HamsterGame::SCREEN_FRAME.pos+vf2d{i*16.f+4.f,HamsterGame::SCREEN_FRAME.size.y-18.f},HamsterGame::GetGFX("boost_outline.png").Decal(),{0.125f,0.125f},GetPlayer().boostCounter>i?WHITE:BLACK); else HamsterGame::Game().DrawDecal(HamsterGame::SCREEN_FRAME.pos+vf2d{i*16.f+4.f,HamsterGame::SCREEN_FRAME.size.y-18.f},HamsterGame::GetGFX("boost.png").Decal(),{0.125f,0.125f},GetPlayer().boostCounter>i?WHITE:BLACK); } - for(int y:std::ranges::iota_view(-1,2)){ - for(int x:std::ranges::iota_view(-1,2)){ - HamsterGame::Game().DrawStringDecal(HamsterGame::SCREEN_FRAME.pos+vf2d{3*16.f+8.f,HamsterGame::SCREEN_FRAME.size.y-12.f}+vi2d{x,y},"\"R\" - BOOST",fmod(HamsterGame::Game().GetRuntime(),2.f)<1.f?RED:BLACK); - } - } - HamsterGame::Game().DrawStringDecal(HamsterGame::SCREEN_FRAME.pos+vf2d{3*16.f+8.f,HamsterGame::SCREEN_FRAME.size.y-12.f},"\"R\" - BOOST",YELLOW); + HamsterGame::Game().DrawShadowStringDecal(HamsterGame::SCREEN_FRAME.pos+vf2d{3*16.f+8.f,HamsterGame::SCREEN_FRAME.size.y-12.f},"\"R\" - BOOST",YELLOW,fmod(HamsterGame::Game().GetRuntime(),2.f)<1.f?RED:BLACK); } } diff --git a/src/HamsterAI.cpp b/src/HamsterAI.cpp index 9b0b4d1..9087ecb 100644 --- a/src/HamsterAI.cpp +++ b/src/HamsterAI.cpp @@ -58,19 +58,9 @@ void HamsterAI::DrawOverlay(){ if(recordingMode){ if(HamsterGame::Game().IsTextEntryEnabled()){ std::string displayStr{std::format("{}\n{}","0=SMART 1=NORMAL 2=DUMB",HamsterGame::Game().TextEntryGetString())}; - for(int y:std::ranges::iota_view(-1,2)){ - for(int x:std::ranges::iota_view(-1,2)){ - HamsterGame::Game().DrawStringDecal({2.f+x,2.f+y},displayStr,BLACK); - } - } - HamsterGame::Game().DrawStringDecal({2.f,2.f},displayStr,YELLOW); + HamsterGame::Game().DrawShadowStringDecal({2.f,2.f},displayStr,YELLOW,BLACK); }else if(fmod(HamsterGame::Game().GetRuntime(),1.f)<0.5f){ - for(int y:std::ranges::iota_view(-1,2)){ - for(int x:std::ranges::iota_view(-1,2)){ - HamsterGame::Game().DrawStringDecal({2.f+x,2.f+y},"RECORDING",BLACK); - } - } - HamsterGame::Game().DrawStringDecal({2.f,2.f},"RECORDING",RED); + HamsterGame::Game().DrawShadowStringDecal({2.f,2.f},"RECORDING",RED,BLACK); } } } diff --git a/src/HamsterGame.cpp b/src/HamsterGame.cpp index afd4436..745442e 100644 --- a/src/HamsterGame.cpp +++ b/src/HamsterGame.cpp @@ -57,7 +57,6 @@ bool HamsterGame::OnUserCreate(){ 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}}; for(int i:std::ranges::iota_view(0,8)){ waterTiles.emplace_back(); @@ -280,13 +279,8 @@ void HamsterGame::DrawGame(){ SetDecalMode(DecalMode::NORMAL); DrawPartialDecal({drawX,drawY},GetGFX("gametiles.png").Decal(),powerupSubimageRect.pos,powerupSubimageRect.size); SetDecalMode(DecalMode::ADDITIVE); - for(int y:std::ranges::iota_view(-1,2)){ - for(int x:std::ranges::iota_view(-1,2)){ - DrawRotatedStringDecal(vf2d{drawX+16.f,drawY+32.f}+vi2d{x,y},powerupName,0.f,powerupTextSize/2,CYAN,{0.5f,1.f}); - } - } SetDecalMode(DecalMode::NORMAL); - DrawRotatedStringDecal({drawX+16.f,drawY+32.f},powerupName,0.f,powerupTextSize/2,VERY_DARK_BLUE,{0.5f,1.f}); + DrawShadowRotatedStringDecal({drawX+16.f,drawY+32.f},powerupName,0.f,powerupTextSize/2,VERY_DARK_BLUE,CYAN,{0.5f,1.f}); }else{ DrawPartialDecal({drawX,drawY},GetGFX("gametiles.png").Decal(),powerupSubimageRect.pos,powerupSubimageRect.size,{1.f,1.f},VERY_DARK_GREY); DrawRotatedStringDecal({drawX+16.f,drawY+32.f},powerupName,0.f,powerupTextSize/2,DARK_GREY,{0.5f,1.f}); @@ -316,13 +310,7 @@ void HamsterGame::DrawGame(){ if(speedometerDisplayAmt>=180)speedometerCol=RED; else if(speedometerDisplayAmt>=120)speedometerCol=YELLOW; else if(speedometerDisplayAmt>=80)speedometerCol=GREEN; - for(int y:std::ranges::iota_view(-1,2)){ - for(int x:std::ranges::iota_view(-1,2)){ - if(x==0&&y==0)continue; - DrawStringDecal(SCREEN_FRAME.pos+SCREEN_FRAME.size-speedometerStrSize-vf2d{4.f,4.f}+vi2d{x,y},speedometerStr,BLACK); - } - } - DrawStringDecal(SCREEN_FRAME.pos+SCREEN_FRAME.size-speedometerStrSize-vf2d{4.f,4.f},speedometerStr,speedometerCol); + DrawShadowStringDecal(SCREEN_FRAME.pos+SCREEN_FRAME.size-speedometerStrSize-vf2d{4.f,4.f},speedometerStr,speedometerCol,BLACK); DrawDecal({2.f,4.f},GetGFX("radar.png").Decal()); DrawRadar(); leaderboard.Draw(*this); @@ -536,8 +524,7 @@ void HamsterGame::DrawRadar(){ }; const auto DeferRenderingBasedOnPosition=[this,&icon](const vf2d&pos,const IconType powerupIcon,const uint8_t iconAlpha){ - if(geom2d::intersects(geom2d::circle{{43.f+5.f,44.f+8.f},43},geom2d::rect{pos-vf2d{16.f,16.f},{32.f,32.f}}).size()>0)radar.DrawPartialRotatedDecal(pos,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}); - else if(geom2d::contains(geom2d::circle{{43.f+5.f,44.f+8.f},43},geom2d::rect{pos-vf2d{8.f,8.f},{16.f,16.f}}))DrawPartialRotatedDecal(pos+vf2d{5.f,8.f},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}); + if(geom2d::contains(geom2d::circle{{43.f+5.f,44.f+8.f},43},geom2d::rect{pos-vf2d{8.f,8.f},{16.f,16.f}}))DrawPartialRotatedDecal(pos+vf2d{5.f,8.f},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 Powerup&powerup:Powerup::GetPowerups()){ diff --git a/src/HamsterGame.h b/src/HamsterGame.h index 3c58a77..cf89e75 100644 --- a/src/HamsterGame.h +++ b/src/HamsterGame.h @@ -140,7 +140,6 @@ private: vf2d cloudSpd{}; vf2d cloudOffset{}; float speedometerDisplayAmt{0.f}; - ViewPort radar; void DrawRadar(); float radarScale{36.f}; std::vectorwaterTiles; diff --git a/src/HamsterLeaderboard.cpp b/src/HamsterLeaderboard.cpp index d10d12f..58bc19b 100644 --- a/src/HamsterLeaderboard.cpp +++ b/src/HamsterLeaderboard.cpp @@ -100,12 +100,7 @@ void HamsterLeaderboard::Draw(HamsterGame&game){ Pixel blinkCol{DARK_RED}; if(playerPlacement==1)blinkCol=CYAN; else if(playerPlacement<=3)blinkCol=DARK_GREEN; - for(int y:std::ranges::iota_view(-1,2)){ - for(int x:std::ranges::iota_view(-1,2)){ - game.DrawRotatedStringPropDecal(progressBarBottomPos+vf2d{-4.f,8.f}+vi2d{x,y},placementStr,0.f,{},BLACK,{3.f,3.f}); - } - } - game.DrawRotatedStringPropDecal(progressBarBottomPos+vf2d{-4.f,8.f},placementStr,0.f,{},blinkCol,{3.f,3.f}); + game.DrawShadowRotatedStringPropDecal(progressBarBottomPos+vf2d{-4.f,8.f},placementStr,0.f,{},blinkCol,BLACK,{3.f,3.f}); } } diff --git a/src/Menu.cpp b/src/Menu.cpp index a06ff43..9b890b0 100644 --- a/src/Menu.cpp +++ b/src/Menu.cpp @@ -150,7 +150,7 @@ void Menu::Draw(HamsterGame&game,const MenuType menu,const vi2d pos){ game.border.Draw(); }break; case MAIN_MENU:{ - game.FillRectDecal(pos,game.SCREEN_FRAME.size,{}); + game.DrawPartialDecal(vi2d{pos},game.SCREEN_FRAME.size,game.GetGFX("background1.png").Decal(),vf2d{}+int(game.GetRuntime()*4),game.SCREEN_FRAME.size); game.DrawRotatedDecal(pos,game.GetGFX("button.png").Decal(),0.f,game.GetGFX("button.png").Sprite()->Size()/2); game.border.Draw(); }break; diff --git a/src/Menu.h b/src/Menu.h index 7050db4..3d36735 100644 --- a/src/Menu.h +++ b/src/Menu.h @@ -41,6 +41,9 @@ All rights reserved. class HamsterGame; class Menu{ + class Button{ + std::string buttonText; + }; enum MenuType{ INITIALIZE, TITLE_SCREEN, diff --git a/src/TODO.txt b/src/TODO.txt index db6741b..42b6c59 100644 --- a/src/TODO.txt +++ b/src/TODO.txt @@ -177,6 +177,8 @@ Race Countdown timer sound Menu Select/Back Sound +Loading Screen + ========================== Stages VI - XII: 7 Stages (1 hour each, 7 hours total) Menu Navigations (3 hours) diff --git a/src/olcPGEX_TransformedView.h b/src/olcPGEX_TransformedView.h index e97075d..09d35c3 100644 --- a/src/olcPGEX_TransformedView.h +++ b/src/olcPGEX_TransformedView.h @@ -196,6 +196,12 @@ namespace olc void DrawRotatedStringDecal(const olc::vf2d& pos, const std::string& sText, const float fAngle, const olc::vf2d& center = { 0.0f, 0.0f }, const olc::Pixel col = olc::WHITE, const olc::vf2d& scale = { 1.0f, 1.0f }); void DrawRotatedStringPropDecal(const olc::vf2d& pos, const std::string& sText, const float fAngle, const olc::vf2d& center = { 0.0f, 0.0f }, const olc::Pixel col = olc::WHITE, const olc::vf2d& scale = { 1.0f, 1.0f }); + void DrawShadowStringDecal(const olc::vf2d& pos, const std::string& sText, const olc::Pixel col = olc::WHITE, const olc::Pixel shadowCol = olc::BLACK, const olc::vf2d& scale = { 1.0f, 1.0f }); + void DrawShadowStringPropDecal(const olc::vf2d& pos, const std::string& sText, const olc::Pixel col = olc::WHITE, const olc::Pixel shadowCol = olc::BLACK, const olc::vf2d& scale = { 1.0f, 1.0f }); + + void DrawShadowRotatedStringDecal(const olc::vf2d& pos, const std::string& sText, const float fAngle, const olc::vf2d& center = { 0.0f, 0.0f }, const olc::Pixel col = olc::WHITE, const olc::Pixel shadowCol = olc::BLACK, const olc::vf2d& scale = { 1.0f, 1.0f }); + void DrawShadowRotatedStringPropDecal(const olc::vf2d& pos, const std::string& sText, const float fAngle, const olc::vf2d& center = { 0.0f, 0.0f }, const olc::Pixel col = olc::WHITE, const olc::Pixel shadowCol = olc::BLACK, const olc::vf2d& scale = { 1.0f, 1.0f }); + // Draws a single shaded filled rectangle as a decal void FillRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel col = olc::WHITE); void DrawRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel col = olc::WHITE); @@ -662,6 +668,16 @@ namespace olc pge->DrawStringPropDecal(WorldToScreen(pos), sText, col, scale * m_vWorldScale * m_vRecipPixel,GFX3DTransform::TRANSFORM_REQUIRED); } + void TransformedView::DrawShadowStringDecal(const olc::vf2d & pos, const std::string & sText, const olc::Pixel col, const olc::Pixel shadowCol, const olc::vf2d & scale) + { + pge->DrawStringDecal(WorldToScreen(pos), sText, col, scale * m_vWorldScale * m_vRecipPixel,GFX3DTransform::TRANSFORM_REQUIRED); + } + + void TransformedView::DrawShadowStringPropDecal(const olc::vf2d & pos, const std::string & sText, const olc::Pixel col, const olc::Pixel shadowCol, const olc::vf2d & scale ) + { + pge->DrawShadowStringPropDecal(WorldToScreen(pos), sText, col,shadowCol, scale * m_vWorldScale * m_vRecipPixel,GFX3DTransform::TRANSFORM_REQUIRED); + } + void TransformedView::FillRectDecal(const olc::vf2d & pos, const olc::vf2d & size, const olc::Pixel col) { pge->FillRectDecal(WorldToScreen(pos), (size * m_vWorldScale).ceil(), col,GFX3DTransform::TRANSFORM_REQUIRED); @@ -712,6 +728,12 @@ namespace olc void TransformedView::DrawRotatedStringPropDecal(const olc::vf2d& pos, const std::string& sText, const float fAngle, const olc::vf2d& center, const olc::Pixel col, const olc::vf2d& scale){ pge->DrawRotatedStringPropDecal(WorldToScreen(pos),sText,fAngle,center,col,scale*m_vWorldScale*m_vRecipPixel,GFX3DTransform::TRANSFORM_REQUIRED); } + void TransformedView::DrawShadowRotatedStringDecal(const olc::vf2d& pos, const std::string& sText, const float fAngle, const olc::vf2d& center, const olc::Pixel col, const olc::Pixel shadowCol, const olc::vf2d& scale){ + pge->DrawShadowRotatedStringDecal(WorldToScreen(pos),sText,fAngle,center,col,shadowCol,scale*m_vWorldScale*m_vRecipPixel,GFX3DTransform::TRANSFORM_REQUIRED); + } + void TransformedView::DrawShadowRotatedStringPropDecal(const olc::vf2d& pos, const std::string& sText, const float fAngle, const olc::vf2d& center, const olc::Pixel col, const olc::Pixel shadowCol, const olc::vf2d& scale){ + pge->DrawShadowRotatedStringPropDecal(WorldToScreen(pos),sText,fAngle,center,col,shadowCol,scale*m_vWorldScale*m_vRecipPixel,GFX3DTransform::TRANSFORM_REQUIRED); + } #if defined (OLC_PGEX_SHADER) diff --git a/src/olcPixelGameEngine.h b/src/olcPixelGameEngine.h index 5015b59..babaf51 100644 --- a/src/olcPixelGameEngine.h +++ b/src/olcPixelGameEngine.h @@ -1148,8 +1148,10 @@ namespace olc void DrawRotatedDecal(const olc::vf2d& pos, olc::Decal* decal, const float fAngle, const olc::vf2d& center = { 0.0f, 0.0f }, const olc::vf2d& scale = { 1.0f,1.0f }, const olc::Pixel& tint = olc::WHITE,const GFX3DTransform transform=GFX3DTransform::NO_TRANSFORM); void DrawPartialRotatedDecal(const olc::vf2d& pos, olc::Decal* decal, const float fAngle, const olc::vf2d& center, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::vf2d& scale = { 1.0f, 1.0f }, const olc::Pixel& tint = olc::WHITE,const GFX3DTransform transform=GFX3DTransform::NO_TRANSFORM); // Draws a multiline string as a decal, with tiniting and scaling - void DrawStringDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col = olc::WHITE, const olc::vf2d& scale = { 1.0f, 1.0f },const GFX3DTransform transform=GFX3DTransform::NO_TRANSFORM); - void DrawStringPropDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col = olc::WHITE, const olc::vf2d& scale = { 1.0f, 1.0f },const GFX3DTransform transform=GFX3DTransform::NO_TRANSFORM); + void DrawStringDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col = olc::WHITE, const olc::vf2d& scale = { 1.0f, 1.0f }, const GFX3DTransform transform=GFX3DTransform::NO_TRANSFORM); + void DrawStringPropDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col = olc::WHITE, const olc::vf2d& scale = { 1.0f, 1.0f }, const GFX3DTransform transform=GFX3DTransform::NO_TRANSFORM); + void DrawShadowStringDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col = olc::WHITE, const Pixel shadowCol = olc::BLACK, const olc::vf2d& scale = { 1.0f, 1.0f }, const GFX3DTransform transform=GFX3DTransform::NO_TRANSFORM); + void DrawShadowStringPropDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col = olc::WHITE, const Pixel shadowCol = olc::BLACK, const olc::vf2d& scale = { 1.0f, 1.0f }, const GFX3DTransform transform=GFX3DTransform::NO_TRANSFORM); // Draws a single shaded filled rectangle as a decal void DrawRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel col = olc::WHITE,const GFX3DTransform transform=GFX3DTransform::NO_TRANSFORM); void FillRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel col = olc::WHITE,const GFX3DTransform transform=GFX3DTransform::NO_TRANSFORM); @@ -1167,6 +1169,8 @@ namespace olc void DrawLineDecal(const olc::vf2d& pos1, const olc::vf2d& pos2, Pixel p = olc::WHITE,const GFX3DTransform transform=GFX3DTransform::NO_TRANSFORM); void DrawRotatedStringDecal(const olc::vf2d& pos, const std::string& sText, const float fAngle, const olc::vf2d& center = { 0.0f, 0.0f }, const olc::Pixel col = olc::WHITE, const olc::vf2d& scale = { 1.0f, 1.0f },const GFX3DTransform transform=GFX3DTransform::NO_TRANSFORM); void DrawRotatedStringPropDecal(const olc::vf2d& pos, const std::string& sText, const float fAngle, const olc::vf2d& center = { 0.0f, 0.0f }, const olc::Pixel col = olc::WHITE, const olc::vf2d& scale = { 1.0f, 1.0f },const GFX3DTransform transform=GFX3DTransform::NO_TRANSFORM); + void DrawShadowRotatedStringDecal(const olc::vf2d& pos, const std::string& sText, const float fAngle, const olc::vf2d& center = { 0.0f, 0.0f }, const olc::Pixel col = olc::WHITE, const Pixel shadowCol = olc::BLACK, const olc::vf2d& scale = { 1.0f, 1.0f },const GFX3DTransform transform=GFX3DTransform::NO_TRANSFORM); + void DrawShadowRotatedStringPropDecal(const olc::vf2d& pos, const std::string& sText, const float fAngle, const olc::vf2d& center = { 0.0f, 0.0f }, const olc::Pixel col = olc::WHITE, const Pixel shadowCol = olc::BLACK, const olc::vf2d& scale = { 1.0f, 1.0f },const GFX3DTransform transform=GFX3DTransform::NO_TRANSFORM); // Clears entire draw target to Pixel void Clear(Pixel p); // Clears the rendering back buffer @@ -1257,6 +1261,7 @@ namespace olc int nFrameCount = 0; bool bSuspendTextureTransfer = false; Renderable fontRenderable; + Renderable shadowFontRenderable; std::vector vLayers; uint8_t nTargetLayer = 0; uint32_t nLastFPS = 0; @@ -3417,6 +3422,29 @@ namespace olc } } } + void PixelGameEngine::DrawShadowStringDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col, const Pixel shadowCol, const olc::vf2d& scale,const GFX3DTransform transform) + { + olc::vf2d spos = { 0.0f, 0.0f }; + for (auto c : sText) + { + if (c == '\n') + { + spos.x = 0; spos.y += 8.0f * scale.y; + } + else if (c == '\t') + { + spos.x += 8.0f * float(nTabSizeInSpaces) * scale.x; + } + else + { + int32_t ox = (c - 32) % 16; + int32_t oy = (c - 32) / 16; + DrawPartialDecal(pos + spos - 1, shadowFontRenderable.Decal(), {float(ox) * 10.0f, float(oy) * 10.0f}, {10.0f, 10.0f}, scale, shadowCol,transform); + DrawPartialDecal(pos + spos, fontRenderable.Decal(), {float(ox) * 8.0f, float(oy) * 8.0f}, {8.0f, 8.0f}, scale, col,transform); + spos.x += 8.0f * scale.x; + } + } + } void PixelGameEngine::DrawStringPropDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col, const olc::vf2d& scale,const GFX3DTransform transform) { @@ -3440,6 +3468,29 @@ namespace olc } } } + void PixelGameEngine::DrawShadowStringPropDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col, const Pixel shadowCol, const olc::vf2d& scale,const GFX3DTransform transform) + { + olc::vf2d spos = { 0.0f, 0.0f }; + for (auto c : sText) + { + if (c == '\n') + { + spos.x = 0; spos.y += 8.0f * scale.y; + } + else if (c == '\t') + { + spos.x += 8.0f * float(nTabSizeInSpaces) * scale.x; + } + else + { + int32_t ox = (c - 32) % 16; + int32_t oy = (c - 32) / 16; + DrawPartialDecal(pos + spos - 1, shadowFontRenderable.Decal(), { float(ox) * 10.0f + float(vFontSpacing[c - 32].x), float(oy) * 10.0f }, { float(vFontSpacing[c - 32].y)+2.f, 10.0f }, scale, shadowCol,transform); + DrawPartialDecal(pos + spos, fontRenderable.Decal(), { float(ox) * 8.0f + float(vFontSpacing[c - 32].x), float(oy) * 8.0f }, { float(vFontSpacing[c - 32].y), 8.0f }, scale, col,transform); + spos.x += float(vFontSpacing[c - 32].y) * scale.x; + } + } + } // Thanks Oso-Grande/Sopadeoso For these awesom and stupidly clever Text Rotation routines... duh XD void PixelGameEngine::DrawRotatedStringDecal(const olc::vf2d& pos, const std::string& sText, const float fAngle, const olc::vf2d& center, const Pixel col, const olc::vf2d& scale,const GFX3DTransform transform) { @@ -3486,6 +3537,54 @@ namespace olc } } } + // Thanks Oso-Grande/Sopadeoso For these awesom and stupidly clever Text Rotation routines... duh XD + void PixelGameEngine::DrawShadowRotatedStringDecal(const olc::vf2d& pos, const std::string& sText, const float fAngle, const olc::vf2d& center, const Pixel col, const Pixel shadowCol, const olc::vf2d& scale,const GFX3DTransform transform) + { + olc::vf2d spos = center; + for (auto c : sText) + { + if (c == '\n') + { + spos.x = center.x; spos.y -= 8.0f; + } + else if (c == '\t') + { + spos.x += 8.0f * float(nTabSizeInSpaces) * scale.x; + } + else + { + int32_t ox = (c - 32) % 16; + int32_t oy = (c - 32) / 16; + DrawPartialRotatedDecal(pos-scale, shadowFontRenderable.Decal(), fAngle, spos, { float(ox) * 10.0f, float(oy) * 10.0f }, { 10.0f, 10.0f }, scale, shadowCol,transform); + DrawPartialRotatedDecal(pos, fontRenderable.Decal(), fAngle, spos, { float(ox) * 8.0f, float(oy) * 8.0f }, { 8.0f, 8.0f }, scale, col,transform); + spos.x -= 8.0f; + } + } + } + + void PixelGameEngine::DrawShadowRotatedStringPropDecal(const olc::vf2d& pos, const std::string& sText, const float fAngle, const olc::vf2d& center, const Pixel col, const Pixel shadowCol, const olc::vf2d& scale,const GFX3DTransform transform) + { + olc::vf2d spos = center; + for (auto c : sText) + { + if (c == '\n') + { + spos.x = center.x; spos.y -= 8.0f; + } + else if (c == '\t') + { + spos.x += 8.0f * float(nTabSizeInSpaces) * scale.x; + } + else + { + int32_t ox = (c - 32) % 16; + int32_t oy = (c - 32) / 16; + DrawPartialRotatedDecal(pos-scale, shadowFontRenderable.Decal(), fAngle, spos, { float(ox) * 10.0f + float(vFontSpacing[c - 32].x), float(oy) * 10.0f }, { float(vFontSpacing[c - 32].y)+2.f, 10.0f }, scale, shadowCol,transform); + DrawPartialRotatedDecal(pos, fontRenderable.Decal(), fAngle, spos, { float(ox) * 8.0f + float(vFontSpacing[c - 32].x), float(oy) * 8.0f }, { float(vFontSpacing[c - 32].y), 8.0f }, scale, col,transform); + spos.x -= float(vFontSpacing[c - 32].y); + } + } + } olc::vi2d PixelGameEngine::GetTextSize(const std::string& s) { @@ -4159,6 +4258,7 @@ namespace olc data += "?P9PL020O`<`N3R0@E4HC7b0@ET