X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fworld.cpp;h=0c28cb0011097e6180969176b7cf025c6dfd8467;hb=157cef71aeb9ae25b7bb90f37dda11bc09329d11;hp=91acb667af7249368620d4adf0200fd206e1fbae;hpb=5ab69550afb268f8775d876406a9a5797f224f97;p=supertux.git diff --git a/src/world.cpp b/src/world.cpp index 91acb667a..0c28cb001 100644 --- a/src/world.cpp +++ b/src/world.cpp @@ -33,7 +33,7 @@ #include "tile.h" #include "resources.h" #include "gameobjs.h" -#include "viewport.h" +#include "camera.h" #include "display_manager.h" #include "background.h" #include "tilemap.h" @@ -42,55 +42,30 @@ Surface* img_distro[4]; World* World::current_ = 0; -World::World(const std::string& filename) +World::World(const std::string& filename, int level_nr) { // FIXME: Move this to action and draw and everywhere else where the // world calls child functions current_ = this; - level = new Level(); - level->load(filename, this); - tux = new Player(displaymanager); - gameobjects.push_back(tux); - - set_defaults(); + add_object(tux); + + level = new Level(); + camera = new Camera(tux, level); + add_object(camera); - get_level()->load_gfx(); - // add background - activate_particle_systems(); - background = new Background(displaymanager); - if(level->img_bkgd) { - background->set_image(level->img_bkgd, level->bkgd_speed); + if(level_nr >= 0) { + level->load(filename, level_nr, this); } else { - background->set_gradient(level->bkgd_top, level->bkgd_bottom); + level->load(filename, this); } - gameobjects.push_back(background); - - // add tilemap - gameobjects.push_back(new TileMap(displaymanager, get_level())); - get_level()->load_song(); - - apply_bonuses(); - - scrolling_timer.init(true); -} - -World::World(const std::string& subset, int level_nr) -{ - // FIXME: Move this to action and draw and everywhere else where the - // world calls child functions - current_ = this; - - level = new Level(); - level->load(subset, level_nr, this); - - tux = new Player(displaymanager); - gameobjects.push_back(tux); - + tux->move(level->start_pos); + set_defaults(); - get_level()->load_gfx(); + level->load_gfx(); + // add background activate_particle_systems(); background = new Background(displaymanager); if(level->img_bkgd) { @@ -98,14 +73,13 @@ World::World(const std::string& subset, int level_nr) } else { background->set_gradient(level->bkgd_top, level->bkgd_bottom); } - gameobjects.push_back(background); + add_object(background); + // add tilemap - gameobjects.push_back(new TileMap(displaymanager, get_level())); - get_level()->load_song(); + add_object(new TileMap(displaymanager, level)); + level->load_song(); apply_bonuses(); - - scrolling_timer.init(true); } void @@ -217,21 +191,21 @@ void World::draw() { /* Draw objects */ - displaymanager.draw(); + displaymanager.draw(*camera); } void World::action(float elapsed_time) { + tux->check_bounds(*camera, + level->back_scrolling, (bool)level->hor_autoscroll_speed); + /* update objects (don't use iterators here, because the list might change * during the iteration) */ for(size_t i = 0; i < gameobjects.size(); ++i) - gameobjects[i]->action(elapsed_time); - - tux->check_bounds(displaymanager.get_viewport(), - level->back_scrolling, (bool)level->hor_autoscroll_speed); - scrolling(elapsed_time); + if(gameobjects[i]->is_valid()) + gameobjects[i]->action(elapsed_time); /* Handle all possible collisions. */ collision_handler(); @@ -281,122 +255,6 @@ World::action(float elapsed_time) } } -/* the space that it takes for the screen to start scrolling, regarding */ -/* screen bounds (in pixels) */ -// should be higher than screen->w/2 (400) -#define X_SPACE (500-16) -// should be less than screen->h/2 (300) -#define Y_SPACE 250 - -// the time it takes to move the camera (in ms) -#define CHANGE_DIR_SCROLL_SPEED 2000 - -/* This functions takes cares of the scrolling */ -void World::scrolling(float elapsed_time) -{ - float scroll_x = displaymanager.get_viewport().get_translation().x; - float scroll_y = displaymanager.get_viewport().get_translation().y; - - /* Y-axis scrolling */ - - float tux_pos_y = tux->base.y + (tux->base.height/2); - - if(level->height > VISIBLE_TILES_Y-1 && !tux->dying) - { - if (scroll_y < tux_pos_y - (screen->h - Y_SPACE)) - scroll_y = tux_pos_y - (screen->h - Y_SPACE); - else if (scroll_y > tux_pos_y - Y_SPACE) - scroll_y = tux_pos_y - Y_SPACE; - } - - // this code prevent the screen to scroll before the start or after the level's end - if(scroll_y > level->height * 32 - screen->h) - scroll_y = level->height * 32 - screen->h; - if(scroll_y < 0) - scroll_y = 0; - - /* X-axis scrolling */ - - /* Auto scrolling */ - if(level->hor_autoscroll_speed) - { - scroll_x += level->hor_autoscroll_speed * elapsed_time; - displaymanager.get_viewport().set_translation(Vector(scroll_x, scroll_y)); - return; - } - - - /* Horizontal backscrolling */ - float tux_pos_x = tux->base.x + (tux->base.width/2); - - if(tux->old_dir != tux->dir && level->back_scrolling) - scrolling_timer.start(CHANGE_DIR_SCROLL_SPEED); - - bool right = false; - bool left = false; - if (tux->physic.get_velocity_x() > 0) - right = true; - else if (tux->physic.get_velocity_x() < 0) - left = true; - else - { - if (tux->dir == RIGHT) - right = true; - else - left = true; - } - - if(scrolling_timer.check()) - { - float final_scroll_x; - float constant1; - float constant2; - if (right) - final_scroll_x = tux_pos_x - (screen->w - X_SPACE); - else - final_scroll_x = tux_pos_x - X_SPACE; - - if((tux->physic.get_velocity_x() > 0 && tux->dir == RIGHT) - || (tux->physic.get_velocity_x() < 0 && tux->dir == LEFT)) - { - constant1 = 1.0; - constant2 = .4; - } - else - { - constant1 = 0.; - constant2 = 0.; - } - - float number = 2.5/(elapsed_time * CHANGE_DIR_SCROLL_SPEED/1000)*exp((CHANGE_DIR_SCROLL_SPEED-scrolling_timer.get_left())/1400.); - if(left) number *= -1.; - - scroll_x += number - + constant1 * tux->physic.get_velocity_x() * elapsed_time - + constant2 * tux->physic.get_acceleration_x() * elapsed_time * - elapsed_time; - - if ((right && final_scroll_x - scroll_x < 0) || (left && final_scroll_x - scroll_x > 0)) - scroll_x = final_scroll_x; - - } - else - { - if (right && scroll_x < tux_pos_x - (screen->w - X_SPACE)) - scroll_x = tux_pos_x - (screen->w - X_SPACE); - else if (left && scroll_x > tux_pos_x - X_SPACE && level->back_scrolling) - scroll_x = tux_pos_x - X_SPACE; - } - - // this code prevent the screen to scroll before the start or after the level's end - if(scroll_x > level->width * 32 - screen->w) - scroll_x = level->width * 32 - screen->w; - if(scroll_x < 0) - scroll_x = 0; - - displaymanager.get_viewport().set_translation(Vector(scroll_x, scroll_y)); -} - void World::collision_handler() {