Mario: add bouncing
This commit is contained in:
parent
0c4f2482c7
commit
6fe283bb34
@ -13,6 +13,7 @@ MarioBlock::MarioBlock( int x, int y,
|
|||||||
: RectangleRender( x * BLOCK_SIZE, 1 - ( 16 - y ) * BLOCK_SIZE,
|
: RectangleRender( x * BLOCK_SIZE, 1 - ( 16 - y ) * BLOCK_SIZE,
|
||||||
BLOCK_SIZE, BLOCK_SIZE, renderer, texture, src ) {
|
BLOCK_SIZE, BLOCK_SIZE, renderer, texture, src ) {
|
||||||
_destructible = destructible;
|
_destructible = destructible;
|
||||||
|
setMovementSpeed(1);
|
||||||
}
|
}
|
||||||
void MarioBlock::visit( SDLPP::Visitor &visitor ) {
|
void MarioBlock::visit( SDLPP::Visitor &visitor ) {
|
||||||
#ifdef EDITOR
|
#ifdef EDITOR
|
||||||
@ -25,8 +26,13 @@ void MarioBlock::visit( SDLPP::Visitor &visitor ) {
|
|||||||
destroy();
|
destroy();
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if(visitor.getFromId() == MARIO_TOP_DETECT && _destructible && dynamic_cast<MarioVisitor&>(visitor).canDestroy()) {
|
if(visitor.getFromId() == MARIO_TOP_DETECT && dynamic_cast<MarioVisitor&>(visitor).canDestroy()) {
|
||||||
destroy();
|
if( _destructible ) {
|
||||||
|
destroy();
|
||||||
|
} else {
|
||||||
|
// TODO check if anything above
|
||||||
|
bounce();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
visitor.visit( *this );
|
visitor.visit( *this );
|
||||||
@ -38,6 +44,32 @@ void MarioBlock::setTerrain( bool terrain ) {
|
|||||||
_terrain = terrain;
|
_terrain = terrain;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MarioBlock::bounce() {
|
||||||
|
if(_bouncing)
|
||||||
|
return;
|
||||||
|
_bouncing = true;
|
||||||
|
og_pos = getPos();
|
||||||
|
setMovement(0, -0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarioBlock::custom_move(int ticks) {
|
||||||
|
if(!_bouncing)
|
||||||
|
return;
|
||||||
|
if(getMovement().getY() < 0) {
|
||||||
|
ticks_to_bounce -= ticks;
|
||||||
|
if(ticks_to_bounce < 0) {
|
||||||
|
setMovement(0, 0.5);
|
||||||
|
ticks_to_bounce = bounce_ticks;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(getPos().getY() >= og_pos.getY()) {
|
||||||
|
setMovement(0, 0);
|
||||||
|
setPos(og_pos);
|
||||||
|
_bouncing = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const std::vector< uint64_t > possibleBlocks = {
|
const std::vector< uint64_t > possibleBlocks = {
|
||||||
FLOOR_ID,
|
FLOOR_ID,
|
||||||
STEP_ID,
|
STEP_ID,
|
||||||
|
@ -11,11 +11,17 @@ public:
|
|||||||
void visit( SDLPP::Visitor &visitor ) override;
|
void visit( SDLPP::Visitor &visitor ) override;
|
||||||
void setTool( bool tool = true );
|
void setTool( bool tool = true );
|
||||||
void setTerrain( bool terrain = true );
|
void setTerrain( bool terrain = true );
|
||||||
|
void bounce();
|
||||||
|
virtual void custom_move(int ticks) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool _tool = false;
|
bool _tool = false;
|
||||||
bool _terrain = true;
|
bool _terrain = true;
|
||||||
bool _destructible = false;
|
bool _destructible = false;
|
||||||
|
bool _bouncing = false;
|
||||||
|
const int bounce_ticks = 100;
|
||||||
|
int ticks_to_bounce = bounce_ticks;
|
||||||
|
SDLPP::Vec2D<double> og_pos = {};
|
||||||
};
|
};
|
||||||
|
|
||||||
extern const std::vector< uint64_t > possibleBlocks;
|
extern const std::vector< uint64_t > possibleBlocks;
|
||||||
|
@ -21,8 +21,8 @@ Mario::Mario(const std::shared_ptr< SDLPP::Renderer > &renderer) : SDLPP::Rectan
|
|||||||
SDLPP::RectColider( 0.05, 0, 0.1, 0.1, MARIO_TOP_LEFT_DETECT ) );
|
SDLPP::RectColider( 0.05, 0, 0.1, 0.1, MARIO_TOP_LEFT_DETECT ) );
|
||||||
addCollision(
|
addCollision(
|
||||||
SDLPP::RectColider( 0.85, 0, 0.1, 0.1, MARIO_TOP_LEFT_DETECT ) );
|
SDLPP::RectColider( 0.85, 0, 0.1, 0.1, MARIO_TOP_LEFT_DETECT ) );
|
||||||
addCollision(
|
top_collision = std::make_shared<SDLPP::RectColider>( 0.5, 0, 0.2, 0.15, MARIO_TOP_DETECT );
|
||||||
SDLPP::RectColider( 0.35, 0, 0.3, 0.15, MARIO_TOP_DETECT ) );
|
addCollision( top_collision );
|
||||||
setStatic( false );
|
setStatic( false );
|
||||||
}
|
}
|
||||||
void Mario::walkLeft() {
|
void Mario::walkLeft() {
|
||||||
@ -31,6 +31,8 @@ void Mario::walkLeft() {
|
|||||||
addMovement( -side_movement, 0 );
|
addMovement( -side_movement, 0 );
|
||||||
if ( getMovement().getX() < 0 && faces_right ) {
|
if ( getMovement().getX() < 0 && faces_right ) {
|
||||||
flipHorizontally();
|
flipHorizontally();
|
||||||
|
top_collision->setPos(0.3, 0);
|
||||||
|
updateSizeAndPosition();
|
||||||
faces_right = false;
|
faces_right = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -41,6 +43,8 @@ void Mario::walkRight() {
|
|||||||
addMovement( side_movement, 0 );
|
addMovement( side_movement, 0 );
|
||||||
if ( getMovement().getX() > 0 && !faces_right ) {
|
if ( getMovement().getX() > 0 && !faces_right ) {
|
||||||
flipHorizontally();
|
flipHorizontally();
|
||||||
|
top_collision->setPos(0.5, 0);
|
||||||
|
updateSizeAndPosition();
|
||||||
faces_right = true;
|
faces_right = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,7 @@ private:
|
|||||||
const int base_gravity_ticks = 1000/60;
|
const int base_gravity_ticks = 1000/60;
|
||||||
const double gravity_add_jumping = jump_movement/32.0;
|
const double gravity_add_jumping = jump_movement/32.0;
|
||||||
const double gravity_add_falling = jump_movement/(64.0/7.0);
|
const double gravity_add_falling = jump_movement/(64.0/7.0);
|
||||||
|
std::shared_ptr<SDLPP::RectColider> top_collision = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user