X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fworld.cpp;h=0c28cb0011097e6180969176b7cf025c6dfd8467;hb=157cef71aeb9ae25b7bb90f37dda11bc09329d11;hp=eb15b7976f0cb338a72340400df8fa24f3cdb84a;hpb=2aeafe7747a0a4d648deeb17916275e32d9fae68;p=supertux.git diff --git a/src/world.cpp b/src/world.cpp index eb15b7976..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,70 +42,44 @@ 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* bg = new Background(displaymanager); - if(level->img_bkgd) { - bg->set_image(level->img_bkgd, level->bkgd_speed); + if(level_nr >= 0) { + level->load(filename, level_nr, this); } else { - bg->set_gradient(level->bkgd_top, level->bkgd_bottom); + level->load(filename, this); } - gameobjects.push_back(bg); - - // 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* bg = new Background(displaymanager); + background = new Background(displaymanager); if(level->img_bkgd) { - bg->set_image(level->img_bkgd, level->bkgd_speed); + background->set_image(level->img_bkgd, level->bkgd_speed); } else { - bg->set_gradient(level->bkgd_top, level->bkgd_bottom); + background->set_gradient(level->bkgd_top, level->bkgd_bottom); } - gameobjects.push_back(bg); + 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 @@ -140,9 +114,6 @@ World::~World() void World::set_defaults() { - // Set defaults: - scroll_x = 0; - player_status.score_multiplier = 1; counting_distros = false; @@ -168,6 +139,9 @@ World::add_object(GameObject* object) Trampoline* trampoline = dynamic_cast (object); if(trampoline) trampolines.push_back(trampoline); + FlyingPlatform* flying_platform = dynamic_cast (object); + if(flying_platform) + flying_platforms.push_back(flying_platform); gameobjects.push_back(object); } @@ -183,7 +157,11 @@ World::parse_objects(lisp_object_t* cur) if(object_type == "trampoline") { add_object(new Trampoline(displaymanager, reader)); - } else { + } + else if(object_type == "flying-platform") { + add_object(new FlyingPlatform(displaymanager, reader)); + } + else { BadGuyKind kind = badguykind_from_string(object_type); add_object(new BadGuy(displaymanager, kind, reader)); } @@ -213,21 +191,21 @@ void World::draw() { /* Draw objects */ - displaymanager.get_viewport().set_translation(Vector(scroll_x, scroll_y)); - displaymanager.draw(); + displaymanager.draw(*camera); } void -World::action(double frame_ratio) +World::action(float elapsed_time) { - tux->check_bounds(level->back_scrolling, (bool)level->hor_autoscroll_speed); - scrolling(frame_ratio); - + 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(frame_ratio); + if(gameobjects[i]->is_valid()) + gameobjects[i]->action(elapsed_time); /* Handle all possible collisions. */ collision_handler(); @@ -262,6 +240,12 @@ World::action(double frame_ratio) std::remove(trampolines.begin(), trampolines.end(), trampoline), trampolines.end()); } + FlyingPlatform* flying_platform= dynamic_cast (*i); + if(flying_platform) { + flying_platforms.erase( + std::remove(flying_platforms.begin(), flying_platforms.end(), flying_platform), + flying_platforms.end()); + } delete *i; i = gameobjects.erase(i); @@ -271,115 +255,6 @@ World::action(double frame_ratio) } } -/* 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(double frame_ratio) -{ - /* 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 * frame_ratio; - 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/(frame_ratio * 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() * frame_ratio - + constant2 * tux->physic.get_acceleration_x() * frame_ratio * frame_ratio; - - 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; -} - void World::collision_handler() { @@ -481,6 +356,24 @@ World::collision_handler() } } } + + // CO_FLYING_PLATFORM & (CO_PLAYER or CO_BADGUY) + for (FlyingPlatforms::iterator i = flying_platforms.begin(); i != flying_platforms.end(); ++i) + { + if (rectcollision((*i)->base, tux->base)) + { + if (tux->previous_base.y < tux->base.y && + tux->previous_base.y + tux->previous_base.height + < (*i)->base.y + (*i)->base.height/2) + { + (*i)->collision(tux, CO_PLAYER, COLLISION_SQUISH); + tux->collision(*i, CO_FLYING_PLATFORM); + } +/* else if (tux->previous_base.y <= tux->base.y) + { + }*/ + } + } } void @@ -534,18 +427,18 @@ World::add_upgrade(const Vector& pos, Direction dir, UpgradeKind kind) add_object(new Upgrade(displaymanager, pos, dir, kind)); } -void +bool World::add_bullet(const Vector& pos, float xm, Direction dir) { if(tux->got_power == Player::FIRE_POWER) { if(bullets.size() > MAX_FIRE_BULLETS-1) - return; + return false; } else if(tux->got_power == Player::ICE_POWER) { if(bullets.size() > MAX_ICE_BULLETS-1) - return; + return false; } Bullet* new_bullet = 0; @@ -558,6 +451,8 @@ World::add_bullet(const Vector& pos, float xm, Direction dir) add_object(new_bullet); play_sound(sounds[SND_SHOOT], SOUND_CENTER_SPEAKER); + + return true; } void