X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fplayer.cpp;h=1a8feb6f48a033519a89f7ee9ee5e54028ddb61b;hb=70fdbd45026801f0f0f312278c69b383eaca9d3a;hp=5c48e8cd662d323ff550bb75d2b4932340e8255d;hpb=c061fb7a1df19f58277679de4203c980df8bf7e0;p=supertux.git diff --git a/src/object/player.cpp b/src/object/player.cpp index 5c48e8cd6..1a8feb6f4 100644 --- a/src/object/player.cpp +++ b/src/object/player.cpp @@ -36,11 +36,13 @@ #include "game_session.hpp" #include "object/tilemap.hpp" #include "object/camera.hpp" -#include "object/gameobjs.hpp" +#include "object/particles.hpp" #include "object/portable.hpp" +#include "object/bullet.hpp" #include "trigger/trigger_base.hpp" #include "control/joystickkeyboardcontroller.hpp" #include "main.hpp" +#include "player_status.hpp" static const int TILES_FOR_BUTTJUMP = 3; static const float SHOOTING_TIME = .150; @@ -55,6 +57,8 @@ static const float MAX_WALK_XM = 230; static const float MAX_RUN_XM = 320; static const float WALK_SPEED = 100; +static const float KICK_TIME = .3; + // growing animation Surface* growingtux_left[GROWING_FRAMES]; Surface* growingtux_right[GROWING_FRAMES]; @@ -126,22 +130,12 @@ Player::init() last_ground_y = 0; fall_mode = ON_GROUND; jumping = false; - flapping = false; can_jump = true; - can_flap = false; - falling_from_flap = false; - enable_hover = false; butt_jump = false; deactivated = false; + backflipping = false; + backflip_direction = 0; - flapping_velocity = 0; - - // temporary to help player's choosing a flapping - flapping_mode = NO_FLAP; - - // Ricardo's flapping - flaps_nb = 0; - on_ground_flag = false; grabbed_object = 0; @@ -162,19 +156,31 @@ Player::update(float elapsed_time) return; } + // fixes the "affected even while blinking" bug + if (safe_timer.started() && this->get_group() != COLGROUP_MOVING_ONLY_STATIC) { + this->set_group(COLGROUP_MOVING_ONLY_STATIC); + } + else if (!safe_timer.started() && this->get_group() == COLGROUP_MOVING_ONLY_STATIC) { + this->set_group(COLGROUP_MOVING); + } + if(!controller->hold(Controller::ACTION) && grabbed_object) { - grabbed_object = 0; // move the grabbed object a bit away from tux Vector pos = get_pos() + - Vector(dir == LEFT ? -bbox.get_width() : bbox.get_width(), + Vector(dir == LEFT ? -bbox.get_width()-1 : bbox.get_width()+1, bbox.get_height()*0.66666 - 32); - MovingObject* object = dynamic_cast (grabbed_object); - if(object) { - object->set_pos(pos); - } else { + Rect dest(pos, pos + Vector(32, 32)); + if(Sector::current()->is_free_space(dest)) { + MovingObject* moving_object = dynamic_cast (grabbed_object); + if(moving_object) { + moving_object->set_pos(pos); + } else { #ifdef DEBUG - std::cout << "Non MovingObjetc grabbed?!?\n"; + std::cout << "Non MovingObjetc grabbed?!?\n"; #endif + } + grabbed_object->ungrab(*this, dir); + grabbed_object = 0; } } @@ -198,7 +204,7 @@ Player::update(float elapsed_time) Vector pos = get_pos() + Vector(dir == LEFT ? -16 : 16, bbox.get_height()*0.66666 - 32); - grabbed_object->grab(*this, pos); + grabbed_object->grab(*this, pos, dir); } } @@ -275,10 +281,9 @@ Player::handle_horizontal_input() // dust some particles Sector::current()->add_object( new Particles( - Vector(bbox.p1.x + (dir == RIGHT ? bbox.get_width() : 0), - bbox.p2.y), + Vector(dir == RIGHT ? bbox.p2.x : bbox.p1.x, bbox.p2.y), dir == RIGHT ? 270+20 : 90-40, dir == RIGHT ? 270+40 : 90-20, - Vector(280,-260), Vector(0,0.030), 3, Color(100,100,100), 3, .8, + Vector(280, -260), Vector(0, 300), 3, Color(.4, .4, .4), 3, .8, LAYER_OBJECTS+1)); ax *= 2.5; @@ -342,19 +347,23 @@ Player::handle_vertical_input() if(on_ground()) { /* Make sure jumping is off. */ jumping = false; - flapping = false; - falling_from_flap = false; - if (flapping_timer.started()) { - flapping_timer.stop(); + if (backflipping) { + backflipping = false; + backflip_direction = 0; } - - physic.set_acceleration_y(0); //for flapping } // Press jump key if(controller->pressed(Controller::JUMP) && can_jump && on_ground()) { - if (duck) // only jump a little bit when in duck mode - physic.set_velocity_y(300); + if (duck) { + if (physic.get_velocity_x() != 0) // only jump a little bit when running ducked + physic.set_velocity_y(300); + else { //do a backflip + backflipping = true; + physic.set_velocity_y(580); + backflip_timer.start(0.15); + } + } else if (fabs(physic.get_velocity_x()) > MAX_WALK_XM) // jump higher if we are running physic.set_velocity_y(580); else @@ -362,118 +371,17 @@ Player::handle_vertical_input() //bbox.move(Vector(0, -1)); jumping = true; - flapping = false; can_jump = false; - can_flap = false; - flaps_nb = 0; // Ricardo's flapping if (is_big()) sound_manager->play("sounds/bigjump.wav"); else sound_manager->play("sounds/jump.wav"); } else if(!controller->hold(Controller::JUMP)) { // Let go of jump key - if (!flapping && !duck && !falling_from_flap && !on_ground()) { - can_flap = true; - } - if (jumping && physic.get_velocity_y() > 0) { + if (!backflipping && jumping && physic.get_velocity_y() > 0) { jumping = false; physic.set_velocity_y(0); } } -#if CHOOSEFLAPSTYLE - // temporary to help players choosing a flapping - if(flapping_mode == RICARDO_FLAP) { - // Flapping, Ricardo's version - // similar to SM3 Fox - if(controller->pressed(Controller::JUMP) && can_flap && flaps_nb < 3) { - physic.set_velocity_y(350); - physic.set_velocity_x(physic.get_velocity_x() * 35); - flaps_nb++; - } - } else if(flapping_mode == MAREK_FLAP) { -#endif - // Flapping, Marek and Ondra's version - if (controller->hold(Controller::JUMP) && can_flap) - { - if (flapping_timer.check()) - { - can_flap = false; - //flapping = false; - falling_from_flap = true; - } - else if (!flapping_timer.started()) - { - flapping_timer.start(TUX_FLAPPING_TIME); - flapping_velocity = physic.get_velocity_x(); - } - else - { - jumping = true; - flapping = true; - float cv = flapping_velocity * sqrt( - TUX_FLAPPING_TIME - flapping_timer.get_timegone() - / TUX_FLAPPING_TIME); - - //Handle change of direction while flapping - if (((dir == LEFT) && (cv > 0)) || (dir == RIGHT) && (cv < 0)) { - cv *= (-1); - } - else if (cv == 0) { - if (controller->hold(Controller::LEFT)) { - cv = -TUX_FLAPPING_LEAST_X; - } - else if (controller->hold(Controller::RIGHT)) { - cv = TUX_FLAPPING_LEAST_X; - } - } - physic.set_velocity_x(cv); - physic.set_velocity_y(flapping_timer.get_timegone() - * TUX_FLAPPING_STRENGTH); - //std::cout << "Timegone: " << flapping_timer.get_timegone() << ", Y velocity: " << physic.get_velocity_y() << "\n"; - } - } -#if CHOOSEFLAPSTYLE - } else if(flapping_mode == RYAN_FLAP) { - // Flapping, Ryan's version - if (controller->hold(Controller::JUMP) && can_flap) - { - if (!flapping_timer.started()) - { - flapping_timer.start(TUX_FLAPPING_TIME); - } - if (flapping_timer.check()) - { - can_flap = false; - falling_from_flap = true; - } - jumping = true; - flapping = true; - if (flapping && flapping_timer.get_timegone() <= TUX_FLAPPING_TIME - && physic.get_velocity_y() < 0) - { - float gravity = Sector::current()->gravity; - (void)gravity; - float xr = (fabsf(physic.get_velocity_x()) / MAX_RUN_XM); - - // XXX: magic numbers. should be a percent of gravity - // gravity is (by default) -0.1f - physic.set_acceleration_y(12 + 1*xr); - -#if 0 - // To slow down x-vel when flapping (not working) - if (fabsf(physic.get_velocity_x()) > MAX_WALK_XM) - { - if (physic.get_velocity_x() < 0) - physic.set_acceleration_x(1.0f); - else if (physic.get_velocity_x() > 0) - physic.set_acceleration_x(-1.0f); - } -#endif - } - } else { - physic.set_acceleration_y(0); - } - } -#endif /* In case the player has pressed Down while in a certain range of air, enable butt jump action */ @@ -548,7 +456,15 @@ void Player::handle_input() { /* Handle horizontal movement: */ - handle_horizontal_input(); + if (!backflipping) handle_horizontal_input(); + else { + if (backflip_direction == 0) { + dir == LEFT ? backflip_direction = 1 : backflip_direction = -1; + } + else backflip_direction == 1 ? dir = LEFT : dir = RIGHT; //prevent player from changing direction when backflipping + if (backflip_timer.check()) physic.set_velocity_x(100 * backflip_direction); + } + /* Jump/jumping? */ if (on_ground() && !controller->hold(Controller::JUMP)) @@ -606,6 +522,12 @@ Player::set_bonus(BonusType type, bool animate) } void +Player::kick() +{ + kick_timer.start(KICK_TIME); +} + +void Player::draw(DrawingContext& context) { TuxBodyParts* tux_body; @@ -753,30 +675,33 @@ Player::draw(DrawingContext& context) } } +void +Player::collision_tile(uint32_t tile_attributes) +{ + if(tile_attributes & Tile::HURTS) + kill(SHRINK); +} + HitResponse Player::collision(GameObject& other, const CollisionHit& hit) { - Portable* portable = dynamic_cast (&other); - if(portable && grabbed_object == 0 && controller->hold(Controller::ACTION) - && fabsf(hit.normal.x) > .9) { - grabbed_object = portable; - return CONTINUE; + Bullet* bullet = dynamic_cast (&other); + if(bullet) { + return FORCE_MOVE; + } + + if(other.get_flags() & FLAG_PORTABLE) { + Portable* portable = dynamic_cast (&other); + if(portable && grabbed_object == 0 && controller->hold(Controller::ACTION) + && fabsf(hit.normal.x) > .9) { + grabbed_object = portable; + return CONTINUE; + } } if(other.get_flags() & FLAG_SOLID) { - TileMap* tilemap = dynamic_cast (&other); - if(tilemap) { - const TilemapCollisionHit* thit = - static_cast (&hit); - if(thit->tileflags & Tile::SPIKE) - kill(SHRINK); - - if(! (thit->tileflags & Tile::SOLID)) - return FORCE_MOVE; - } - if(hit.normal.y < 0) { // landed on floor? - if (physic.get_velocity_y() < 0) + if(physic.get_velocity_y() < 0) physic.set_velocity_y(0); on_ground_flag = true; } else if(hit.normal.y > 0) { // bumped against the roof @@ -794,9 +719,18 @@ Player::collision(GameObject& other, const CollisionHit& hit) if(trigger) { if(controller->pressed(Controller::UP)) trigger->event(*this, TriggerBase::EVENT_ACTIVATE); + + return FORCE_MOVE; } - return FORCE_MOVE; + MovingObject* moving_object = static_cast (&other); + if(moving_object->get_group() == COLGROUP_TOUCHABLE) + return FORCE_MOVE; + + if(is_invincible()) + return FORCE_MOVE; + + return CONTINUE; } void @@ -848,7 +782,7 @@ Player::kill(HurtMode mode) player_status->bonus = NO_BONUS; dying = true; dying_timer.start(3.0); - flags |= FLAG_NO_COLLDET; + set_group(COLGROUP_DISABLED); } } @@ -913,10 +847,6 @@ Player::check_bounds(Camera* camera) void Player::bounce(BadGuy& ) { - //Make sure we stopped flapping - flapping = false; - falling_from_flap = false; - if(controller->hold(Controller::JUMP)) physic.set_velocity_y(520); else