diff --git a/olcPixelGameEngine.h b/olcPixelGameEngine.h index 4464907..3f55394 100644 --- a/olcPixelGameEngine.h +++ b/olcPixelGameEngine.h @@ -2,7 +2,7 @@ olcPixelGameEngine.h +-------------------------------------------------------------+ - | OneLoneCoder Pixel Game Engine v0.4 | + | OneLoneCoder Pixel Game Engine v0.5 | | "Like the command prompt console one, but not..." - javidx9 | +-------------------------------------------------------------+ @@ -118,7 +118,7 @@ Thanks ~~~~~~ I'd like to extend thanks to Eremiell, slavka, Phantim, JackOJC, - KrossX, Huhlig, Dragoneye & MagetzUb for advice, ideas and testing, + KrossX, Huhlig, Dragoneye, Appa & MagetzUb for advice, ideas and testing, and I'd like to extend my appreciation to the 13K YouTube followers and 1K Discord server members who give me the motivation to keep going with all this :D @@ -341,6 +341,8 @@ namespace olc // All OneLoneCoder stuff will now exist in the "olc" namespace // Draws an area of a sprite at location (x,y), where the // selected area is (ox,oy) to (ox+w,oy+h) void DrawPartialSprite(int32_t x, int32_t y, Sprite *sprite, int32_t ox, int32_t oy, int32_t w, int32_t h); + // Draws a single line of text + void DrawString(int32_t x, int32_t y, std::string sText); public: // Branding std::string sAppName; @@ -356,6 +358,9 @@ namespace olc // All OneLoneCoder stuff will now exist in the "olc" namespace uint32_t nMousePosX = 0; uint32_t nMousePosY = 0; bool bHasInputFocus = false; + float fFrameTimer = 1.0f; + int nFrameCount = 0; + Sprite *fontSprite = nullptr; static std::map mapKeys; bool pKeyNewState[256]{ 0 }; @@ -384,6 +389,7 @@ namespace olc // All OneLoneCoder stuff will now exist in the "olc" namespace // Common initialisation functions void olc_UpdateMouse(uint32_t x, uint32_t y); bool olc_OpenGLCreate(); + void olc_ConstructFontSheet(); #ifdef _WIN32 // Windows specific window handling @@ -621,9 +627,12 @@ namespace olc #ifdef _WIN32 #ifdef UNICODE std::wstring_convert> converter; - wsAppName = converter.from_bytes(sAppName); + wsAppName = converter.from_bytes(sAppName); #endif #endif + // Load the default font sheet + olc_ConstructFontSheet(); + // Create a sprite that represents the primary drawing target pDefaultDrawTarget = new Sprite(nScreenWidth, nScreenHeight); SetDrawTarget(nullptr); @@ -1068,6 +1077,18 @@ namespace olc } } + void PixelGameEngine::DrawString(int32_t x, int32_t y, std::string sText) + { + int32_t s = 0; + for (auto c : sText) + { + int32_t ox = (c - 32) % 16; + int32_t oy = (c - 32) / 16; + DrawPartialSprite(x + s, y, fontSprite, ox*8, oy*8, 8, 8); + s+=8; + } + } + void PixelGameEngine::SetPixelMode(Pixel::Mode m) { nPixelMode = m; @@ -1248,21 +1269,32 @@ namespace olc #endif // Update Title Bar + fFrameTimer += fElapsedTime; + nFrameCount++; + if (fFrameTimer >= 1.0f) + { + fFrameTimer -= 1.0f; #ifdef _WIN32 - #ifdef UNICODE - wchar_t sTitle[256]; - swprintf(sTitle, 256, L"OneLoneCoder.com - Pixel Game Engine - %s - FPS: %3.2f", wsAppName.c_str(), 1.0f / fElapsedTime); - SetWindowText(olc_hWnd, sTitle); - #else - char sTitle[256]; - sprintf_s(sTitle, 256, "OneLoneCoder.com - Pixel Game Engine - %s - FPS: %3.2f", sAppName.c_str(), 1.0f / fElapsedTime); - SetWindowText(olc_hWnd, sTitle); - #endif +#ifdef UNICODE + wchar_t sTitle[256]; + swprintf(sTitle, 256, L"OneLoneCoder.com - Pixel Game Engine - %s - FPS: %d", wsAppName.c_str(), nFrameCount); +#else +#ifndef __MINGW32__ + char sTitle[256]; + sprintf_s(sTitle, 256, "OneLoneCoder.com - Pixel Game Engine - %s - FPS: %d", sAppName.c_str(), nFrameCount); +#else + char sTitle[256]; + sprintf(sTitle, "OneLoneCoder.com - Pixel Game Engine - %s - FPS: %d", sAppName.c_str(), nFrameCount); +#endif +#endif + SetWindowText(olc_hWnd, sTitle); #else - char sTitle[256]; - sprintf(sTitle, "OneLoneCoder.com - Pixel Game Engine - %s - FPS: %3.2f", sAppName.c_str(), 1.0f / fElapsedTime); - XStoreName(olc_Display, olc_Window, sTitle); + char sTitle[256]; + sprintf(sTitle, "OneLoneCoder.com - Pixel Game Engine - %s - FPS: %d", sAppName.c_str(), nFrameCount); + XStoreName(olc_Display, olc_Window, sTitle); #endif + nFrameCount = 0; + } } @@ -1291,6 +1323,46 @@ namespace olc } + + void PixelGameEngine::olc_ConstructFontSheet() + { + std::string data; + data += "?Q`0001oOch0o01o@F40o000000000"; + data += "O000000nOT0063Qo4d8>?7a14Gno94AA4gno94AaOT0>o3`oO400o7QN00000400"; + data += "Of80001oOg<7O7moBGT7O7lABET024@aBEd714AiOdl717a_=TH013Q>00000000"; + data += "720D000V?V5oB3Q_HdUoE7a9@DdDE4A9@DmoE4A;Hg]oM4Aj8S4D84@`00000000"; + data += "OaPT1000Oa`^13P1@AI[?g`1@A=[OdAoHgljA4Ao?WlBA7l1710007l100000000"; + data += "ObM6000oOfMV?3QoBDD`O7a0BDDH@5A0BDD<@5A0BGeVO5ao@CQR?5Po00000000"; + data += "Oc``000?Ogij70PO2D]??0Ph2DUM@7i`2DTg@7lh2GUj?0TO0C1870T?00000000"; + data += "70<4001o?P<7?1QoHg43O;`h@GT0@:@LB@d0>:@hN@L0@?aoN@<0O7ao0000?000"; + data += "OcH0001SOglLA7mg24TnK7ln24US>0PL24U140PnOgl0>7QgOcH0K71S0000A000"; + data += "00H00000@Dm1S007@DUSg00?OdTnH7YhOfTL<7Yh@Cl0700?@Ah0300700000000"; + data += "<008001QL00ZA41a@6HnI<1i@FHLM81M@@0LG81?O`0nC?Y7?`0ZA7Y300080000"; + data += "O`082000Oh0827mo6>Hn?Wmo?6HnMb11MP08@C11H`08@FP0@@0004@000000000"; + data += "00P00001Oab00003OcKP0006@6=PMgl<@440MglH@000000`@000001P00000000"; + data += "Ob@8@@00Ob@8@Ga13R@8Mga172@8?PAo3R@827QoOb@820@0O`0007`0000007P0"; + data += "O`000P08Od400g`<3V=P0G`673IP0`@3>1`00P@6O`P00g`SetPixel(px, py, olc::Pixel(k, k, k)); + if (++py == 48) { px++; py = 0; } + } + } + } + #ifdef _WIN32 HWND PixelGameEngine::olc_WindowCreate() {