diff --git a/mario/Makefile b/mario/Makefile index 39ae706..d754259 100644 --- a/mario/Makefile +++ b/mario/Makefile @@ -18,7 +18,7 @@ LDFLAGS ?= -lSDL2 -lSDL2_image -lSDL2_gfx -lSDL2_ttf -pthread OUTPUTFLAG = -o endif -COMMON_OBJECTS = global_vars.${OBJEXT} sprites.${OBJEXT} maploader.${OBJEXT} mapobject.${OBJEXT} coineditorblock.${OBJEXT} simpleblocks.${OBJEXT} mario.${OBJEXT} +COMMON_OBJECTS = global_vars.${OBJEXT} sprites.${OBJEXT} maploader.${OBJEXT} mapobject.${OBJEXT} coineditorblock.${OBJEXT} coinblock.${OBJEXT} simpleblocks.${OBJEXT} mario.${OBJEXT} ifneq ($(UNAME_S),Windows) COMMON_OBJECTS += libsdlpp.a endif @@ -71,6 +71,8 @@ editor_visitor.${OBJEXT}: editor_visitor.cpp ../sdlpp/sdlpp.hpp sprites.hpp edit $(CXX) $(CXXFLAGS) -c ${OUTPUTFLAG}$@ $< coineditorblock.${OBJEXT}: blocks/coineditorblock.cpp ../sdlpp/sdlpp.hpp sprites.hpp global_vars.hpp blocks.hpp blocks/coineditorblock.hpp $(CXX) $(CXXFLAGS) -c ${OUTPUTFLAG}$@ $< +coinblock.${OBJEXT}: blocks/coinblock.cpp ../sdlpp/sdlpp.hpp sprites.hpp global_vars.hpp blocks.hpp blocks/coinblock.hpp + $(CXX) $(CXXFLAGS) -c ${OUTPUTFLAG}$@ $< simpleblocks.${OBJEXT}: blocks/simpleblocks.cpp ../sdlpp/sdlpp.hpp sprites.hpp global_vars.hpp blocks.hpp blocks/simpleblocks.hpp $(CXX) $(CXXFLAGS) -c ${OUTPUTFLAG}$@ $< mapobject.${OBJEXT}: mapobject.cpp ../sdlpp/sdlpp.hpp objectids.hpp diff --git a/mario/blocks.cpp b/mario/blocks.cpp index 4d4c28b..2cde87a 100644 --- a/mario/blocks.cpp +++ b/mario/blocks.cpp @@ -3,10 +3,12 @@ #include "objectids.hpp" #include "sprites.hpp" #include "editor_visitor.hpp" +#include #include #include "mario_visitor.hpp" #include "blocks/simpleblocks.hpp" #include "blocks/coineditorblock.hpp" +#include "blocks/coinblock.hpp" #include "mario.hpp" #define CAN_BE_DESTROYED_FLAG 0x0000000000000001 @@ -57,7 +59,11 @@ void MarioBlock::visit( SDLPP::Visitor &visitor ) { } if ( hasCoin() ) { removeCoin(); + auto coin = createTerrainBlock(COIN_ID, LandType::OVERWORLD, renderer); + coin->setPos(getPos()); + std::dynamic_pointer_cast(coin)->setParent(this); dynamic_cast< MarioVisitor & >( visitor ).setCoin(); + dynamic_cast< MarioVisitor & >( visitor ).setCoinBlock(coin); } } #endif @@ -75,7 +81,12 @@ void MarioBlock::bounce() { return; _bouncing = true; og_pos = getPos(); - setMovement( 0, -0.5 ); + ticks_to_bounce = bounce_ticks; + setMovement( 0, -bounce_speed ); +} + +bool MarioBlock::isBouncing() { + return _bouncing; } void MarioBlock::custom_move( int ticks ) { @@ -84,7 +95,7 @@ void MarioBlock::custom_move( int ticks ) { if ( getMovement().getY() < 0 ) { ticks_to_bounce -= ticks; if ( ticks_to_bounce < 0 ) { - setMovement( 0, 0.5 ); + setMovement( 0, bounce_speed ); ticks_to_bounce = bounce_ticks; } } else { @@ -491,6 +502,10 @@ createBlockById( uint64_t id, int x, int y, result = std::static_pointer_cast< MarioBlock >( std::make_shared< MushroomModifierBlock >( x, y, renderer ) ); break; + case COIN_ID: + result = std::static_pointer_cast< MarioBlock >( + std::make_shared< CoinBlock >( x, y, renderer ) ); + break; } return result; } diff --git a/mario/blocks.hpp b/mario/blocks.hpp index 89f9a7b..f756167 100644 --- a/mario/blocks.hpp +++ b/mario/blocks.hpp @@ -34,6 +34,11 @@ public: void setCoinCount( int coins ); void setDestructible( bool destructible = true ); void ensureCollision(); + bool isBouncing(); + +protected: + double bounce_speed = 0.5; + int bounce_ticks = 100; private: bool _tool = false; @@ -43,8 +48,8 @@ private: bool _bouncing = false; int _coins = 0; bool _mushroom = false; - const int bounce_ticks = 100; - int ticks_to_bounce = bounce_ticks; + bool _release_coin = false; + int ticks_to_bounce = 0; SDLPP::Vec2D< double > og_pos = {}; LandType::Value _type; SDL_Rect _base_src; diff --git a/mario/blocks/coinblock.cpp b/mario/blocks/coinblock.cpp new file mode 100644 index 0000000..93b343b --- /dev/null +++ b/mario/blocks/coinblock.cpp @@ -0,0 +1,25 @@ +#include "coinblock.hpp" +#include "../sprites.hpp" +#include "../global_vars.hpp" + +CoinBlock::CoinBlock( int x, int y, std::shared_ptr< SDLPP::Renderer > renderer ) : MarioBlock(x, y, renderer, g_terrain_texture, COIN_SRC, true, true) { + setHidden(true); + bounce_speed = 0.75; + bounce_ticks = 150; +} + +void CoinBlock::custom_move(int ticks) { + if(_parent != nullptr && !_parent->isBouncing() && !isBouncing()) { + setHidden(false); + bounce(); + _parent = nullptr; + } else if (_parent == nullptr && !isBouncing()) { + setHidden(true); + destroy(); + } + MarioBlock::custom_move(ticks); +} + +void CoinBlock::setParent(MarioBlock *parent) { + _parent = parent; +} diff --git a/mario/blocks/coinblock.hpp b/mario/blocks/coinblock.hpp new file mode 100644 index 0000000..a058b33 --- /dev/null +++ b/mario/blocks/coinblock.hpp @@ -0,0 +1,15 @@ +#ifndef COIN_BLOCK_HPP +#define COIN_BLOCK_HPP + +#include "../blocks.hpp" + +class CoinBlock : public MarioBlock { +public: + CoinBlock( int x, int y, std::shared_ptr< SDLPP::Renderer > renderer ); + virtual void custom_move(int ticks) override; + void setParent(MarioBlock *parent); +private: + MarioBlock *_parent; +}; + +#endif diff --git a/mario/blocks/simpleblocks.cpp b/mario/blocks/simpleblocks.cpp index d0eaf32..7258e4c 100644 --- a/mario/blocks/simpleblocks.cpp +++ b/mario/blocks/simpleblocks.cpp @@ -444,10 +444,6 @@ BackgroundModifierBlock::BackgroundModifierBlock( int x, int y, std::shared_ptr< SDLPP::Renderer > renderer ) : MarioBlock (x, y, renderer, g_mod_texture, MOD_BACKGROUND_SRC, false ) { setId( BACKGROUND_MODIFIER_ID ); } -CoinModifierBlock::CoinModifierBlock( int x, int y, - std::shared_ptr< SDLPP::Renderer > renderer ) : MarioBlock (x, y, renderer, g_mod_texture, MOD_COIN_SRC, false ) { - setId( COIN_MODIFIER_ID ); -} MushroomModifierBlock::MushroomModifierBlock( int x, int y, std::shared_ptr< SDLPP::Renderer > renderer ) : MarioBlock (x, y, renderer, g_mod_texture, MOD_MUSHROOM_SRC, false ) { setId( MUSHROOM_MODIFIER_ID ); diff --git a/mario/blocks/simpleblocks.hpp b/mario/blocks/simpleblocks.hpp index 3961b7f..1754be9 100644 --- a/mario/blocks/simpleblocks.hpp +++ b/mario/blocks/simpleblocks.hpp @@ -290,11 +290,6 @@ public: BackgroundModifierBlock( int x, int y, std::shared_ptr< SDLPP::Renderer > renderer ); }; -class CoinModifierBlock : public MarioBlock { -public: - CoinModifierBlock( int x, int y, - std::shared_ptr< SDLPP::Renderer > renderer ); -}; class MushroomModifierBlock : public MarioBlock { public: MushroomModifierBlock( int x, int y, diff --git a/mario/main.cpp b/mario/main.cpp index 87ad66a..f23049f 100644 --- a/mario/main.cpp +++ b/mario/main.cpp @@ -142,6 +142,11 @@ void doInput( std::shared_ptr< SDLPP::Scene > scene ) { coin_count++; coins->changeText(std::to_string(coin_count) + " COINS"); } + if ( mv.hasCoinBlock() ) { + auto coin = mv.getCoinBlock(); + scene->addObject(coin); + scene->setZIndex(coin, 1); + } // if player is > 0.7 of playground, move everything left auto playerX = mario->getRect().x; diff --git a/mario/mario_visitor.hpp b/mario/mario_visitor.hpp index 8927461..8ca6e7a 100644 --- a/mario/mario_visitor.hpp +++ b/mario/mario_visitor.hpp @@ -3,6 +3,7 @@ #include "../sdlpp/sdlpp_visitor.hpp" #include "../sdlpp/sdlpp_geometry.hpp" +#include "blocks.hpp" class MarioVisitor : public SDLPP::Visitor { public: @@ -71,6 +72,18 @@ public: return coin; } + void setCoinBlock(std::shared_ptr &coin) { + coin_block = coin; + } + + bool hasCoinBlock() { + return coin_block != nullptr; + } + + std::shared_ptr &getCoinBlock() { + return coin_block; + } + private: bool onGround = false; double groundY = 0; @@ -87,6 +100,7 @@ private: bool jumping; bool coin = false; SDLPP::Vec2D movement_blockage; + std::shared_ptr coin_block = nullptr; }; class BounceVisitor : public SDLPP::Visitor { diff --git a/mario/objectids.hpp b/mario/objectids.hpp index 87de41f..583f713 100644 --- a/mario/objectids.hpp +++ b/mario/objectids.hpp @@ -61,6 +61,7 @@ #define CANNON_TOWER_ID 0x7038 #define CANNON_PEDESTAL_ID 0x7039 #define CANNON_ID 0x703A +#define COIN_ID 0x703B // modifiers #define DESTRUCTIBLE_MODIFIER_ID 0x01 diff --git a/mario/sprites.cpp b/mario/sprites.cpp index da50716..fbf2d72 100644 --- a/mario/sprites.cpp +++ b/mario/sprites.cpp @@ -78,6 +78,7 @@ const SDL_Rect TREE_LEAVES_BOTTOM_SRC = {239, 29, 16, 16}; const SDL_Rect CANNON_TOWER_SRC = {256, 46, 16, 16}; const SDL_Rect CANNON_PEDESTAL_SRC = {256, 29, 16, 16}; const SDL_Rect CANNON_SRC = {256, 12, 16, 16}; +const SDL_Rect COIN_SRC = {549, 202, 16, 16}; extern const SDL_Rect MOD_DESTRUCTIBLE_SRC = {0, 0, 16, 16}; extern const SDL_Rect MOD_BACKGROUND_SRC = {16, 0, 16, 16}; diff --git a/mario/sprites.hpp b/mario/sprites.hpp index eb498fb..a75890e 100644 --- a/mario/sprites.hpp +++ b/mario/sprites.hpp @@ -86,6 +86,7 @@ extern const SDL_Rect TREE_LEAVES_BOTTOM_SRC; extern const SDL_Rect CANNON_TOWER_SRC; extern const SDL_Rect CANNON_PEDESTAL_SRC; extern const SDL_Rect CANNON_SRC; +extern const SDL_Rect COIN_SRC; //------------------ MODIFIERS ---------------------- extern const SDL_Rect MOD_DESTRUCTIBLE_SRC; extern const SDL_Rect MOD_BACKGROUND_SRC;