diff --git a/Entity.cpp b/Entity.cpp index df138d4272defbd283e4b612b439cd059546044e..82ad6c39e3e3c900e4f60ce0efdb9c5c1a8f1726 100644 --- a/Entity.cpp +++ b/Entity.cpp @@ -39,6 +39,11 @@ float Entity::getTop() const return topleft.Y; } +int Entity::getHitPoints() const +{ + return hitpoints; +} + float Entity::getHitTime() const { return hittime; diff --git a/Entity.hpp b/Entity.hpp index 64b1a72392d3c090c8d4ae80bc5fc1e4840d9b44..8fb4f492a4368cdff5aec887ec90c1046693a74a 100644 --- a/Entity.hpp +++ b/Entity.hpp @@ -39,6 +39,7 @@ public: float getLeft() const; float getTop() const; + int getHitPoints() const; float getHitTime() const; /// ---------------- diff --git a/Level.cpp b/Level.cpp index 91893ea2494267c27d34044803efe03a73cad84c..cec0902b5b2e5e035fe6e98a4adf52df6c663602 100644 --- a/Level.cpp +++ b/Level.cpp @@ -145,7 +145,8 @@ void Level::enemyVector_PushBack(std::unique_ptr<Enemy> enemy_) bool Level::doDoSteps(FloatSeconds const &frame_time) { - if(!player.step(player.getTopLeft(), frame_time, *this)) { + player.step(player.getTopLeft(), frame_time, *this); + if(player.getHitPoints() == 0) { return false; } diff --git a/PixelShaders.cpp b/PixelShaders.cpp index 99000fa77c740240495b8aedfe4d21f314c1bc65..376ec5e68630a9ce9abef6eeeea324296450fd91 100644 --- a/PixelShaders.cpp +++ b/PixelShaders.cpp @@ -24,3 +24,28 @@ Color HitShader::peekUnchecked(PixelPoint const &pos) const } return (dist(rng.rng) > 0.95f) ? color : (is_final ? _t : src); } + +Color DiagonalFadeoutShader::peekUnchecked(PixelPoint const &pos) const +{ + // (percent * 1) would only correspond to the top-left triangle. + auto src = input.peek(pos); + auto edge_right = (input.w() * (percent * 2)); + auto edge_bottom = (input.h() * (percent * 2)); + // y = mx + t + + // Top right point: 0 = m·[edge_right] + t + // Bottom left point: [edge_bottom] = m·0 + t + + // 0 = m·[edge_right] + [edge_bottom] + // -[edge_bottom] = m·[edge_right] + // m = -[edge_bottom]/[edge_right] + auto t = edge_bottom; + auto m = (-edge_bottom / edge_right); + + auto x_end = ((pos.y - t) / m); + + if((pos.x & 0x1) ^ ((pos.y & 0x1) == 1)) { + return src; + } + return (pos.x <= x_end) ? _0 : src; +} diff --git a/PixelShaders.hpp b/PixelShaders.hpp index 7dd2d0558e99eed3fecbe56fac5b5a72e74fdb80..bb20dc2de2823d08007dec4422d3ed3790644126 100644 --- a/PixelShaders.hpp +++ b/PixelShaders.hpp @@ -21,4 +21,15 @@ public: virtual Color peekUnchecked(PixelPoint const &pos) const; }; +class DiagonalFadeoutShader : public ShadedPixelBuffer { +public: + float percent; + + DiagonalFadeoutShader(PixelBuffer const &input, float percent) : + ShadedPixelBuffer(input), percent(percent) { + } + + virtual Color peekUnchecked(PixelPoint const &pos) const; +}; + #endif /* PIXELSHADERS_HPP */ diff --git a/main.cpp b/main.cpp index ae981af79c49ef0c615e5d218ea7a8bf8f7d916d..d9f5f85d000fa36c5760d31b5f314668b757dc02 100644 --- a/main.cpp +++ b/main.cpp @@ -2,6 +2,7 @@ #include <sstream> #include "PixelBuffer.hpp" // hoffmanncl72341 +#include "PixelShaders.hpp" // hoffmanncl72341 #include "Platform_Win32Console.hpp" // hoffmanncl72341 #include "Level.hpp" // kruegerzo72182 #include "Enemy.hpp" // hauerch71498 @@ -36,6 +37,7 @@ class GameLoop { int frame = 0; FloatSeconds time_elapsed{ 0.0f }; bool GameOverFlag = false; //hauerch71498 + float GameOverTime = 0.0f; DynamicPixelBuffer framebuffer = {screenWidth, screenHeigth}; @@ -112,22 +114,29 @@ public: // <kruegerzo72182 // player movement player_.move(platform, frame_time, level); + } else { + GameOverTime += frame_time.count(); + } // enemy movement GameOverFlag = (level.doDoSteps(frame_time) == false); - } - // Output to the console, Gamelogic should happen before this - framebuffer.blit_topleft({ 0, 0 }, level.draw()); - // kruegerzo72182> + // Output to the console, Gamelogic should happen before this + auto const &levelBuffer = level.draw(); if(GameOverFlag) { + DiagonalFadeoutShader dfs = {levelBuffer, (GameOverTime / 2.0f)}; + framebuffer.blit_topleft({ 0, 0 }, dfs); + Score Highscore; Highscore.SetScoreSprite(level.getScore()); framebuffer.blit_topleft(Highscore.GameOverPos,Highscore.getGameOverSprite()); for(auto & i : Highscore.ScoreBoard){ framebuffer.blit_topleft(i.ScorePos,i.getScoreSprite()); } + } else { + framebuffer.blit_topleft({ 0, 0 }, levelBuffer); } + // kruegerzo72182> // <hoffmanncl72341 platform.render(framebuffer);