From 1848ae0e9a43c90493c086841fbf1aa2ef3cb13a Mon Sep 17 00:00:00 2001 From: Javidx9 <25419386+OneLoneCoder@users.noreply.github.com> Date: Sat, 14 Sep 2019 17:06:59 +0100 Subject: [PATCH] PixelGameEngine 1.19 Added resizing, tweaks to built in types. --- olcPixelGameEngine.h | 68 +++++++++++++++++++++++++++++++++----------- 1 file changed, 52 insertions(+), 16 deletions(-) diff --git a/olcPixelGameEngine.h b/olcPixelGameEngine.h index 4c0e34e..5947dfb 100644 --- a/olcPixelGameEngine.h +++ b/olcPixelGameEngine.h @@ -2,7 +2,7 @@ olcPixelGameEngine.h +-------------------------------------------------------------+ - | OneLoneCoder Pixel Game Engine v1.17 | + | OneLoneCoder Pixel Game Engine v1.19 | | "Like the command prompt console one, but not..." - javidx9 | +-------------------------------------------------------------+ @@ -119,8 +119,8 @@ I'd like to extend thanks to Eremiell, slavka, gurkanctn, Phantim, JackOJC, KrossX, Huhlig, Dragoneye, Appa, JustinRichardsMusic, SliceNDice Ralakus, Gorbit99, raoul, joshinils, benedani & MagetzUb for advice, ideas and - testing, and I'd like to extend my appreciation to the 40K YouTube followers, - 22 Patreons and 2.6K Discord server members who give me the motivation to keep + testing, and I'd like to extend my appreciation to the 96K YouTube followers, + 47 Patreons and 4.5K Discord server members who give me the motivation to keep going with all this :D Special thanks to those who bring gifts! @@ -250,6 +250,9 @@ namespace olc // All OneLoneCoder stuff will now exist in the "olc" namespace Pixel(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha = 255); Pixel(uint32_t p); enum Mode { NORMAL, MASK, ALPHA, CUSTOM }; + + bool operator==(const Pixel& p) const; + bool operator!=(const Pixel& p) const; }; // Some constants for symbolic naming of Pixels @@ -284,6 +287,7 @@ namespace olc // All OneLoneCoder stuff will now exist in the "olc" namespace inline v2d_generic(T _x, T _y) : x(_x), y(_y) { } inline v2d_generic(const v2d_generic& v) : x(v.x), y(v.y){ } inline T mag() { return sqrt(x * x + y * y); } + inline T mag2() { return x * x + y * y; } inline v2d_generic norm() { T r = 1 / mag(); return v2d_generic(x*r, y*r); } inline v2d_generic perp() { return v2d_generic(-y, x); } inline T dot(const v2d_generic& rhs) { return this->x * rhs.x + this->y * rhs.y; } @@ -413,7 +417,7 @@ namespace olc // All OneLoneCoder stuff will now exist in the "olc" namespace PixelGameEngine(); public: - olc::rcode Construct(uint32_t screen_w, uint32_t screen_h, uint32_t pixel_w, uint32_t pixel_h, bool full_screen = false); + olc::rcode Construct(uint32_t screen_w, uint32_t screen_h, uint32_t pixel_w, uint32_t pixel_h, bool full_screen = false, bool vsync = false); olc::rcode Start(); public: // Override Interfaces @@ -492,6 +496,8 @@ namespace olc // All OneLoneCoder stuff will now exist in the "olc" namespace void DrawString(int32_t x, int32_t y, std::string sText, Pixel col = olc::WHITE, uint32_t scale = 1); // Clears entire draw target to Pixel void Clear(Pixel p); + // Resize the primary screen sprite + void SetScreenSize(int w, int h); public: // Branding std::string sAppName; @@ -524,12 +530,13 @@ namespace olc // All OneLoneCoder stuff will now exist in the "olc" namespace float fSubPixelOffsetY = 0.0f; bool bHasInputFocus = false; bool bHasMouseFocus = false; + bool bEnableVSYNC = false; float fFrameTimer = 1.0f; int nFrameCount = 0; Sprite *fontSprite = nullptr; std::function funcPixelMode; - static std::map mapKeys; + static std::map mapKeys; bool pKeyNewState[256]{ 0 }; bool pKeyOldState[256]{ 0 }; HWButton pKeyboardState[256]; @@ -635,6 +642,16 @@ namespace olc n = p; } + bool Pixel::operator==(const Pixel& p) const + { + return n == p.n; + } + + bool Pixel::operator!=(const Pixel& p) const + { + return n != p.n; + } + //========================================================== std::wstring ConvertS2W(std::string s) @@ -1005,15 +1022,15 @@ namespace olc if (!ifs.is_open()) return olc::FAIL; // 1) Read Map - size_t nMapEntries; - ifs.read((char*)&nMapEntries, sizeof(size_t)); - for (size_t i = 0; i < nMapEntries; i++) + uint32_t nMapEntries; + ifs.read((char*)&nMapEntries, sizeof(uint32_t)); + for (uint32_t i = 0; i < nMapEntries; i++) { - size_t nFilePathSize = 0; - ifs.read((char*)&nFilePathSize, sizeof(size_t)); + uint32_t nFilePathSize = 0; + ifs.read((char*)&nFilePathSize, sizeof(uint32_t)); std::string sFileName(nFilePathSize, ' '); - for (size_t j = 0; j < nFilePathSize; j++) + for (uint32_t j = 0; j < nFilePathSize; j++) sFileName[j] = ifs.get(); sEntry e; @@ -1062,13 +1079,14 @@ namespace olc olc::PGEX::pge = this; } - olc::rcode PixelGameEngine::Construct(uint32_t screen_w, uint32_t screen_h, uint32_t pixel_w, uint32_t pixel_h, bool full_screen) + olc::rcode PixelGameEngine::Construct(uint32_t screen_w, uint32_t screen_h, uint32_t pixel_w, uint32_t pixel_h, bool full_screen, bool vsync) { nScreenWidth = screen_w; nScreenHeight = screen_h; nPixelWidth = pixel_w; nPixelHeight = pixel_h; bFullScreen = full_screen; + bEnableVSYNC = vsync; fPixelX = 2.0f / (float)(nScreenWidth); fPixelY = 2.0f / (float)(nScreenHeight); @@ -1092,6 +1110,24 @@ namespace olc return olc::OK; } + + void PixelGameEngine::SetScreenSize(int w, int h) + { + delete pDefaultDrawTarget; + nScreenWidth = w; + nScreenHeight = h; + pDefaultDrawTarget = new Sprite(nScreenWidth, nScreenHeight); + SetDrawTarget(nullptr); + glClear(GL_COLOR_BUFFER_BIT); +#ifdef _WIN32 + SwapBuffers(glDeviceContext); +#else + glXSwapBuffers(olc_Display, olc_Window); +#endif + glClear(GL_COLOR_BUFFER_BIT); + olc_UpdateViewport(); + } + olc::rcode PixelGameEngine::Start() { // Construct the window @@ -2054,7 +2090,7 @@ namespace olc // Define window furniture DWORD dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; - DWORD dwStyle = WS_CAPTION | WS_SYSMENU | WS_VISIBLE; // | WS_THICKFRAME; + DWORD dwStyle = WS_CAPTION | WS_SYSMENU | WS_VISIBLE | WS_THICKFRAME; int nCosmeticOffset = 30; nViewW = nWindowWidth; @@ -2146,7 +2182,7 @@ namespace olc // Remove Frame cap wglSwapInterval = (wglSwapInterval_t*)wglGetProcAddress("wglSwapIntervalEXT"); - if (wglSwapInterval) wglSwapInterval(0); + if (wglSwapInterval && !bEnableVSYNC) wglSwapInterval(0); return true; } @@ -2289,7 +2325,7 @@ namespace olc glSwapIntervalEXT = nullptr; glSwapIntervalEXT = (glSwapInterval_t*)glXGetProcAddress((unsigned char*)"glXSwapIntervalEXT"); - if (glSwapIntervalEXT) + if (glSwapIntervalEXT && !bEnableVSYNC) glSwapIntervalEXT(olc_Display, olc_Window, 0); else { @@ -2306,7 +2342,7 @@ namespace olc // Need a couple of statics as these are singleton instances // read from multiple locations std::atomic PixelGameEngine::bAtomActive{ false }; - std::map PixelGameEngine::mapKeys; + std::map PixelGameEngine::mapKeys; olc::PixelGameEngine* olc::PGEX::pge = nullptr; #ifdef OLC_DBG_OVERDRAW int olc::Sprite::nOverdrawCount = 0;