diff --git a/mario/maploader.cpp b/mario/maploader.cpp index ea045c0..9eeffd3 100644 --- a/mario/maploader.cpp +++ b/mario/maploader.cpp @@ -41,7 +41,7 @@ void loadMap( std::shared_ptr< SDLPP::Scene > &scene, } } bool collision = false; - if ( id == FLOOR_ID ) { + if ( id == FLOOR_ID || id == BRICK_ID || id == BRICK_TOP_ID ) { collision = true; } // TODO add modifiers to createTerrainBlock diff --git a/mario/mario.cpp b/mario/mario.cpp index 05e478d..0852ab7 100644 --- a/mario/mario.cpp +++ b/mario/mario.cpp @@ -73,6 +73,9 @@ void Mario::handleVisitor(MarioVisitor &visitor, SDLPP::Vec2D previous_p setPos(getPos().getX(), visitor.getGroundY() - BLOCK_SIZE); } } + if(visitor.topBlock() && getMovement().getY() < 0) { + resetMovementY(); + } // make sure Mario isn't stuck inside a wall if ( visitor.isStopped() || ( !visitor.canGoLeft() && previous_position.getX() > getPos().getX() ) || diff --git a/mario/mario_visitor.cpp b/mario/mario_visitor.cpp index 2c11172..7d12a5f 100644 --- a/mario/mario_visitor.cpp +++ b/mario/mario_visitor.cpp @@ -6,6 +6,8 @@ void MarioVisitor::visit( const SDLPP::RenderObject &obj ) { auto id = obj.getId(); switch ( id ) { case FLOOR_ID: + case BRICK_ID: + case BRICK_TOP_ID: if ( from == MARIO_FLOOR_DETECT ) { onGround = true; groundY = obj.getPos().getY(); @@ -13,6 +15,8 @@ void MarioVisitor::visit( const SDLPP::RenderObject &obj ) { left = true; } else if (from == MARIO_RIGHT_SIDE_DETECT ) { right = true; + } else if (from == MARIO_TOP_DETECT) { + top_hit = true; } break; case DEATH_ID: diff --git a/mario/mario_visitor.hpp b/mario/mario_visitor.hpp index 9d02747..34ab124 100644 --- a/mario/mario_visitor.hpp +++ b/mario/mario_visitor.hpp @@ -41,6 +41,9 @@ public: double getGroundY() { return groundY; } + bool topBlock() { + return top_hit; + } private: bool onGround = false; @@ -52,6 +55,7 @@ private: bool left = false; bool right = false; uint64_t _type = 0; + bool top_hit = false; }; #endif