X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fobject%2Fplayer.cpp;h=ab375d7e0dde3462ce5b4bcbdf6cb64b30f97b73;hb=2372988b5c58303f17720945e14d48c7aebc95ee;hp=a408975362b84d9b3d12e4b69ad0157ff107289f;hpb=de8c2e6fde4e326e3833e38ba71c87620fc51b28;p=supertux.git diff --git a/src/object/player.cpp b/src/object/player.cpp index a40897536..ab375d7e0 100644 --- a/src/object/player.cpp +++ b/src/object/player.cpp @@ -19,7 +19,7 @@ #include "audio/sound_manager.hpp" #include "badguy/badguy.hpp" -#include "control/joystickkeyboardcontroller.hpp" +#include "control/input_manager.hpp" #include "math/random_generator.hpp" #include "object/bullet.hpp" #include "object/camera.hpp" @@ -63,7 +63,7 @@ static const std::string IDLE_STAGES[] = /** acceleration in horizontal direction when walking * (all accelerations are in pixel/s^2) */ static const float WALK_ACCELERATION_X = 300; -/** acceleration in horizontal direction when running */ +/** acceleration in horizontal direction when running */ static const float RUN_ACCELERATION_X = 400; /** acceleration when skidding */ static const float SKID_XM = 200; @@ -109,14 +109,15 @@ static const float DUCKED_TUX_HEIGHT = 31.8f; bool no_water = true; } -Player::Player(PlayerStatus* _player_status, const std::string& name) : +Player::Player(PlayerStatus* _player_status, const std::string& name_) : deactivated(), controller(), - scripting_controller(0), - player_status(_player_status), + scripting_controller(), + player_status(_player_status), duck(), dead(), dying(), + winning(), backflipping(), backflip_direction(), peekingX(), @@ -134,7 +135,7 @@ Player::Player(PlayerStatus* _player_status, const std::string& name) : on_ground_flag(), jumping(), can_jump(), - jump_button_timer(), + jump_button_timer(), wants_buttjump(), does_buttjump(), invincible_timer(), @@ -147,35 +148,35 @@ Player::Player(PlayerStatus* _player_status, const std::string& name) : backflip_timer(), physic(), visible(), - grabbed_object(NULL), + grabbed_object(NULL), sprite(), airarrow(), floor_normal(), - ghost_mode(false), - edit_mode(false), + ghost_mode(false), + edit_mode(false), unduck_hurt_timer(), idle_timer(), idle_stage(0), climbing(0) { - this->name = name; - controller = g_jk_controller->get_main_controller(); + this->name = name_; + controller = InputManager::current()->get_controller(); scripting_controller.reset(new CodeController()); // if/when we have complete penny gfx, we can // load those instead of Tux's sprite in the // constructor - sprite = sprite_manager->create("images/creatures/tux/tux.sprite"); + sprite = SpriteManager::current()->create("images/creatures/tux/tux.sprite"); airarrow = Surface::create("images/engine/hud/airarrow.png"); idle_timer.start(IDLE_TIME[0]/1000.0f); - sound_manager->preload("sounds/bigjump.wav"); - sound_manager->preload("sounds/jump.wav"); - sound_manager->preload("sounds/hurt.wav"); - sound_manager->preload("sounds/kill.wav"); - sound_manager->preload("sounds/skid.wav"); - sound_manager->preload("sounds/flip.wav"); - sound_manager->preload("sounds/invincible_start.ogg"); - sound_manager->preload("sounds/splash.ogg"); + SoundManager::current()->preload("sounds/bigjump.wav"); + SoundManager::current()->preload("sounds/jump.wav"); + SoundManager::current()->preload("sounds/hurt.wav"); + SoundManager::current()->preload("sounds/kill.wav"); + SoundManager::current()->preload("sounds/skid.wav"); + SoundManager::current()->preload("sounds/flip.wav"); + SoundManager::current()->preload("sounds/invincible_start.ogg"); + SoundManager::current()->preload("sounds/splash.ogg"); init(); } @@ -213,6 +214,7 @@ Player::init() deactivated = false; backflipping = false; backflip_direction = 0; + sprite->set_angle(0.0f); visible = true; swimming = false; on_ice = false; @@ -258,9 +260,9 @@ Player::set_speedlimit(float newlimit) } void -Player::set_controller(Controller* controller) +Player::set_controller(Controller* controller_) { - this->controller = controller; + this->controller = controller_; } void @@ -272,7 +274,7 @@ Player::set_winning() } } -void +void Player::use_scripting_controller(bool use_or_release) { if ((use_or_release == true) && (controller != scripting_controller.get())) { @@ -285,7 +287,7 @@ Player::use_scripting_controller(bool use_or_release) } } -void +void Player::do_scripting_controller(std::string control, bool pressed) { for(int i = 0; Controller::controlNames[i] != 0; ++i) { @@ -323,6 +325,7 @@ Player::trigger_sequence(std::string sequence_name) if (climbing) stop_climbing(*climbing); backflipping = false; backflip_direction = 0; + sprite->set_angle(0.0f); GameSession::current()->start_sequence(sequence_name); } @@ -343,9 +346,11 @@ Player::update(float elapsed_time) if(!dying && !deactivated) handle_input(); +/* // handle_input() calls apply_friction() when Tux is not walking, so we'll have to do this ourselves if (deactivated) apply_friction(); +*/ // extend/shrink tux collision rectangle so that we fall through/walk over 1 // tile holes @@ -365,10 +370,12 @@ Player::update(float elapsed_time) } // handle backflipping - if (backflipping) { + if (backflipping && !dying) { //prevent player from changing direction when backflipping dir = (backflip_direction == 1) ? LEFT : RIGHT; if (backflip_timer.started()) physic.set_velocity_x(100 * backflip_direction); + //rotate sprite during flip + sprite->set_angle(sprite->get_angle() + (dir==LEFT?1:-1) * elapsed_time * (360.0f / 0.5f)); } // set fall mode... @@ -388,6 +395,7 @@ Player::update(float elapsed_time) if (backflipping && (backflip_timer.get_timegone() > 0.15f)) { backflipping = false; backflip_direction = 0; + sprite->set_angle(0.0f); // if controls are currently deactivated, we take care of standing up ourselves if (deactivated) @@ -422,7 +430,7 @@ Player::update(float elapsed_time) Vector ppos = Vector(px, py); Vector pspeed = Vector(0, 0); Vector paccel = Vector(0, 0); - Sector::current()->add_object(new SpriteParticle("images/objects/particles/sparkle.sprite", + Sector::current()->add_object(new SpriteParticle("images/objects/particles/sparkle.sprite", // draw bright sparkle when there is lots of time left, dark sparkle when invincibility is about to end (invincible_timer.get_timeleft() > TUX_INVINCIBLE_TIME_WARNING) ? // make every other a longer sparkle to make trail a bit fuzzy @@ -542,7 +550,7 @@ Player::handle_horizontal_input() // let's skid! if(fabs(vx)>SKID_XM && !skidding_timer.started()) { skidding_timer.start(SKID_TIME); - sound_manager->play("sounds/skid.wav"); + SoundManager::current()->play("sounds/skid.wav"); // dust some particles Sector::current()->add_object( new Particles( @@ -636,7 +644,7 @@ Player::do_backflip() { backflip_direction = (dir == LEFT)?(+1):(-1); backflipping = true; do_jump(-580); - sound_manager->play("sounds/flip.wav"); + SoundManager::current()->play("sounds/flip.wav"); backflip_timer.start(TUX_BACKFLIP_TIME); } @@ -653,14 +661,14 @@ Player::do_jump(float yspeed) { // play sound if (is_big()) { - sound_manager->play("sounds/bigjump.wav"); + SoundManager::current()->play("sounds/bigjump.wav"); } else { - sound_manager->play("sounds/jump.wav"); + SoundManager::current()->play("sounds/jump.wav"); } } void -Player::early_jump_apex() +Player::early_jump_apex() { if (!jump_early_apex) { @@ -688,13 +696,13 @@ Player::handle_vertical_input() jump_button_timer.stop(); if (duck) { // when running, only jump a little bit; else do a backflip - if ((physic.get_velocity_x() != 0) || - (controller->hold(Controller::LEFT)) || - (controller->hold(Controller::RIGHT))) + if ((physic.get_velocity_x() != 0) || + (controller->hold(Controller::LEFT)) || + (controller->hold(Controller::RIGHT))) { do_jump(-300); } - else + else { do_backflip(); } @@ -807,18 +815,18 @@ Player::handle_input() if(moving_object) { // move the grabbed object a bit away from tux Rectf grabbed_bbox = moving_object->get_bbox(); - Rectf dest; - dest.p2.y = bbox.get_top() + bbox.get_height()*0.66666; - dest.p1.y = dest.p2.y - grabbed_bbox.get_height(); + Rectf dest_; + dest_.p2.y = bbox.get_top() + bbox.get_height()*0.66666; + dest_.p1.y = dest_.p2.y - grabbed_bbox.get_height(); if(dir == LEFT) { - dest.p2.x = bbox.get_left() - 1; - dest.p1.x = dest.p2.x - grabbed_bbox.get_width(); + dest_.p2.x = bbox.get_left() - 1; + dest_.p1.x = dest_.p2.x - grabbed_bbox.get_width(); } else { - dest.p1.x = bbox.get_right() + 1; - dest.p2.x = dest.p1.x + grabbed_bbox.get_width(); + dest_.p1.x = bbox.get_right() + 1; + dest_.p2.x = dest_.p1.x + grabbed_bbox.get_width(); } - if(Sector::current()->is_free_of_tiles(dest, true)) { - moving_object->set_pos(dest.p1); + if(Sector::current()->is_free_of_tiles(dest_, true)) { + moving_object->set_pos(dest_.p1); if(controller->hold(Controller::UP)) { grabbed_object->ungrab(*this, UP); } else { @@ -835,6 +843,7 @@ Player::handle_input() if( backflipping && ( !controller->hold(Controller::JUMP) && !backflip_timer.started()) ){ backflipping = false; backflip_direction = 0; + sprite->set_angle(0.0f); } } @@ -1025,10 +1034,10 @@ Player::set_bonus(BonusType type, bool animate) } void -Player::set_visible(bool visible) +Player::set_visible(bool visible_) { - this->visible = visible; - if( visible ) + this->visible = visible_; + if( visible_ ) set_group(COLGROUP_MOVING); else set_group(COLGROUP_DISABLED); @@ -1176,7 +1185,7 @@ Player::collision_tile(uint32_t tile_attributes) if( tile_attributes & Tile::WATER ){ swimming = true; no_water = false; - sound_manager->play( "sounds/splash.ogg" ); + SoundManager::current()->play( "sounds/splash.ogg" ); } } #endif @@ -1197,7 +1206,7 @@ Player::collision_solid(const CollisionHit& hit) on_ground_flag = true; floor_normal = hit.slope_normal; - // Butt Jump landed + // Butt Jump landed if (does_buttjump) { does_buttjump = false; physic.set_velocity_y(-300); @@ -1276,7 +1285,7 @@ Player::collision(GameObject& other, const CollisionHit& hit) void Player::make_invincible() { - sound_manager->play("sounds/invincible_start.ogg"); + SoundManager::current()->play("sounds/invincible_start.ogg"); invincible_timer.start(TUX_INVINCIBLE_TIME); Sector::current()->play_music(HERRING_MUSIC); } @@ -1298,7 +1307,7 @@ Player::kill(bool completely) physic.set_velocity_x(0); if(!completely && is_big()) { - sound_manager->play("sounds/hurt.wav"); + SoundManager::current()->play("sounds/hurt.wav"); if(player_status->bonus == FIRE_BONUS || player_status->bonus == ICE_BONUS) { @@ -1309,6 +1318,7 @@ Player::kill(bool completely) adjust_height(SMALL_TUX_HEIGHT); duck = false; backflipping = false; + sprite->set_angle(0.0f); set_bonus(NO_BONUS, true); } else if(player_status->bonus == NO_BONUS) { safe_timer.start(TUX_SAFE_TIME); @@ -1316,7 +1326,7 @@ Player::kill(bool completely) duck = false; } } else { - sound_manager->play("sounds/kill.wav"); + SoundManager::current()->play("sounds/kill.wav"); // do not die when in edit mode if (edit_mode) { @@ -1352,7 +1362,7 @@ Player::kill(bool completely) // TODO: need nice way to handle players dying in co-op mode Sector::current()->effect->fade_out(3.0); - sound_manager->stop_music(3.0); + SoundManager::current()->stop_music(3.0); } } @@ -1368,6 +1378,7 @@ Player::move(const Vector& vector) set_size(TUX_WIDTH, SMALL_TUX_HEIGHT); duck = false; backflipping = false; + sprite->set_angle(0.0f); last_ground_y = vector.y; if (climbing) stop_climbing(*climbing); @@ -1416,7 +1427,7 @@ Player::add_velocity(const Vector& velocity, const Vector& end_speed) physic.set_velocity_y(std::max(physic.get_velocity_y() + velocity.y, end_speed.y)); } -Vector +Vector Player::get_velocity() { return physic.get_velocity(); @@ -1459,6 +1470,11 @@ void Player::walk(float speed) physic.set_velocity_x(speed); } +void Player::set_dir(bool right) +{ + dir = right ? RIGHT : LEFT; +} + void Player::set_ghost_mode(bool enable) { @@ -1486,7 +1502,7 @@ Player::set_edit_mode(bool enable) edit_mode = enable; } -void +void Player::start_climbing(Climbable& climbable) { if (climbing || !&climbable) return; @@ -1498,17 +1514,18 @@ Player::start_climbing(Climbable& climbable) if (backflipping) { backflipping = false; backflip_direction = 0; + sprite->set_angle(0.0f); } } -void +void Player::stop_climbing(Climbable& /*climbable*/) { if (!climbing) return; climbing = 0; - if (grabbed_object) { + if (grabbed_object) { grabbed_object->ungrab(*this, dir); grabbed_object = NULL; } @@ -1552,7 +1569,7 @@ Player::handle_input_climbing() if (can_jump) { stop_climbing(*climbing); return; - } + } } else { can_jump = true; }