X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fobject%2Fplayer.cpp;h=4db9d11a6c0f5065e43350d34ae6ac41dc848ad2;hb=08813a74da6ac1fd045a105e4e8105f1d7f716f0;hp=d09b97fca1b99ceade0720b6ffb068a6f2117adb;hpb=f406067af6cbeb0a638078fe1d386d092583909c;p=supertux.git diff --git a/src/object/player.cpp b/src/object/player.cpp index d09b97fca..4db9d11a6 100644 --- a/src/object/player.cpp +++ b/src/object/player.cpp @@ -1,5 +1,3 @@ -// $Id$ -// // SuperTux // Copyright (C) 2006 Matthias Braun // @@ -16,115 +14,107 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -#include -#include "player.hpp" +#include "object/player.hpp" #include "audio/sound_manager.hpp" #include "badguy/badguy.hpp" -#include "control/codecontroller.hpp" #include "control/joystickkeyboardcontroller.hpp" -#include "display_effect.hpp" -#include "log.hpp" -#include "falling_coin.hpp" -#include "game_session.hpp" -#include "gettext.hpp" -#include "main.hpp" +#include "math/random_generator.hpp" #include "object/bullet.hpp" #include "object/camera.hpp" +#include "object/display_effect.hpp" +#include "object/falling_coin.hpp" +#include "object/particles.hpp" #include "object/portable.hpp" #include "object/sprite_particle.hpp" -#include "object/tilemap.hpp" -#include "particles.hpp" -#include "player_status.hpp" -#include "random_generator.hpp" -#include "sector.hpp" #include "scripting/squirrel_util.hpp" -#include "sprite/sprite.hpp" -#include "sprite/sprite_manager.hpp" -#include "tile.hpp" +#include "supertux/game_session.hpp" +#include "supertux/main.hpp" +#include "supertux/sector.hpp" +#include "supertux/tile.hpp" #include "trigger/climbable.hpp" -#include #include -#include -#include //#define SWIMMING namespace { - static const int TILES_FOR_BUTTJUMP = 3; - static const float BUTTJUMP_MIN_VELOCITY_Y = 400.0f; - static const float SHOOTING_TIME = .150f; - - /** number of idle stages, including standing */ - static const unsigned int IDLE_STAGE_COUNT = 5; - /** - * how long to play each idle animation in milliseconds - * '0' means the sprite action is played once before moving onto the next - * animation - */ - static const int IDLE_TIME[] = { 5000, 0, 2500, 0, 2500 }; - /** idle stages */ - static const std::string IDLE_STAGES[] = - { "stand", - "idle", - "stand", - "idle", - "stand" }; - - /** 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 */ - 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 velocity (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; - - /** multiplied by WALK_ACCELERATION to give friction */ - static const float NORMAL_FRICTION_MULTIPLIER = 1.5f; - /** multiplied by WALK_ACCELERATION to give friction */ - static const float ICE_FRICTION_MULTIPLIER = 0.1f; - static const float ICE_ACCELERATION_MULTIPLIER = 0.25f; - - /** 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; - - /** if Tux cannot unduck for this long, he will get hurt */ - static const float UNDUCK_HURT_TIME = 0.25f; - /** gravity is higher after the jump key is released before - the apex of the jump is reached */ - static const float JUMP_EARLY_APEX_FACTOR = 3.0; - - static const float JUMP_GRACE_TIME = 0.25f; /**< time before hitting the ground that the jump button may be pressed (and still trigger a jump) */ - - bool no_water = true; +static const int TILES_FOR_BUTTJUMP = 3; +static const float BUTTJUMP_MIN_VELOCITY_Y = 400.0f; +static const float SHOOTING_TIME = .150f; + +/** number of idle stages, including standing */ +static const unsigned int IDLE_STAGE_COUNT = 5; +/** + * how long to play each idle animation in milliseconds + * '0' means the sprite action is played once before moving onto the next + * animation + */ +static const int IDLE_TIME[] = { 5000, 0, 2500, 0, 2500 }; +/** idle stages */ +static const std::string IDLE_STAGES[] = +{ "stand", + "idle", + "stand", + "idle", + "stand" }; + +/** 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 */ +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 velocity (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; + +/** multiplied by WALK_ACCELERATION to give friction */ +static const float NORMAL_FRICTION_MULTIPLIER = 1.5f; +/** multiplied by WALK_ACCELERATION to give friction */ +static const float ICE_FRICTION_MULTIPLIER = 0.1f; +static const float ICE_ACCELERATION_MULTIPLIER = 0.25f; + +/** 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; + +/** if Tux cannot unduck for this long, he will get hurt */ +static const float UNDUCK_HURT_TIME = 0.25f; +/** gravity is higher after the jump key is released before + the apex of the jump is reached */ +static const float JUMP_EARLY_APEX_FACTOR = 3.0; + +static const float JUMP_GRACE_TIME = 0.25f; /**< time before hitting the ground that the jump button may be pressed (and still trigger a jump) */ + +bool no_water = true; } -Player::Player(PlayerStatus* _player_status, const std::string& name) - : scripting_controller(0), - player_status(_player_status), - scripting_controller_old(0), - grabbed_object(NULL), ghost_mode(false), edit_mode(false), idle_stage(0), - climbing(0) +Player::Player(PlayerStatus* _player_status, const std::string& name) : + scripting_controller(0), + player_status(_player_status), + scripting_controller_old(0), + grabbed_object(NULL), + ghost_mode(false), + edit_mode(false), + idle_stage(0), + climbing(0) { this->name = name; - controller = main_controller; - scripting_controller = new CodeController(); + controller = g_main_controller; + scripting_controller.reset(new CodeController()); sprite = sprite_manager->create("images/creatures/tux/tux.sprite"); airarrow.reset(new Surface("images/engine/hud/airarrow.png")); idle_timer.start(IDLE_TIME[0]/1000.0f); @@ -143,8 +133,6 @@ Player::Player(PlayerStatus* _player_status, const std::string& name) Player::~Player() { if (climbing) stop_climbing(*climbing); - delete sprite; - delete scripting_controller; } void @@ -227,11 +215,11 @@ Player::set_controller(Controller* controller) void Player::use_scripting_controller(bool use_or_release) { - if ((use_or_release == true) && (controller != scripting_controller)) { + if ((use_or_release == true) && (controller != scripting_controller.get())) { scripting_controller_old = get_controller(); - set_controller(scripting_controller); + set_controller(scripting_controller.get()); } - if ((use_or_release == false) && (controller == scripting_controller)) { + if ((use_or_release == false) && (controller == scripting_controller.get())) { set_controller(scripting_controller_old); scripting_controller_old = 0; } @@ -373,12 +361,12 @@ Player::update(float elapsed_time) Vector pspeed = Vector(0, 0); Vector paccel = Vector(0, 0); 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 - (size_t(game_time*20)%2) ? "small" : "medium" - : - "dark", ppos, ANCHOR_MIDDLE, pspeed, paccel, LAYER_OBJECTS+1+5)); + // 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 + (size_t(game_time*20)%2) ? "small" : "medium" + : + "dark", ppos, ANCHOR_MIDDLE, pspeed, paccel, LAYER_OBJECTS+1+5)); } } @@ -476,8 +464,8 @@ Player::handle_horizontal_input() //Check speedlimit. if( speedlimit > 0 && vx * dirsign >= speedlimit ) { - vx = dirsign * speedlimit; - ax = 0; + vx = dirsign * speedlimit; + ax = 0; } // changing directions? @@ -603,21 +591,23 @@ Player::do_jump(float yspeed) { } void -Player::early_jump_apex() { - if(jump_early_apex) { - return; +Player::early_jump_apex() +{ + if (!jump_early_apex) + { + jump_early_apex = true; + physic.set_gravity_modifier(JUMP_EARLY_APEX_FACTOR); } - jump_early_apex = true; - physic.set_gravity(physic.get_gravity() * JUMP_EARLY_APEX_FACTOR); -}; +} void -Player::do_jump_apex() { - if(!jump_early_apex) { - return; +Player::do_jump_apex() +{ + if (jump_early_apex) + { + jump_early_apex = false; + physic.set_gravity_modifier(1.0f); } - jump_early_apex = false; - physic.set_gravity(physic.get_gravity() / JUMP_EARLY_APEX_FACTOR); } void @@ -629,7 +619,16 @@ 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))) do_jump(-300); else do_backflip(); + if ((physic.get_velocity_x() != 0) || + (controller->hold(Controller::LEFT)) || + (controller->hold(Controller::RIGHT))) + { + do_jump(-300); + } + else + { + do_backflip(); + } } else { // jump a bit higher if we are running; else do a normal jump if (fabs(physic.get_velocity_x()) > MAX_WALK_XM) do_jump(-580); else do_jump(-520); @@ -736,8 +735,8 @@ Player::handle_input() if(!controller->hold(Controller::ACTION) && grabbed_object) { // move the grabbed object a bit away from tux Vector pos = get_pos() + - Vector(dir == LEFT ? -bbox.get_width()-1 : bbox.get_width()+1, - bbox.get_height()*0.66666 - 32); + Vector(dir == LEFT ? -bbox.get_width()-1 : bbox.get_width()+1, + bbox.get_height()*0.66666 - 32); Rect dest(pos, pos + Vector(32, 32)); if(Sector::current()->is_free_of_movingstatics(dest)) { MovingObject* moving_object = dynamic_cast (grabbed_object); @@ -760,8 +759,8 @@ void Player::try_grab() { if(controller->hold(Controller::ACTION) && !grabbed_object - && !duck) { - Sector* sector = Sector::current(); + && !duck) { + Sector* sector = Sector::current(); Vector pos; if(dir == LEFT) { pos = Vector(bbox.get_left() - 5, bbox.get_bottom() - 16); @@ -1020,7 +1019,7 @@ Player::draw(DrawingContext& context) else if (idle_timer.check() || (IDLE_TIME[idle_stage] == 0 && sprite->animation_done())) { idle_stage++; if (idle_stage >= IDLE_STAGE_COUNT) - idle_stage = 1; + idle_stage = 1; idle_timer.start(IDLE_TIME[idle_stage]/1000.0f); @@ -1038,16 +1037,15 @@ Player::draw(DrawingContext& context) } } - -/* + /* // Tux is holding something if ((grabbed_object != 0 && physic.get_velocity_y() == 0) || - (shooting_timer.get_timeleft() > 0 && !shooting_timer.check())) { - if (duck) { - } else { - } + (shooting_timer.get_timeleft() > 0 && !shooting_timer.check())) { + if (duck) { + } else { + } } -*/ + */ /* Draw Tux */ if (safe_timer.started() && size_t(game_time*40)%2) @@ -1102,15 +1100,15 @@ Player::collision_solid(const CollisionHit& hit) physic.set_velocity_y(-300); on_ground_flag = false; Sector::current()->add_object(new Particles( - Vector(get_bbox().p2.x, get_bbox().p2.y), - 270+20, 270+40, - Vector(280, -260), Vector(0, 300), 3, Color(.4f, .4f, .4f), 3, .8f, - LAYER_OBJECTS+1)); + Vector(get_bbox().p2.x, get_bbox().p2.y), + 270+20, 270+40, + Vector(280, -260), Vector(0, 300), 3, Color(.4f, .4f, .4f), 3, .8f, + LAYER_OBJECTS+1)); Sector::current()->add_object(new Particles( - Vector(get_bbox().p1.x, get_bbox().p2.y), - 90-40, 90-20, - Vector(280, -260), Vector(0, 300), 3, Color(.4f, .4f, .4f), 3, .8f, - LAYER_OBJECTS+1)); + Vector(get_bbox().p1.x, get_bbox().p2.y), + 90-40, 90-20, + Vector(280, -260), Vector(0, 300), 3, Color(.4f, .4f, .4f), 3, .8f, + LAYER_OBJECTS+1)); } } else if(hit.top) { @@ -1196,7 +1194,7 @@ Player::kill(bool completely) if(!completely && is_big()) { if(player_status->bonus == FIRE_BONUS - || player_status->bonus == ICE_BONUS) { + || player_status->bonus == ICE_BONUS) { safe_timer.start(TUX_SAFE_TIME); set_bonus(GROWUP_BONUS, true); } else if(player_status->bonus == GROWUP_BONUS) { @@ -1224,8 +1222,8 @@ Player::kill(bool completely) { // the numbers: starting x, starting y, velocity y Sector::current()->add_object(new FallingCoin(get_pos() + - Vector(systemRandom.rand(5), systemRandom.rand(-32,18)), - systemRandom.rand(-100,100))); + Vector(systemRandom.rand(5), systemRandom.rand(-32,18)), + systemRandom.rand(-100,100))); } player_status->coins -= std::max(player_status->coins/10, 25); } @@ -1292,8 +1290,8 @@ Player::check_bounds(Camera* camera) if(get_pos().x >= camera->get_translation().x + SCREEN_WIDTH - bbox.get_width()) { set_pos(Vector( - camera->get_translation().x + SCREEN_WIDTH - bbox.get_width(), - get_pos().y)); + camera->get_translation().x + SCREEN_WIDTH - bbox.get_width(), + get_pos().y)); } } @@ -1380,7 +1378,6 @@ Player::set_ghost_mode(bool enable) } } - void Player::set_edit_mode(bool enable) { @@ -1461,4 +1458,4 @@ Player::handle_input_climbing() physic.set_acceleration(0, 0); } - +/* EOF */