X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fplayer.cpp;h=6608f8c48dc836242c3e7284ef48e3d6b7cc2311;hb=6e843b1780f62f45b7021bd8c38181aa211588ee;hp=fa9d84a6619c06ce1c4c4a196c537667fae80eb3;hpb=7981f4c11e7e98eadfc331cc3b59e28e7a9e6e8f;p=supertux.git diff --git a/src/player.cpp b/src/player.cpp index fa9d84a66..6608f8c48 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -40,13 +40,18 @@ #include "gameloop.h" #include "trigger/trigger_base.h" -// behavior definitions: -#define TILES_FOR_BUTTJUMP 3 -// animation times (in ms): -#define SHOOTING_TIME .150 - -// time before idle animation starts -#define IDLE_TIME 2.500 +static const int TILES_FOR_BUTTJUMP = 3; +static const float SHOOTING_TIME = .150; +/// time before idle animation starts +static const float IDLE_TIME = 2.5; + +static const float WALK_ACCELERATION_X = 300; +static const float RUN_ACCELERATION_X = 400; +static const float SKID_XM = 200; +static const float SKID_TIME = .3; +static const float MAX_WALK_XM = 230; +static const float MAX_RUN_XM = 320; +static const float WALK_SPEED = 100; // growing animation Surface* growingtux_left[GROWING_FRAMES]; @@ -73,7 +78,7 @@ PlayerKeymap::PlayerKeymap() keymap.right = SDLK_RIGHT; keymap.power = SDLK_LCTRL; - keymap.jump = SDLK_LALT; + keymap.jump = SDLK_SPACE; } void player_input_init(player_input_type* pplayer_input) @@ -91,29 +96,16 @@ void player_input_init(player_input_type* pplayer_input) } void -TuxBodyParts::set_action(std::string action) -{ - if(head != NULL) - head->set_action(action); - if(body != NULL) - body->set_action(action); - if(arms != NULL) - arms->set_action(action); - if(feet != NULL) - feet->set_action(action); -} - -void -TuxBodyParts::one_time_animation() +TuxBodyParts::set_action(std::string action, int loops) { if(head != NULL) - head->start_animation(1); + head->set_action(action, loops); if(body != NULL) - body->start_animation(1); + body->set_action(action, loops); if(arms != NULL) - arms->start_animation(1); + arms->set_action(action, loops); if(feet != NULL) - feet->start_animation(1); + feet->set_action(action, loops); } void @@ -144,7 +136,7 @@ Player::init() { holding_something = false; - bbox.set_size(32, 32); + bbox.set_size(31.8, 31.8); size = SMALL; got_power = NONE_POWER; @@ -175,13 +167,8 @@ Player::init() on_ground_flag = false; - frame_main = 0; - frame_ = 0; - player_input_init(&input); - frame_timer.start(.025, true); - physic.reset(); } @@ -363,12 +350,13 @@ Player::handle_horizontal_input() skidding_timer.start(SKID_TIME); SoundManager::get()->play_sound(IDToSound(SND_SKID)); // dust some partcles - Sector::current()->add_particles( - Vector(bbox.p1.x + (dir == RIGHT ? bbox.get_width() : 0), + Sector::current()->add_object( + new Particles( + Vector(bbox.p1.x + (dir == RIGHT ? bbox.get_width() : 0), 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, 800, - LAYER_OBJECTS+1); + Vector(280,-260), Vector(0,0.030), 3, Color(100,100,100), 3, .8, + LAYER_OBJECTS+1)); ax *= 2.5; } @@ -405,6 +393,14 @@ Player::handle_horizontal_input() } #endif + // extend/shrink tux collision rectangle so that we fall through/walk over 1 + // tile holes + if(fabsf(vx) > MAX_WALK_XM) { + bbox.set_width(33); + } else { + bbox.set_width(31.8); + } + physic.set_velocity(vx, vy); physic.set_acceleration(ax, ay); } @@ -423,6 +419,17 @@ Player::handle_vertical_input() fall_mode = JUMPING; } + if(on_ground()) { /* Make sure jumping is off. */ + jumping = false; + flapping = false; + falling_from_flap = false; + if (flapping_timer.started()) { + flapping_timer.start(0); + } + + physic.set_acceleration_y(0); //for flapping + } + // Press jump key if(input.jump == DOWN && can_jump && on_ground()) { @@ -456,7 +463,6 @@ Player::handle_vertical_input() } if (jumping && physic.get_velocity_y() > 0) { - printf("jumpend.\n"); jumping = false; physic.set_velocity_y(0); } @@ -638,18 +644,6 @@ Player::handle_vertical_input() } #endif - if(on_ground()) /* Make sure jumping is off. */ - { - jumping = false; - flapping = false; - falling_from_flap = false; - if (flapping_timer.started()) { - flapping_timer.start(0); - } - - physic.set_acceleration_y(0); //for flapping - } - input.old_jump = input.jump; } @@ -673,41 +667,19 @@ Player::handle_input() input.old_fire = DOWN; } -#if 0 - /* tux animations: */ - if(frame_timer.check()) { - if (input.right == UP && input.left == UP) - { - frame_main = 1; - frame_ = 1; - } - else - { - if ((input.fire == DOWN && (global_frame_counter % 2) == 0) || - (global_frame_counter % 4) == 0) - frame_main = (frame_main + 1) % 4; - - frame_ = frame_main; - - if (frame_ == 3) - frame_ = 1; - } - } -#endif - /* Duck! */ if (input.down == DOWN && size == BIG && !duck && physic.get_velocity_y() == 0 && on_ground()) { duck = true; bbox.move(Vector(0, 32)); - bbox.set_height(32); + bbox.set_height(31.8); } else if(input.down == UP && size == BIG && duck) { // try if we can really unduck bbox.move(Vector(0, -32)); - bbox.set_height(64); + bbox.set_height(63.8); duck = false; // FIXME #if 0 @@ -717,7 +689,7 @@ Player::handle_input() } else { // undo the ducking changes bbox.move(Vector(0, 32)); - bbox.set_height(32); + bbox.set_height(31.8); } #endif } @@ -730,7 +702,7 @@ Player::grow(bool animate) return; size = BIG; - bbox.set_height(64); + bbox.set_height(63.8); bbox.move(Vector(0, -32)); if(animate) @@ -756,7 +728,7 @@ Player::draw(DrawingContext& context) else tux_body = big_tux; - int layer = LAYER_OBJECTS - 1; + int layer = LAYER_OBJECTS + 10; /* Set Tux sprite action */ if (duck && size == BIG) @@ -817,11 +789,9 @@ Player::draw(DrawingContext& context) if(size == BIG) { if(dir == LEFT) - tux_body->head->set_action("idle-left"); + tux_body->head->set_action("idle-left", 1); else // dir == RIGHT - tux_body->head->set_action("idle-right"); - - tux_body->head->start_animation(1); + tux_body->head->set_action("idle-right", 1); } } @@ -874,7 +844,7 @@ Player::draw(DrawingContext& context) get_pos(), layer); } } - else if (safe_timer.started() && global_frame_counter%2) + else if (safe_timer.started() && size_t(global_time*40)%2) ; // don't draw Tux else tux_body->draw(context, get_pos(), layer); @@ -882,40 +852,35 @@ Player::draw(DrawingContext& context) // Draw blinking star overlay if (invincible_timer.started() && (invincible_timer.get_timeleft() > TUX_INVINCIBLE_TIME_WARNING - || global_frame_counter % 3) + || size_t(global_time*20)%2) && !dying) { if (size == SMALL || duck) - smalltux_star->draw(context, get_pos(), LAYER_OBJECTS + 2); + smalltux_star->draw(context, get_pos(), layer + 5); else - bigtux_star->draw(context, get_pos(), LAYER_OBJECTS + 2); + bigtux_star->draw(context, get_pos(), layer + 5); } if (debug_mode) context.draw_filled_rect(get_pos(), Vector(bbox.get_width(), bbox.get_height()), - Color(75,75,75, 150), LAYER_OBJECTS+1); + Color(75,75,75, 150), LAYER_OBJECTS+20); } HitResponse Player::collision(GameObject& other, const CollisionHit& hit) { - if(dying) { - return FORCE_MOVE; - } - if(other.get_flags() & FLAG_SOLID) { if(hit.normal.y < 0) { // landed on floor? 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 - physic.set_velocity_y(0); + physic.set_velocity_y(.1); } - if(hit.normal.x != 0) { // hit on the side? - if(hit.normal.y > 0.6) // limits the slopes we can move up... - physic.set_velocity_x(0); + if(fabsf(hit.normal.x) > .9) { // hit on the side? + physic.set_velocity_x(0); } return CONTINUE; @@ -930,122 +895,6 @@ Player::collision(GameObject& other, const CollisionHit& hit) return FORCE_MOVE; } -#if 0 -void -Player::collision(void* p_c_object, int c_object) -{ - //BadGuy* pbad_c = NULL; - //Trampoline* ptramp_c = NULL; - //FlyingPlatform* pplatform_c = NULL; - - switch (c_object) - { - case CO_BADGUY: - pbad_c = (BadGuy*) p_c_object; - - /* Hurt player if he touches a badguy */ - if (!pbad_c->dying && !dying && - !safe_timer.started() && - pbad_c->mode != BadGuy::HELD) - { - if (pbad_c->mode == BadGuy::FLAT && input.fire == DOWN - && !holding_something) - { - holding_something = true; - pbad_c->mode = BadGuy::HELD; - pbad_c->base.y-=8; - } - else if (pbad_c->mode == BadGuy::FLAT) - { - // Don't get hurt if we're kicking a flat badguy! - } - else if (pbad_c->mode == BadGuy::KICK) - { - /* Hurt if you get hit by kicked laptop: */ - if (!invincible_timer.started()) - { - kill(SHRINK); - } - else - pbad_c->kill_me(20); - } - else if (!pbad_c->frozen_timer.check() && (pbad_c->kind == BAD_MRBOMB - || pbad_c->kind == BAD_JUMPY || pbad_c->kind == BAD_FISH - || pbad_c->kind == BAD_SPIKY)) - pbad_c->kill_me(20); - else - { - if (!invincible_timer.started()) - { - kill(SHRINK); - } - else - { - pbad_c->kill_me(25); - } - } - player_status.score_multiplier++; - } - break; - - case CO_TRAMPOLINE: - ptramp_c = (Trampoline*) p_c_object; - - // Pick up trampoline - if (ptramp_c->mode != Trampoline::M_HELD && input.fire == DOWN && !holding_something && on_ground()) - { - holding_something = true; - ptramp_c->mode = Trampoline::M_HELD; - ptramp_c->base.y -= 8; - } - // Set down trampoline - else if (ptramp_c->mode == Trampoline::M_HELD && input.fire != DOWN) - { - holding_something = false; - ptramp_c->mode = Trampoline::M_NORMAL; - ptramp_c->base.y += 8; - ptramp_c->physic.set_velocity(physic.get_velocity_x(), physic.get_velocity_y()); - - //if (dir == RIGHT) - // ptramp_c->base.x = base.x + base.width+1; - //else /* LEFT */ - // ptramp_c->base.x = base.x - base.width-1; - } -/* - // Don't let tux walk through trampoline - else if (ptramp_c->mode != Trampoline::M_HELD && on_ground()) - { - if (physic.get_velocity_x() > 0) // RIGHT - { - physic.set_velocity_x(0); - base.x = ptramp_c->base.x - base.width; - } - else if (physic.get_velocity_x() < 0) // LEFT - { - physic.set_velocity_x(0); - base.x = ptramp_c->base.x + ptramp_c->base.width; - } - } -*/ - break; - case CO_FLYING_PLATFORM: - pplatform_c = (FlyingPlatform*) p_c_object; - - base.y = pplatform_c->base.y - base.height; - physic.set_velocity_x(pplatform_c->get_vel_x()); - - physic.enable_gravity(false); - can_jump = true; - fall_mode = ON_GROUND; - break; - - default: - break; - } - -} -#endif - void Player::make_invincible() { @@ -1080,7 +929,7 @@ Player::kill(HurtMode mode) growing_timer.start(GROWING_TIME); safe_timer.start(TUX_SAFE_TIME + GROWING_TIME); size = SMALL; - bbox.set_height(32); + bbox.set_height(31.8); duck = false; } } @@ -1092,6 +941,7 @@ Player::kill(HurtMode mode) --player_status.lives; dying = DYING_SQUISHED; dying_timer.start(3.0); + flags |= FLAG_NO_COLLDET; } } @@ -1101,7 +951,7 @@ Player::remove_powerups() { got_power = NONE_POWER; size = SMALL; - bbox.set_height(32); + bbox.set_height(31.8); } void @@ -1154,7 +1004,7 @@ Player::check_bounds(Camera* camera) } void -Player::bounce(BadGuy& badguy) +Player::bounce(BadGuy& ) { //Make sure we stopped flapping flapping = false;