X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fplayer.cpp;h=b332caee9cc440ac279553a43ec5c54ddf9c7df0;hb=9ba388a672ff024010e38b09e576edf8730bb454;hp=5fa91de51eb6214d0616b743c4f20f9776f0f8bc;hpb=4434ccd7364d603d6bf952ff1df56e28e1978a63;p=supertux.git diff --git a/src/object/player.cpp b/src/object/player.cpp index 5fa91de51..b332caee9 100644 --- a/src/object/player.cpp +++ b/src/object/player.cpp @@ -51,25 +51,40 @@ #include "object/sprite_particle.hpp" #include "trigger/climbable.hpp" +//#define DO_SWIMMING + static const int TILES_FOR_BUTTJUMP = 3; static const float SHOOTING_TIME = .150f; /// time before idle animation starts static const float IDLE_TIME = 2.5f; +/** acceleration in horizontal direction when walking + * (all acceleratiosn are in pixel/s^2) */ static const float WALK_ACCELERATION_X = 300; +/** acceleration in horizontal direction when running */ static const float RUN_ACCELERATION_X = 400; +/** acceleration when skidding */ static const float SKID_XM = 200; +/** time of skidding in seconds */ static const float SKID_TIME = .3f; +/** maximum walk velocity (pixel/s) */ static const float MAX_WALK_XM = 230; +/** maximum run velcoity (pixel/s) */ static const float MAX_RUN_XM = 320; +/** maximum horizontal climb velocity */ static const float MAX_CLIMB_XM = 48; +/** maximum vertical climb velocity */ static const float MAX_CLIMB_YM = 128; +/** instant velocity when tux starts to walk */ static const float WALK_SPEED = 100; +/** time of the kick (kicking mriceblock) animation */ static const float KICK_TIME = .3f; +/** time of tux cheering (currently unused) */ static const float CHEER_TIME = 1.0f; -static const float UNDUCK_HURT_TIME = 0.25f; /**< if Tux cannot unduck for this long, he will get hurt */ +/** if Tux cannot unduck for this long, he will get hurt */ +static const float UNDUCK_HURT_TIME = 0.25f; // growing animation Surface* growingtux_left[GROWING_FRAMES]; @@ -99,16 +114,16 @@ TuxBodyParts::set_action(std::string action, int loops) } void -TuxBodyParts::draw(DrawingContext& context, const Vector& pos, int layer) +TuxBodyParts::draw(DrawingContext& context, const Vector& pos, int layer, Portable* grabbed_object) { if(head != NULL) - head->draw(context, pos, layer-1); + head->draw(context, pos, layer-2); if(body != NULL) - body->draw(context, pos, layer-3); + body->draw(context, pos, layer-4); if(arms != NULL) - arms->draw(context, pos, layer+10); + arms->draw(context, pos, layer-1 + (grabbed_object?10:0)); if(feet != NULL) - feet->draw(context, pos, layer-2); + feet->draw(context, pos, layer-3); } Player::Player(PlayerStatus* _player_status, const std::string& name) @@ -588,11 +603,13 @@ Player::handle_vertical_input() // swimming physic.set_acceleration_y(0); +#ifdef SWIMMING if (swimming) { if (controller->hold(Controller::UP) || controller->hold(Controller::JUMP)) physic.set_acceleration_y(-2000); physic.set_velocity_y(physic.get_velocity_y() * 0.94); } +#endif } void @@ -614,12 +631,24 @@ Player::handle_input() if( controller->released( Controller::PEEK_RIGHT ) ) { peeking = AUTO; } + if( controller->released( Controller::UP ) ) { + peeking = AUTO; + } + if( controller->released( Controller::DOWN ) ) { + peeking = AUTO; + } if( controller->pressed( Controller::PEEK_LEFT ) ) { peeking = LEFT; } if( controller->pressed( Controller::PEEK_RIGHT ) ) { peeking = RIGHT; } + if( controller->pressed( Controller::UP ) ) { + peeking = UP; + } + if( controller->pressed( Controller::DOWN ) ) { + peeking = DOWN; + } /* Handle horizontal movement: */ if (!backflipping) handle_horizontal_input(); @@ -661,9 +690,13 @@ Player::handle_input() if(moving_object) { moving_object->set_pos(pos); } else { - log_debug << "Non MovingObjetc grabbed?!?" << std::endl; + log_debug << "Non MovingObject grabbed?!?" << std::endl; + } + if(controller->hold(Controller::UP)) { + grabbed_object->ungrab(*this, UP); + } else { + grabbed_object->ungrab(*this, dir); } - grabbed_object->ungrab(*this, dir); grabbed_object = NULL; } } @@ -688,11 +721,16 @@ Player::try_grab() if(!portable->is_portable()) continue; + // make sure the Portable is a MovingObject MovingObject* moving_object = dynamic_cast (portable); - assert(portable); + assert(moving_object); if(moving_object == NULL) continue; + // make sure the Portable isn't currently non-solid + if(moving_object->get_group() == COLGROUP_DISABLED) continue; + + // check if we are within reach if(moving_object->get_bbox().contains(pos)) { if (climbing) stop_climbing(*climbing); grabbed_object = portable; @@ -988,7 +1026,7 @@ Player::draw(DrawingContext& context) else if (safe_timer.started() && size_t(game_time*40)%2) ; // don't draw Tux else - tux_body->draw(context, get_pos(), layer); + tux_body->draw(context, get_pos(), layer, grabbed_object); } @@ -998,6 +1036,7 @@ Player::collision_tile(uint32_t tile_attributes) if(tile_attributes & Tile::HURTS) kill(false); +#ifdef SWIMMING if( swimming ){ if( tile_attributes & Tile::WATER ){ no_water = false; @@ -1011,6 +1050,7 @@ Player::collision_tile(uint32_t tile_attributes) sound_manager->play( "sounds/splash.ogg" ); } } +#endif } void