X-Git-Url: https://git.octo.it/?a=blobdiff_plain;ds=sidebyside;f=src%2Fplayer.cpp;h=bb033adf27f8b414360216dada779c63e529acfd;hb=60cdeda6e1346430425b175674112c04450f4359;hp=78224e8f85387fad10e9f1d4b79b91aebda2e8be;hpb=254e33f51eab6434a2a881e7dc99aa92b668dd51;p=supertux.git diff --git a/src/player.cpp b/src/player.cpp index 78224e8f8..bb033adf2 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -67,23 +67,25 @@ PlayerKeymap keymap; PlayerKeymap::PlayerKeymap() { - keymap.jump = SDLK_SPACE; - keymap.activate = SDLK_UP; - keymap.duck = SDLK_DOWN; + keymap.up = SDLK_UP; + keymap.down = SDLK_DOWN; keymap.left = SDLK_LEFT; keymap.right = SDLK_RIGHT; - keymap.fire = SDLK_LCTRL; + + keymap.power = SDLK_LCTRL; + keymap.jump = SDLK_LALT; } void player_input_init(player_input_type* pplayer_input) { + pplayer_input->up = UP; pplayer_input->down = UP; pplayer_input->fire = UP; pplayer_input->left = UP; pplayer_input->old_fire = UP; pplayer_input->right = UP; - pplayer_input->up = UP; - pplayer_input->old_up = UP; + pplayer_input->jump = UP; + pplayer_input->old_jump = UP; pplayer_input->activate = UP; } @@ -166,6 +168,14 @@ Player::init() enable_hover = false; butt_jump = false; + flapping_velocity = 0; + + // temporary to help player's choosing a flapping + flapping_mode = MAREK_FLAP; + + // Ricardo's flapping + flaps_nb = 0; + frame_main = 0; frame_ = 0; @@ -199,38 +209,44 @@ Player::key_event(SDLKey key, int state) input.left = state; return true; } - else if(key == keymap.jump) + else if(key == keymap.up) { input.up = state; + + /* Up key also opens activates stuff */ + input.activate = state; + + if(state == DOWN) { + /** check for interactive objects */ + for(Sector::InteractiveObjects::iterator i + = Sector::current()->interactive_objects.begin(); + i != Sector::current()->interactive_objects.end(); ++i) { + if(rectcollision(base, (*i)->get_area())) { + (*i)->interaction(INTERACTION_ACTIVATE); + } + } + } + return true; } - else if(key == keymap.duck) + else if(key == keymap.down) { input.down = state; return true; } - else if(key == keymap.fire) + else if(key == keymap.power) { if (state == UP) input.old_fire = UP; input.fire = state; + return true; } - else if(key == keymap.activate) + else if(key == keymap.jump) { - input.activate = state; - - if(state == DOWN) { - /** check for interactive objects */ - for(Sector::InteractiveObjects::iterator i - = Sector::current()->interactive_objects.begin(); - i != Sector::current()->interactive_objects.end(); ++i) { - if(rectcollision(base, (*i)->get_area())) { - (*i)->interaction(INTERACTION_ACTIVATE); - } - } - } - + if (state == UP) + input.old_jump = UP; + input.jump = state; return true; } else @@ -336,12 +352,15 @@ Player::action(float elapsed_time) /* Reset score multiplier (for multi-hits): */ if (!invincible_timer.started()) { - /*if(player_status.score_multiplier > 2) - { // show a message + if(player_status.score_multiplier > player_status.max_score_multiplier) + { + player_status.max_score_multiplier = player_status.score_multiplier; + + // show a message char str[124]; - sprintf(str, _("%d bad guys in a row!"), player_status.score_multiplier-1); + sprintf(str, _("New max combo: %d"), player_status.max_score_multiplier-1); Sector::current()->add_floating_text(base, str); - }*/ + } player_status.score_multiplier = 1; } } @@ -478,15 +497,27 @@ Player::handle_horizontal_input() } // changing directions? - if(on_ground() && ((vx < 0 && dirsign >0) || (vx>0 && dirsign<0))) { - if(fabs(vx)>SKID_XM && !skidding_timer.check()) { + if(on_ground() && ((vx < 0 && dirsign >0) || (vx>0 && dirsign<0))) + { + // let's skid! + if(fabs(vx)>SKID_XM && !skidding_timer.check()) + { skidding_timer.start(SKID_TIME); SoundManager::get()->play_sound(IDToSound(SND_SKID)); + // dust some partcles + Sector::current()->add_particles( + Vector(base.x + (dir == RIGHT ? base.width : 0), base.y+base.height), + dir == RIGHT ? 270+20 : 90-40, dir == RIGHT ? 270+40 : 90-20, + Vector(2.8,-2.6), Vector(0,0.030), 3, Color(100,100,100), 3, 800, + LAYER_OBJECTS+1); + ax *= 2.5; - } else { + } + else + { ax *= 2; - } - } + } + } // we get slower when not pressing any keys if(dirsign == 0) { @@ -533,7 +564,7 @@ Player::handle_vertical_input() } // Press jump key - if(input.up == DOWN && can_jump && on_ground()) + if(input.jump == DOWN && can_jump && on_ground()) { if(duck) { // only jump a little bit when in duck mode { physic.set_velocity_y(3); @@ -550,13 +581,14 @@ Player::handle_vertical_input() flapping = false; can_jump = false; can_flap = false; + flaps_nb = 0; // Ricardo's flapping if (size == SMALL) SoundManager::get()->play_sound(IDToSound(SND_JUMP)); else SoundManager::get()->play_sound(IDToSound(SND_BIGJUMP)); } // Let go of jump key - else if(input.up == UP) + else if(input.jump == UP) { if (!flapping && !duck && !falling_from_flap && !on_ground()) { @@ -569,12 +601,28 @@ Player::handle_vertical_input() } } - // Flapping - if (input.up == DOWN && can_flap) + // temporary to help player's choosing a flapping + if(flapping_mode == RICARDO_FLAP) + { + // Flapping, Ricardo's version + // similar to SM3 Fox + if(input.jump == DOWN && input.old_jump == UP && can_flap && + flaps_nb < 3) + { + physic.set_velocity_y(3.5); + physic.set_velocity_x(physic.get_velocity_x() * 0.35); + flaps_nb++; + } + } + else if(flapping_mode == MAREK_FLAP) + { + // Flapping, Marek's version + if (input.jump == DOWN && can_flap) { if (!flapping_timer.started()) { flapping_timer.start(TUX_FLAPPING_TIME); + flapping_velocity = physic.get_velocity_x(); } if (!flapping_timer.check()) { @@ -585,14 +633,66 @@ Player::handle_vertical_input() flapping = true; if (flapping_timer.get_gone() <= TUX_FLAPPING_TIME) { - physic.set_velocity_y((float)flapping_timer.get_gone()/450); + float cv; + if (flapping_velocity == 0) {cv = 0;} + else {cv = flapping_velocity*(sqrt(TUX_FLAPPING_TIME-(float)flapping_timer.get_gone()))/sqrt(TUX_FLAPPING_TIME);} + //Handle change of direction while flapping + if (((dir == LEFT) && (cv > 0)) || (dir == RIGHT) && (cv < 0)) {cv *= (-1);} + physic.set_velocity_x(cv); + physic.set_velocity_y((float)flapping_timer.get_gone()/850); + } + } + } + else if(flapping_mode == RYAN_FLAP) + { + // Flapping, Ryan's version + if (input.jump == DOWN && 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_gone() <= 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 + .01f*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); + } + } + + // Hover //(disabled by default, use cheat code "hover" to toggle on/off) //TODO: needs some tweaking, especially when used together with double jump and jumping off badguys - if (enable_hover && input.up == DOWN && !jumping && !butt_jump && physic.get_velocity_y() <= 0) + if (enable_hover && input.jump == DOWN && !jumping && !butt_jump && physic.get_velocity_y() <= 0) { physic.set_velocity_y(-1); } @@ -641,10 +741,8 @@ Player::handle_vertical_input() if(badguy->dying == DYING_NOT && badguy->mode != BadGuy::BOMB_TICKING && badguy->mode != BadGuy::BOMB_EXPLODE) { - if (fabsf(base.x - badguy->base.x) < 150 && - fabsf(base.y - badguy->base.y) < 60 && - (issolid(badguy->base.x + 1, badguy->base.y + badguy->base.height) || - issolid(badguy->base.x + badguy->base.width - 1, badguy->base.y + badguy->base.height))) + if (fabsf(base.x - badguy->base.x) < 96 && + fabsf(base.y - badguy->base.y) < 64) badguy->kill_me(25); } } @@ -656,8 +754,8 @@ Player::handle_vertical_input() issolid(base.x + base.width - 1, base.y + base.height + 64)) && jumping == false && can_jump == false - && input.up == DOWN - && input.old_up == UP) + && input.jump == DOWN + && input.old_jump == UP) { can_jump = true; } @@ -668,9 +766,11 @@ Player::handle_vertical_input() flapping = false; falling_from_flap = false; if (flapping_timer.started()) {flapping_timer.stop();} + + physic.set_acceleration_y(0); //for flapping } - input.old_up = input.up; + input.old_jump = input.jump; } void @@ -681,7 +781,7 @@ Player::handle_input() /* Jump/jumping? */ - if (on_ground() && input.up == UP) + if (on_ground() && input.jump == UP) can_jump = true; handle_vertical_input(); @@ -832,7 +932,7 @@ Player::draw(DrawingContext& context) else // dir == RIGHT tux_body->set_action("kick-right"); } - else if (butt_jump) + else if (butt_jump && size == BIG) { if(dir == LEFT) tux_body->set_action("buttjump-left"); @@ -930,7 +1030,7 @@ Player::draw(DrawingContext& context) else if (safe_timer.started() && global_frame_counter%2) ; // don't draw Tux else - tux_body->draw(context, pos, layer, dir == LEFT ? HORIZONTAL_FLIP : NONE_EFFECT); + tux_body->draw(context, pos, layer); // Draw blinking star overlay if (invincible_timer.started() && @@ -1170,19 +1270,7 @@ Player::bounce(BadGuy* badguy) flapping = false; falling_from_flap = false; - if(player_status.score_multiplier > 1) - { // show a message - char str[124]; - if (player_status.score_multiplier <= 4) {sprintf(str, _("Combo x%d"), player_status.score_multiplier);} - else if (player_status.score_multiplier == 5) {sprintf(str, _("Good! x%d"), player_status.score_multiplier);} - else if (player_status.score_multiplier == 6) {sprintf(str, _("Great! x%d"), player_status.score_multiplier);} - else if (player_status.score_multiplier == 7) {sprintf(str, _("Awesome! x%d"), player_status.score_multiplier);} - else if (player_status.score_multiplier == 8) {sprintf(str, _("Incredible! x%d"), player_status.score_multiplier);} - else if (player_status.score_multiplier == 9) {sprintf(str, _("Godlike! ;-) x%d"), player_status.score_multiplier);} - else {sprintf(str, _("Unbelievable!! x%d"), player_status.score_multiplier);} - Sector::current()->add_floating_text(base, str); - } - if (input.up) + if (input.jump) physic.set_velocity_y(5.2); else physic.set_velocity_y(2);