From 6e61eb03b91a3e31b8f261c4010d8ce07423822f Mon Sep 17 00:00:00 2001 From: zvon Date: Wed, 26 May 2021 18:24:09 +0200 Subject: [PATCH] Mario: check before bouncing --- mario/blocks.cpp | 14 ++++++++++++-- mario/global_vars.cpp | 1 + mario/global_vars.hpp | 1 + mario/main.cpp | 1 + mario/mario_visitor.cpp | 14 ++++++++++++++ mario/mario_visitor.hpp | 27 +++++++++++++++++++++++++++ 6 files changed, 56 insertions(+), 2 deletions(-) diff --git a/mario/blocks.cpp b/mario/blocks.cpp index 848e977..609fa9e 100644 --- a/mario/blocks.cpp +++ b/mario/blocks.cpp @@ -30,8 +30,18 @@ void MarioBlock::visit( SDLPP::Visitor &visitor ) { if( _destructible ) { destroy(); } else { - // TODO check if anything above - bounce(); + BounceVisitor bv; + bv.setVisitorType(VisitorType::Terrain); + + setPos(getPos() - SDLPP::Vec2D(0, BLOCK_SIZE)); + if(getCollisions().size() < 2) + addCollision(SDLPP::RectColider(0.1, 0.1, 0.8, 0.8, 69)); + updateSizeAndPosition(); + g_playground->visitCollisions(*this, bv); + setPos(getPos() + SDLPP::Vec2D(0, BLOCK_SIZE)); + updateSizeAndPosition(); + if(bv.canBounce()) + bounce(); } } #endif diff --git a/mario/global_vars.cpp b/mario/global_vars.cpp index 9a34369..9bbb60d 100644 --- a/mario/global_vars.cpp +++ b/mario/global_vars.cpp @@ -4,3 +4,4 @@ std::shared_ptr< SDLPP::Texture > g_terrain_texture{}; std::shared_ptr< SDLPP::Texture > g_mario_texture{}; std::shared_ptr< SDLPP::Texture > g_translucent_terrain_texture{}; +std::shared_ptr< SDLPP::Scene > g_playground{}; diff --git a/mario/global_vars.hpp b/mario/global_vars.hpp index 1c9dfd5..2577870 100644 --- a/mario/global_vars.hpp +++ b/mario/global_vars.hpp @@ -6,5 +6,6 @@ extern std::shared_ptr< SDLPP::Texture > g_terrain_texture; extern std::shared_ptr< SDLPP::Texture > g_mario_texture; extern std::shared_ptr< SDLPP::Texture > g_translucent_terrain_texture; +extern std::shared_ptr< SDLPP::Scene > g_playground; #endif diff --git a/mario/main.cpp b/mario/main.cpp index b641524..b4f6bf6 100644 --- a/mario/main.cpp +++ b/mario/main.cpp @@ -166,6 +166,7 @@ int main() { renderer, "sprites/terrain.png", MARIO_OVERWORLD_COLORKEY ); auto scene = std::make_shared< SDLPP::Scene >( renderer ); + g_playground = scene; auto bg = std::make_shared< SDLPP::RectangleRender >( 0, 0, 10, 10, renderer, MARIO_OVERWORLD_COLORKEY, true ); bg->setPermanent(); diff --git a/mario/mario_visitor.cpp b/mario/mario_visitor.cpp index 237ac6d..f204f38 100644 --- a/mario/mario_visitor.cpp +++ b/mario/mario_visitor.cpp @@ -38,3 +38,17 @@ void MarioVisitor::visit( const SDLPP::RenderObject &obj ) { break; } } + +void BounceVisitor::visit( const SDLPP::RenderObject &obj ) { + auto id = obj.getId(); + switch ( id ) { + case FLOOR_ID: + case BRICK_ID: + case BRICK_TOP_ID: + if(from == 69) { + hits += 1; + } + default: + break; + } +} diff --git a/mario/mario_visitor.hpp b/mario/mario_visitor.hpp index 6c64c1e..eef006f 100644 --- a/mario/mario_visitor.hpp +++ b/mario/mario_visitor.hpp @@ -80,4 +80,31 @@ private: SDLPP::Vec2D movement_blockage; }; +class BounceVisitor : public SDLPP::Visitor { +public: + BounceVisitor() {} + virtual void visit( const SDLPP::RenderObject &obj ) override; + virtual void setFromId( uint64_t id ) override { + from = id; + } + virtual uint64_t getFromId() override { + return from; + } + virtual void setVisitorType( uint64_t type ) override { + _type = type; + } + virtual uint64_t getVisitorType() override { + return _type; + } + + bool canBounce() { + return hits <= 2; + } + +private: + int hits = 0; + uint64_t from; + uint64_t _type; +}; + #endif