X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fplayer.cpp;h=f9a6032fd2155f2262930a4bb0ae9cf6497c8512;hb=cf4de5d58eb99a11369c329c01bfa5abe4b0a398;hp=df8571b113753b0af52f00b4873f9fb591852d22;hpb=04176f738ff4a45afd579dc07425e602e404ceea;p=supertux.git diff --git a/src/player.cpp b/src/player.cpp index df8571b11..f9a6032fd 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -27,7 +27,11 @@ #include "scene.h" #include "tile.h" #include "sprite.h" +#include "sector.h" +#include "tilemap.h" +#include "camera.h" #include "gameobjs.h" +#include "interactive_object.h" #include "screen/screen.h" // behavior definitions: @@ -54,7 +58,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; @@ -70,6 +75,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() @@ -153,6 +159,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; } @@ -261,26 +284,30 @@ Player::action(float elapsed_time) if (isbrick(base.x, base.y) || isfullbox(base.x, base.y)) { - World::current()->trygrabdistro(base.x, base.y - 32, BOUNCE); - World::current()->trybumpbadguy(base.x, base.y - 64); + Sector::current()->trygrabdistro( + Vector(base.x, base.y - 32), BOUNCE); + Sector::current()->trybumpbadguy(Vector(base.x, base.y - 64)); - World::current()->trybreakbrick(base.x, base.y, size == SMALL); + Sector::current()->trybreakbrick( + Vector(base.x, base.y), size == SMALL); bumpbrick(base.x, base.y); - World::current()->tryemptybox(base.x, base.y, RIGHT); + Sector::current()->tryemptybox(Vector(base.x, base.y), RIGHT); } if (isbrick(base.x+ 31, base.y) || isfullbox(base.x+ 31, base.y)) { - World::current()->trygrabdistro(base.x+ 31, base.y - 32,BOUNCE); - World::current()->trybumpbadguy(base.x+ 31, base.y - 64); + Sector::current()->trygrabdistro( + Vector(base.x+ 31, base.y - 32), BOUNCE); + Sector::current()->trybumpbadguy(Vector(base.x+ 31, base.y - 64)); if(size == BIG) - World::current()->trybreakbrick(base.x+ 31, base.y, size == SMALL); + Sector::current()->trybreakbrick( + Vector(base.x+ 31, base.y), size == SMALL); bumpbrick(base.x+ 31, base.y); - World::current()->tryemptybox(base.x+ 31, base.y, LEFT); + Sector::current()->tryemptybox(Vector(base.x+ 31, base.y), LEFT); } } @@ -480,16 +507,17 @@ Player::handle_vertical_input() butt_jump = false; // Break bricks beneath Tux - if(World::current()->trybreakbrick(base.x + 1, base.y + base.height, false) - || World::current()->trybreakbrick( - base.x + base.width - 1, base.y + base.height, false)) + if(Sector::current()->trybreakbrick( + Vector(base.x + 1, base.y + base.height), false) + || Sector::current()->trybreakbrick( + Vector(base.x + base.width - 1, base.y + base.height), false)) { physic.set_velocity_y(2); butt_jump = true; } // Kill nearby badguys - std::vector gameobjects = World::current()->gameobjects; + std::vector gameobjects = Sector::current()->gameobjects; for (std::vector::iterator i = gameobjects.begin(); i != gameobjects.end(); i++) @@ -538,7 +566,7 @@ Player::handle_input() /* Shoot! */ if (input.fire == DOWN && input.old_fire == UP && got_power != NONE_POWER) { - if(World::current()->add_bullet(Vector(base.x, base.y + (base.height/2)), + if(Sector::current()->add_bullet(Vector(base.x, base.y + (base.height/2)), physic.get_velocity_x(), dir)) shooting_timer.start(SHOOTING_TIME); input.old_fire = DOWN; @@ -615,16 +643,20 @@ Player::grabdistros() /* Grab distros: */ if (!dying) { - World::current()->trygrabdistro(base.x, base.y, NO_BOUNCE); - World::current()->trygrabdistro(base.x+ 31, base.y, NO_BOUNCE); + Sector::current()->trygrabdistro(Vector(base.x, base.y), NO_BOUNCE); + Sector::current()->trygrabdistro(Vector(base.x+ 31, base.y), NO_BOUNCE); - World::current()->trygrabdistro(base.x, base.y + base.height, NO_BOUNCE); - World::current()->trygrabdistro(base.x+ 31, base.y + base.height, NO_BOUNCE); + Sector::current()->trygrabdistro( + Vector(base.x, base.y + base.height), NO_BOUNCE); + Sector::current()->trygrabdistro( + Vector(base.x+ 31, base.y + base.height), NO_BOUNCE); if(size == BIG) { - World::current()->trygrabdistro(base.x, base.y + base.height / 2, NO_BOUNCE); - World::current()->trygrabdistro(base.x+ 31, base.y + base.height / 2, NO_BOUNCE); + Sector::current()->trygrabdistro( + Vector(base.x, base.y + base.height / 2), NO_BOUNCE); + Sector::current()->trygrabdistro( + Vector(base.x+ 31, base.y + base.height / 2), NO_BOUNCE); } } @@ -739,12 +771,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 @@ -924,7 +953,7 @@ Player::move(const Vector& vector) } void -Player::check_bounds(DrawingContext& viewport) +Player::check_bounds(Camera* camera) { /* Keep tux in bounds: */ if (base.x < 0) @@ -934,7 +963,7 @@ Player::check_bounds(DrawingContext& viewport) } /* Keep in-bounds, vertically: */ - if (base.y > World::current()->get_level()->height * /*TILE_HEIGHT*/ 32) + if (base.y > Sector::current()->solids->get_height() * 32) { kill(KILL); return; @@ -942,12 +971,12 @@ Player::check_bounds(DrawingContext& viewport) bool adjust = false; // can happen if back scrolling is disabled - if(base.x < viewport.get_translation().x) { - base.x = viewport.get_translation().x; + if(base.x < camera->get_translation().x) { + base.x = camera->get_translation().x; adjust = true; } - if(base.x >= viewport.get_translation().x + screen->w - base.width) { - base.x = viewport.get_translation().x + screen->w - base.width; + if(base.x >= camera->get_translation().x + screen->w - base.width) { + base.x = camera->get_translation().x + screen->w - base.width; adjust = true; } @@ -960,5 +989,3 @@ Player::check_bounds(DrawingContext& viewport) } } -// EOF // -