Mario: destroy blocks 1 at a time, if jumping and would hit only with small side, move Mario a bit so the jump is successful
This commit is contained in:
+18
-18
@@ -14,11 +14,15 @@ Mario::Mario(const std::shared_ptr< SDLPP::Renderer > &renderer) : SDLPP::Rectan
|
||||
addCollision(
|
||||
SDLPP::RectColider( 0.21, 0.85, 0.65, 0.25, MARIO_FLOOR_DETECT ) );
|
||||
addCollision(
|
||||
SDLPP::RectColider( 0, 0.1, 0.1, 0.8, MARIO_LEFT_SIDE_DETECT ) );
|
||||
SDLPP::RectColider( 0.05, 0.1, 0.1, 0.8, MARIO_LEFT_SIDE_DETECT ) );
|
||||
addCollision(
|
||||
SDLPP::RectColider( 0.9, 0.1, 0.1, 0.8, MARIO_RIGHT_SIDE_DETECT ) );
|
||||
SDLPP::RectColider( 0.85, 0.1, 0.1, 0.8, MARIO_RIGHT_SIDE_DETECT ) );
|
||||
addCollision(
|
||||
SDLPP::RectColider( 0.45, 0, 0.1, 0.15, MARIO_TOP_DETECT ) );
|
||||
SDLPP::RectColider( 0.05, 0, 0.1, 0.1, MARIO_TOP_LEFT_DETECT ) );
|
||||
addCollision(
|
||||
SDLPP::RectColider( 0.85, 0, 0.1, 0.1, MARIO_TOP_LEFT_DETECT ) );
|
||||
addCollision(
|
||||
SDLPP::RectColider( 0.35, 0, 0.3, 0.15, MARIO_TOP_DETECT ) );
|
||||
setStatic( false );
|
||||
}
|
||||
void Mario::walkLeft() {
|
||||
@@ -48,19 +52,8 @@ void Mario::setStanding() {
|
||||
}
|
||||
|
||||
void Mario::handleVisitor(MarioVisitor &visitor, SDLPP::Vec2D<double> previous_position) {
|
||||
// TODO - https://web.archive.org/web/20130807122227/http://i276.photobucket.com/albums/kk21/jdaster64/smb_playerphysics.png
|
||||
// handle gravity
|
||||
// TODO - https://haydnscarlett.wordpress.com/2020/07/30/marios-jump/
|
||||
/* if (jumping) {
|
||||
if(stop_jump && getPos().getY() - min_jump < 0.05) {
|
||||
jumping = false;
|
||||
resetMovementY();
|
||||
} else if( getPos().getY() - max_jump < 0.05 ) {
|
||||
jumping = false;
|
||||
resetMovementY();
|
||||
} else if ( getPos().getY() - slow_jump < 0.05 && getMovement().getY() < -1*jump_movement/5 ) {
|
||||
addMovement(0, jump_movement/50);
|
||||
}
|
||||
}*/
|
||||
on_ground = visitor.isOnGround();
|
||||
if(!jumping && on_ground) {
|
||||
resetMovementY();
|
||||
@@ -75,12 +68,19 @@ void Mario::handleVisitor(MarioVisitor &visitor, SDLPP::Vec2D<double> previous_p
|
||||
}
|
||||
if(visitor.topBlock() && getMovement().getY() < 0) {
|
||||
resetMovementY();
|
||||
stop_jump = true;
|
||||
}
|
||||
// make sure Mario isn't stuck inside a wall
|
||||
if ( visitor.isStopped() ||
|
||||
( !visitor.canGoLeft() && previous_position.getX() > getPos().getX() ) ||
|
||||
( !visitor.canGoRight() && previous_position.getX() < getPos().getX() ) ) {
|
||||
// TODO more readable function names
|
||||
if ( visitor.isStopped() || !visitor.canGoLeft() || !visitor.canGoRight() ) {
|
||||
setPos( previous_position.getX(), getPos().getY() );
|
||||
} else if (visitor.moveTop() && (jumping && !stop_jump)) {
|
||||
auto objPos = visitor.getRightLeftPos();
|
||||
if(objPos.getX() < getPos().getX()) {
|
||||
setPos( objPos.getX() + BLOCK_SIZE, getPos().getY() );
|
||||
} else {
|
||||
setPos( objPos.getX() - BLOCK_SIZE, getPos().getY() );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user