diff --git a/Enemyprojectile.cpp b/Enemyprojectile.cpp index 8fc99db5597827a2ef0de30071725cb42cbc144d..88108a68288ec813b44368dbf0df6537648ef44d 100644 --- a/Enemyprojectile.cpp +++ b/Enemyprojectile.cpp @@ -27,7 +27,7 @@ bool EnemyProjectile::move(FloatSeconds const & Frametime, Level &level) { this->y -= speed*Frametime.count(); if(level.HitEnemy(this->x, this->y, sprite.w(), sprite.h()) - || level.HitObstacle(this->x, this->y, sprite.w(), sprite.h())) + || level.HitObstacle(this->x, this->y, ENEMY_PROJECTILE_COLOR, sprite.w(), sprite.h())) { //Player hit return false; @@ -45,7 +45,7 @@ bool EnemyProjectile::move(FloatSeconds const & Frametime, Level &level) { this->x -= speed*Frametime.count(); if(level.HitEnemy(this->x, this->y, sprite.w(), sprite.h()) - || level.HitObstacle(this->x, this->y, sprite.w(), sprite.h())) + || level.HitObstacle(this->x, this->y, ENEMY_PROJECTILE_COLOR, sprite.w(), sprite.h())) { //Player hit return false; @@ -63,7 +63,7 @@ bool EnemyProjectile::move(FloatSeconds const & Frametime, Level &level) { this->x += speed*Frametime.count(); if(level.HitEnemy(this->x, this->y, sprite.w(), sprite.h()) - || level.HitObstacle(this->x, this->y, sprite.w(), sprite.h())) + || level.HitObstacle(this->x, this->y, ENEMY_PROJECTILE_COLOR, sprite.w(), sprite.h())) { //Player hit return false; @@ -81,7 +81,7 @@ bool EnemyProjectile::move(FloatSeconds const & Frametime, Level &level) { this->y += speed*Frametime.count(); if(level.HitEnemy(this->x, this->y, sprite.w(), sprite.h()) - || level.HitObstacle(this->x, this->y, sprite.w(), sprite.h())) + || level.HitObstacle(this->x, this->y, ENEMY_PROJECTILE_COLOR, sprite.w(), sprite.h())) { //Player hit return false; diff --git a/Enemyprojectile.hpp b/Enemyprojectile.hpp index da75429e03f589cfa9c01da5e5fa54408d4a730a..87a5372a2f1c903e618a8fe4bb28781c3952ab7b 100644 --- a/Enemyprojectile.hpp +++ b/Enemyprojectile.hpp @@ -1,6 +1,8 @@ #ifndef ENEMYPROJECTILE_HPP #define ENEMYPROJECTILE_HPP #include "Projectile.hpp" + +Color constexpr ENEMY_PROJECTILE_COLOR = _2; class EnemyProjectile: public Projectile { public: diff --git a/Entity.cpp b/Entity.cpp index da56f29f31710101905a420665343759123282a8..df138d4272defbd283e4b612b439cd059546044e 100644 --- a/Entity.cpp +++ b/Entity.cpp @@ -55,17 +55,20 @@ bool Entity::step(Position const &PlayerPos, FloatSeconds const & Frametime, Lev return ((hitpoints > 0) || (hittime > 0.0f)); }; -int Entity::takeDamage() +int Entity::takeDamage(Color color) { hitpoints = std::max((hitpoints - 1), 0); hittime = HIT_TIME; + hitcolor = color; return hitpoints; } void Entity::blit(DynamicPixelBuffer &buf) { if(hittime > 0.0f) { - HitShader hs{ getSprite(), (hittime / HIT_TIME), (hitpoints == 0) }; + HitShader hs{ + getSprite(), (hittime / HIT_TIME), hitcolor, (hitpoints == 0) + }; buf.blit_topleft(topleft, hs); } else if(hitpoints > 0) { buf.blit_topleft(topleft, getSprite()); diff --git a/Entity.hpp b/Entity.hpp index 59496073cde66e6d21675339c61c83251cf688b0..64b1a72392d3c090c8d4ae80bc5fc1e4840d9b44 100644 --- a/Entity.hpp +++ b/Entity.hpp @@ -16,6 +16,7 @@ protected: Position topleft; int hitpoints = 1; float hittime = 0.0f; + Color hitcolor; // Entity-specific step method. virtual void doStep( @@ -50,8 +51,9 @@ public: Position const &PlayerPos, FloatSeconds const & Frametime, Level &level ); - // Removes a single hit point. Returns the new number of hit points. - int takeDamage(); + // Removes a single hit point and sets the hit animation color to [color]. + // Returns the new number of hit points. + int takeDamage(Color color); /// ------------- /// Rendering diff --git a/Level.cpp b/Level.cpp index f1f29f6fe4830f5077ad886f1553935d9872cd68..6e379de892af7095b7767ef423d7a676f851f94e 100644 --- a/Level.cpp +++ b/Level.cpp @@ -221,7 +221,7 @@ bool Level::HitEnemy(float posX, float posY, int bufferWidth, int bufferHeigth) { if(collHelper(player.getTopLeft(),player.getSprite(),posX,posY,bufferWidth,bufferHeigth)) { - player.takeDamage(); + player.takeDamage(ENEMY_PROJECTILE_COLOR); return true; } return false; @@ -234,7 +234,7 @@ bool Level::HitPlayer(float posX, float posY, int bufferWidth, int bufferHeigth) { //HauerCh71498 //{ - if(i->takeDamage() == 0) + if(i->takeDamage(PLAYER_PROJECTILE_COLOR) == 0) { score += i->getScore(); } @@ -247,19 +247,19 @@ bool Level::HitPlayer(float posX, float posY, int bufferWidth, int bufferHeigth) /*For projectiles, Gameover*/ // <kruegerzo72182 -bool Level::HitObstacle(float posX, float posY, int bufferWidth, int bufferHeigth) +bool Level::HitObstacle(float posX, float posY, Color hitColor, int bufferWidth, int bufferHeigth) { for(auto &i : wallVector){ if(collHelper(i.getTopLeft(), i.getSprite(), posX, posY, bufferWidth, bufferHeigth)) { - i.takeDamage(); + i.takeDamage(hitColor); return true; } } for(auto &i : sceneryVector) { if(collHelper(i.getTopLeft(), i.getSprite(), posX, posY, bufferWidth, bufferHeigth)) { - i.takeDamage(); + i.takeDamage(hitColor); return true; } } diff --git a/Level.hpp b/Level.hpp index cf47afa70f334ef25b5c7b4fca5cb04c2a224c1a..7c0524bcdf173ae9ad0debef730f39d3e989ba5a 100644 --- a/Level.hpp +++ b/Level.hpp @@ -139,7 +139,7 @@ public: bool HitEnemy(float posX, float posY, int bufferWidth, int bufferHeigth); // Did a player-controlled entity hit an Enemy? bool HitPlayer(float posX, float posY, int bufferWidth, int bufferHeigth); - bool HitObstacle(float posX, float posY, int bufferWidth, int bufferHeigth); + bool HitObstacle(float posX, float posY, Color hitColor, int bufferWidth, int bufferHeigth); void enemyVector_PushBack(std::unique_ptr<Enemy> enemy_); void doDoSteps(FloatSeconds const &frame_time); std::vector<std::unique_ptr<Projectile>>& getProjectileVector(); diff --git a/PixelShaders.cpp b/PixelShaders.cpp index 25528244afee9020ed52f208d6494df61df43080..99000fa77c740240495b8aedfe4d21f314c1bc65 100644 --- a/PixelShaders.cpp +++ b/PixelShaders.cpp @@ -22,5 +22,5 @@ Color HitShader::peekUnchecked(PixelPoint const &pos) const if(src == _t) { return _t; } - return (dist(rng.rng) > 0.95f) ? _3 : (is_final ? _t : src); + return (dist(rng.rng) > 0.95f) ? color : (is_final ? _t : src); } diff --git a/PixelShaders.hpp b/PixelShaders.hpp index cb83bc9760b7d625d01cf14124eb9291f3fdfd60..7dd2d0558e99eed3fecbe56fac5b5a72e74fdb80 100644 --- a/PixelShaders.hpp +++ b/PixelShaders.hpp @@ -6,10 +6,16 @@ class HitShader : public ShadedPixelBuffer { public: float percent; + Color color; bool is_final; - HitShader(PixelBuffer const &input, float percent, bool is_final) - : ShadedPixelBuffer(input), percent(percent), is_final(is_final) { + HitShader( + PixelBuffer const &input, float percent, Color color, bool is_final + ) : + ShadedPixelBuffer(input), + percent(percent), + color(color), + is_final(is_final) { } virtual Color peekUnchecked(PixelPoint const &pos) const; diff --git a/playerprojectile.cpp b/playerprojectile.cpp index 6c56438808ae33dd2ab846b7cad80c61968a8ac6..49ea5137b76ae3275fe30411c3fc5072b6bb5759 100644 --- a/playerprojectile.cpp +++ b/playerprojectile.cpp @@ -27,7 +27,7 @@ bool PlayerProjectile::move(FloatSeconds const & Frametime, Level &level) { this->y -= speed*Frametime.count(); if(level.HitPlayer(this->x, this->y, sprite.w(), sprite.h()) - || level.HitObstacle(this->x, this->y, sprite.w(), sprite.h())) + || level.HitObstacle(this->x, this->y, PLAYER_PROJECTILE_COLOR, sprite.w(), sprite.h())) { //Player hit return false; @@ -45,7 +45,7 @@ bool PlayerProjectile::move(FloatSeconds const & Frametime, Level &level) { this->x -= speed*Frametime.count(); if(level.HitPlayer(this->x, this->y, sprite.w(), sprite.h()) - || level.HitObstacle(this->x, this->y, sprite.w(), sprite.h())) + || level.HitObstacle(this->x, this->y, PLAYER_PROJECTILE_COLOR, sprite.w(), sprite.h())) { //Player hit return false; @@ -63,7 +63,7 @@ bool PlayerProjectile::move(FloatSeconds const & Frametime, Level &level) { this->x += speed*Frametime.count(); if(level.HitPlayer(this->x, this->y, sprite.w(), sprite.h()) - || level.HitObstacle(this->x, this->y, sprite.w(), sprite.h())) + || level.HitObstacle(this->x, this->y, PLAYER_PROJECTILE_COLOR, sprite.w(), sprite.h())) { //Player hit return false; @@ -81,7 +81,7 @@ bool PlayerProjectile::move(FloatSeconds const & Frametime, Level &level) { this->y += speed*Frametime.count(); if(level.HitPlayer(this->x, this->y, sprite.w(), sprite.h()) - || level.HitObstacle(this->x, this->y, sprite.w(), sprite.h())) + || level.HitObstacle(this->x, this->y, PLAYER_PROJECTILE_COLOR, sprite.w(), sprite.h())) { //Player hit return false; diff --git a/playerprojectile.hpp b/playerprojectile.hpp index 425aaae0f3071f398115531a54240b73aa36079b..fdcb29b3c877e4f6f65c293ddb2b32ef7139e541 100644 --- a/playerprojectile.hpp +++ b/playerprojectile.hpp @@ -1,6 +1,8 @@ #ifndef PLAYERPROJECTILE_HPP #define PLAYERPROJECTILE_HPP #include "Projectile.hpp" + +Color constexpr PLAYER_PROJECTILE_COLOR = _6; class PlayerProjectile: public Projectile { public: