X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fplayer.cpp;h=a049774fc1a79fb78168487a970641ff918e6b59;hb=3369ed08e4b7126af560dc5f9c3442fc76b43ab4;hp=c25b39531d0391d2eea2ea1e4658eae0b1fed04d;hpb=2074a5e3f8167dec24989c008ddadda14687a3a6;p=supertux.git diff --git a/src/player.cpp b/src/player.cpp index c25b39531..a049774fc 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -31,22 +31,27 @@ #include "tilemap.h" #include "camera.h" #include "gameobjs.h" +#include "resources.h" +#include "interactive_object.h" #include "screen/screen.h" // behavior definitions: #define TILES_FOR_BUTTJUMP 3 // animation times (in ms): #define SHOOTING_TIME 320 +#define STOMP_TIME 250 // others stuff: #define AUTOSCROLL_DEAD_INTERVAL 300 +// growing animation +Surface* growingtux_left[GROWING_FRAMES]; +Surface* growingtux_right[GROWING_FRAMES]; + Surface* tux_life; Sprite* smalltux_gameover; Sprite* smalltux_star; Sprite* largetux_star; -Sprite* growingtux_left; -Sprite* growingtux_right; PlayerSprite smalltux; PlayerSprite largetux; @@ -57,7 +62,8 @@ PlayerKeymap keymap; PlayerKeymap::PlayerKeymap() { - keymap.jump = SDLK_UP; + keymap.jump = SDLK_SPACE; + keymap.activate = SDLK_UP; keymap.duck = SDLK_DOWN; keymap.left = SDLK_LEFT; keymap.right = SDLK_RIGHT; @@ -73,6 +79,7 @@ void player_input_init(player_input_type* pplayer_input) pplayer_input->right = UP; pplayer_input->up = UP; pplayer_input->old_up = UP; + pplayer_input->activate = UP; } Player::Player() @@ -112,7 +119,7 @@ Player::init() frame_main = 0; frame_ = 0; - + player_input_init(&input); invincible_timer.init(true); @@ -156,6 +163,23 @@ Player::key_event(SDLKey key, int state) input.fire = state; return true; } + else if(key == keymap.activate) + { + 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 return false; } @@ -393,7 +417,7 @@ Player::handle_horizontal_input() if(on_ground() && ((vx < 0 && dirsign >0) || (vx>0 && dirsign<0))) { if(fabs(vx)>SKID_XM && !skidding_timer.check()) { skidding_timer.start(SKID_TIME); - play_sound(sounds[SND_SKID], SOUND_CENTER_SPEAKER); + sound_manager->play_sound(sounds[SND_SKID]); ax *= 2.5; } else { ax *= 2; @@ -460,9 +484,9 @@ Player::handle_vertical_input() jumping = true; can_jump = false; if (size == SMALL) - play_sound(sounds[SND_JUMP], SOUND_CENTER_SPEAKER); + sound_manager->play_sound(sounds[SND_JUMP]); else - play_sound(sounds[SND_BIGJUMP], SOUND_CENTER_SPEAKER); + sound_manager->play_sound(sounds[SND_BIGJUMP]); } // Let go of jump key else if(input.up == UP && jumping && physic.get_velocity_y() > 0) @@ -473,7 +497,7 @@ Player::handle_vertical_input() /* In case the player has pressed Down while in a certain range of air, enable butt jump action */ - if (input.down == DOWN && !butt_jump) + if (input.down == DOWN && !butt_jump && !duck) if(tiles_on_air(TILES_FOR_BUTTJUMP) && jumping) butt_jump = true; @@ -484,6 +508,7 @@ Player::handle_vertical_input() // Do butt jump if (butt_jump && on_ground() && size == BIG) { + stomp_timer.start(STOMP_TIME); butt_jump = false; // Break bricks beneath Tux @@ -505,8 +530,9 @@ Player::handle_vertical_input() BadGuy* badguy = dynamic_cast (*i); if(badguy) { - if (fabsf(base.x - badguy->base.x) < 300 && - fabsf(base.y - badguy->base.y) < 300 && + + 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))) badguy->kill_me(25); @@ -612,7 +638,7 @@ Player::grow(bool animate) base.y -= 32; if(animate) - growing_timer.start((int)((growingtux_left->get_frames() / growingtux_left->get_fps()) * 1000)); + growing_timer.start(GROWING_TIME); old_base = previous_base = base; } @@ -648,7 +674,7 @@ Player::grabdistros() if(player_status.lives < MAX_LIVES) ++player_status.lives; /*We want to hear the sound even, if MAX_LIVES is reached*/ - play_sound(sounds[SND_LIFEUP], SOUND_CENTER_SPEAKER); + sound_manager->play_sound(sounds[SND_LIFEUP]); } } @@ -673,16 +699,16 @@ Player::draw(DrawingContext& context) { if (dying == DYING_SQUISHED) { - smalltux_gameover->draw(context, pos, LAYER_OBJECTS); + smalltux_gameover->draw(context, pos, LAYER_OBJECTS+1); } else { if(growing_timer.check()) { if (dir == RIGHT) - growingtux_right->draw(context, pos, layer); + context.draw_surface(growingtux_right[(growing_timer.get_gone() * GROWING_FRAMES) / GROWING_TIME], pos, layer); else - growingtux_left->draw(context, pos, layer); + context.draw_surface(growingtux_left[(growing_timer.get_gone() * GROWING_FRAMES) / GROWING_TIME], pos, layer); } else if (duck && size != SMALL) { @@ -740,6 +766,13 @@ Player::draw(DrawingContext& context) else sprite->grab_left->draw(context, pos, LAYER_OBJECTS + 1); } + + // Draw stomp clouds when doing a butt jump + if (stomp_timer.check()) + if (duck) + sprite->stomp->draw(context, Vector(base.x - 32, base.y), LAYER_OBJECTS + 1); + else + sprite->stomp->draw(context, Vector(base.x - 32, base.y + 32), LAYER_OBJECTS + 1); // Draw blinking star overlay if (invincible_timer.started() && @@ -751,12 +784,9 @@ Player::draw(DrawingContext& context) largetux_star->draw(context, pos, LAYER_OBJECTS + 2); } -#if 0 // TODO if (debug_mode) - fillrect(base.x - viewport.get_translation().x, - base.y - viewport.get_translation().y, - base.width, base.height, 75,75,75, 150); -#endif + context.draw_filled_rect(Vector(base.x, base.y), + Vector(base.width, base.height), Color(75,75,75, 150), LAYER_OBJECTS+1); } void @@ -889,7 +919,7 @@ Player::kill(HurtMode mode) if(dying) return; - play_sound(sounds[SND_HURT], SOUND_CENTER_SPEAKER); + sound_manager->play_sound(sounds[SND_HURT]); physic.set_velocity_x(0);