From: Matthias Braun Date: Mon, 24 May 2004 21:18:56 +0000 (+0000) Subject: fixed bug I just introduced X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=91705941a6a8a251b7c5f670c6d100e512b2dd7f;p=supertux.git fixed bug I just introduced SVN-Revision: 1311 --- diff --git a/src/camera.cpp b/src/camera.cpp index d3c66037b..b7d3afd27 100644 --- a/src/camera.cpp +++ b/src/camera.cpp @@ -132,7 +132,6 @@ Camera::scroll_normal(float elapsed_time) float speed_x = delta_x / elapsed_time; float maxv = 1 + fabsf(player->physic.get_velocity_x() * 2); - printf("SX: %f MV: %f.\n", player->physic.get_velocity_x(), maxv); if(speed_x > maxv) speed_x = maxv; else if(speed_x < -maxv) diff --git a/src/camera.h b/src/camera.h index aaa8e1959..e1de4a5b4 100644 --- a/src/camera.h +++ b/src/camera.h @@ -74,7 +74,11 @@ private: Player* player; Level* level; CameraMode mode; + + // normal mode LeftRightScrollChange scrollchange; + + // autoscroll mode }; #endif diff --git a/src/world.cpp b/src/world.cpp index 01a998f10..d8a4f7c26 100644 --- a/src/world.cpp +++ b/src/world.cpp @@ -42,14 +42,18 @@ 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); + if(level_nr >= 0) { + level->load(filename, level_nr, this); + } else { + level->load(filename, this); + } tux = new Player(displaymanager); add_object(tux); @@ -71,44 +75,10 @@ World::World(const std::string& filename) add_object(new TileMap(displaymanager, level)); level->load_song(); - apply_bonuses(); - camera = new Camera(tux, level); - add_object(camera); - - 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); - - set_defaults(); - - get_level()->load_gfx(); - activate_particle_systems(); - background = new Background(displaymanager); - if(level->img_bkgd) { - background->set_image(level->img_bkgd, level->bkgd_speed); - } else { - background->set_gradient(level->bkgd_top, level->bkgd_bottom); - } - gameobjects.push_back(background); - // add tilemap - gameobjects.push_back(new TileMap(displaymanager, get_level())); - get_level()->load_song(); + add_object(camera); apply_bonuses(); - - scrolling_timer.init(true); } void @@ -226,15 +196,15 @@ World::draw() 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(*camera, - level->back_scrolling, (bool)level->hor_autoscroll_speed); - /* Handle all possible collisions. */ collision_handler(); @@ -283,147 +253,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 - -static const float max_speed_y = 1.4; - -// the time it takes to move the camera (in ms) -#define CHANGE_DIR_SCROLL_SPEED 2000 - -static const float EPSILON = .0001; - -#if 0 -/* This functions takes cares of the scrolling */ -void World::scrolling(float elapsed_time) -{ - if(elapsed_time < EPSILON) - return; - - Vector scroll = displaymanager.get_viewport().get_translation(); - bool do_y_scrolling = true; - - if(tux->dying) - do_y_scrolling = false; - - /* Y-axis scrolling */ - if(do_y_scrolling) { - float target_y; - // upwards we target the y position of the platforms tux stands on - if(tux->fall_mode != Player::FALLING) - target_y = tux->last_ground_y + tux->base.height; - else - target_y = tux->base.y + tux->base.height; - - float delta_y = scroll.y - (target_y - (screen->h/2)); - float speed_y = delta_y / elapsed_time; - - float max = max_speed_y; - if(fabsf(delta_y) > float(screen->h)/5.0) - max *= 5; - - if(speed_y > max) - speed_y = max; - else if(speed_y < -max) - speed_y = -max; - - scroll.y -= speed_y * elapsed_time; - - // don't 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 */ - -#if 0 - /* 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; - } -#endif - - /* 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; - } - - // don't 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(scroll); -} -#endif - void World::collision_handler() { diff --git a/src/world.h b/src/world.h index 661cb085b..6635fe36c 100644 --- a/src/world.h +++ b/src/world.h @@ -49,8 +49,6 @@ private: Level* level; Player* tux; - Timer scrolling_timer; - int distro_counter; bool counting_distros; int currentmusic; @@ -71,9 +69,7 @@ public: static World* current() { return current_; } static void set_current(World* w) { current_ = w; } - World(const std::string& filename); - World(const std::string& subset, int level_nr); - //World() {}; + World(const std::string& filename, int level_nr = -1); ~World(); Level* get_level() { return level; }