diff --git a/olcPixelGameEngine.h b/olcPixelGameEngine.h index 0d168b2..6c4ac03 100644 --- a/olcPixelGameEngine.h +++ b/olcPixelGameEngine.h @@ -2,7 +2,7 @@ olcPixelGameEngine.h +-------------------------------------------------------------+ - | OneLoneCoder Pixel Game Engine v0.6 | + | OneLoneCoder Pixel Game Engine v1.0 | | "Like the command prompt console one, but not..." - javidx9 | +-------------------------------------------------------------+ @@ -91,7 +91,7 @@ Relevant Videos ~~~~~~~~~~~~~~~ - + https://youtu.be/kRH6oJLFYxY Introducing olcPixelGameEngine Compiling in Linux ~~~~~~~~~~~~~~~~~~ @@ -143,7 +143,7 @@ // Include WinAPI - #define NOMINMAX + //#define NOMINMAX #include #include @@ -207,7 +207,8 @@ namespace olc // All OneLoneCoder stuff will now exist in the "olc" namespace CYAN(0, 255, 255), DARK_CYAN(0, 128, 128), VERY_DARK_CYAN(0, 64, 64), BLUE(0, 0, 255), DARK_BLUE(0, 0, 128), VERY_DARK_BLUE(0, 0, 64), MAGENTA(255, 0, 255), DARK_MAGENTA(128, 0, 128), VERY_DARK_MAGENTA(64, 0, 64), - BLACK(0, 0, 0); + BLACK(0, 0, 0), + BLANK(0, 0, 0, 0); enum rcode { @@ -238,6 +239,7 @@ namespace olc // All OneLoneCoder stuff will now exist in the "olc" namespace public: olc::rcode LoadFromFile(std::string sImageFile); + olc::rcode LoadFromSprFile(std::string sImageFile); public: int32_t width = 0; @@ -319,30 +321,32 @@ namespace olc // All OneLoneCoder stuff will now exist in the "olc" namespace // olc::Pixel::MASK = Transparent if alpha is < 255 // olc::Pixel::ALPHA = Full transparency void SetPixelMode(Pixel::Mode m); + // Change the blend factor form between 0.0f to 1.0f; + void SetPixelBlend(float fBlend); // Draws a single Pixel - virtual void Draw(int32_t x, int32_t y, Pixel p); + virtual void Draw(int32_t x, int32_t y, Pixel p = olc::WHITE); // Draws a line from (x1,y1) to (x2,y2) - void DrawLine(int32_t x1, int32_t y1, int32_t x2, int32_t y2, Pixel p); + void DrawLine(int32_t x1, int32_t y1, int32_t x2, int32_t y2, Pixel p = olc::WHITE); // Draws a circle located at (x,y) with radius - void DrawCircle(int32_t x, int32_t y, int32_t radius, Pixel p); + void DrawCircle(int32_t x, int32_t y, int32_t radius, Pixel p = olc::WHITE); // Fills a circle located at (x,y) with radius - void FillCircle(int32_t x, int32_t y, int32_t radius, Pixel p); + void FillCircle(int32_t x, int32_t y, int32_t radius, Pixel p = olc::WHITE); // Draws a rectangle at (x,y) to (x+w,y+h) - void DrawRect(int32_t x, int32_t y, int32_t w, int32_t h, Pixel p); + void DrawRect(int32_t x, int32_t y, int32_t w, int32_t h, Pixel p = olc::WHITE); // Fills a rectangle at (x,y) to (x+w,y+h) - void FillRect(int32_t x, int32_t y, int32_t w, int32_t h, Pixel p); + void FillRect(int32_t x, int32_t y, int32_t w, int32_t h, Pixel p = olc::WHITE); // Draws a triangle between points (x1,y1), (x2,y2) and (x3,y3) - void DrawTriangle(int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t x3, int32_t y3, Pixel p); + void DrawTriangle(int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t x3, int32_t y3, Pixel p = olc::WHITE); // Flat fills a triangle between points (x1,y1), (x2,y2) and (x3,y3) - void FillTriangle(int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t x3, int32_t y3, Pixel p); + void FillTriangle(int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t x3, int32_t y3, Pixel p = olc::WHITE); // Draws an entire sprite at location (x,y) void DrawSprite(int32_t x, int32_t y, Sprite *sprite); // 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); + void DrawString(int32_t x, int32_t y, std::string sText, Pixel col = olc::WHITE); public: // Branding std::string sAppName; @@ -351,6 +355,7 @@ namespace olc // All OneLoneCoder stuff will now exist in the "olc" namespace Sprite *pDefaultDrawTarget = nullptr; Sprite *pDrawTarget = nullptr; Pixel::Mode nPixelMode = Pixel::NORMAL; + float fBlendFactor = 1.0f; uint32_t nScreenWidth = 256; uint32_t nScreenHeight = 240; uint32_t nPixelWidth = 4; @@ -474,6 +479,11 @@ namespace olc if (pColData) delete[] pColData; } + olc::rcode Sprite::LoadFromSprFile(std::string sImageFile) + { + return olc::FAIL; + } + olc::rcode Sprite::LoadFromFile(std::string sImageFile) { #ifdef _WIN32 @@ -760,7 +770,7 @@ namespace olc if (nPixelMode == Pixel::ALPHA) { Pixel d = pDrawTarget->GetPixel(x, y); - float a = (float)p.a / 255.0f; + float a = (float)(p.a / 255.0f) * fBlendFactor; float c = 1.0f - a; float r = a * (float)p.r + c * (float)d.r; float g = a * (float)p.g + c * (float)d.g; @@ -1079,12 +1089,13 @@ namespace olc } } - void PixelGameEngine::DrawString(int32_t x, int32_t y, std::string sText) + void PixelGameEngine::DrawString(int32_t x, int32_t y, std::string sText, Pixel col) { int32_t sx = 0; int32_t sy = 0; Pixel::Mode m = nPixelMode; - SetPixelMode(Pixel::MASK); + if(col.ALPHA != 255) SetPixelMode(Pixel::ALPHA); + else SetPixelMode(Pixel::MASK); for (auto c : sText) { if (c == '\n') @@ -1095,7 +1106,15 @@ namespace olc { int32_t ox = (c - 32) % 16; int32_t oy = (c - 32) / 16; - DrawPartialSprite(x + sx, y + sy, fontSprite, ox * 8, oy * 8, 8, 8); + //DrawPartialSprite(x + sx, y + sy, fontSprite, ox * 8, oy * 8, 8, 8); + for (int i = 0; i < 8; i++) + { + for (int j = 0; j < 8; j++) + { + if(fontSprite->GetPixel(i + ox * 8, j + oy * 8).r > 0) + Draw(x + sx + i, y + sy + j, col); + } + } sx += 8; } } @@ -1107,6 +1126,13 @@ namespace olc nPixelMode = m; } + void PixelGameEngine::SetPixelBlend(float fBlend) + { + fBlendFactor = fBlend; + if (fBlendFactor < 0.0f) fBlendFactor = 0.0f; + if (fBlendFactor > 1.0f) fBlendFactor = 1.0f; + } + // User must override these functions as required. I have not made // them abstract because I do need a default behaviour to occur if // they are not overwritten