X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fsector.cpp;h=96f7f34911a5169247e0ff3e5f3ed60034676e4e;hb=4d3bd02fc76e7c0b138256af7fb2f18c56952998;hp=6b3abe1e9e9020cb376aedbaa559a0a50550f72a;hpb=d167dc13d0c3c71ab55e7d66a7fc26c290992ae2;p=supertux.git diff --git a/src/sector.cpp b/src/sector.cpp index 6b3abe1e9..96f7f3491 100644 --- a/src/sector.cpp +++ b/src/sector.cpp @@ -42,27 +42,19 @@ #include "gameloop.h" #include "resources.h" #include "statistics.h" +#include "collision_grid.h" +#include "collision_grid_iterator.h" +#include "object_factory.h" #include "special/collision.h" #include "math/rectangle.h" #include "math/aatriangle.h" #include "object/coin.h" #include "object/block.h" #include "object/invisible_block.h" -#include "object/platform.h" #include "object/bullet.h" #include "badguy/jumpy.h" -#include "badguy/snowball.h" -#include "badguy/bouncing_snowball.h" -#include "badguy/flame.h" -#include "badguy/mriceblock.h" -#include "badguy/mrbomb.h" -#include "badguy/dispenser.h" #include "badguy/spike.h" -#include "badguy/spiky.h" -#include "badguy/nolok_01.h" -#include "trigger/door.h" #include "trigger/sequence_trigger.h" -#include "trigger/secretarea_trigger.h" Sector* Sector::_current = 0; @@ -73,6 +65,8 @@ Sector::Sector() song_title = "Mortimers_chipdisko.mod"; player = new Player(); add_object(player); + + grid = new CollisionGrid(32000, 32000); } Sector::~Sector() @@ -80,6 +74,8 @@ Sector::~Sector() update_game_objects(); assert(gameobjects_new.size() == 0); + delete grid; + for(GameObjects::iterator i = gameobjects.begin(); i != gameobjects.end(); ++i) { delete *i; @@ -96,14 +92,10 @@ Sector::~Sector() GameObject* Sector::parse_object(const std::string& name, const lisp::Lisp& reader) { - if(name == "background") { - return new Background(reader); - } else if(name == "camera") { + if(name == "camera") { Camera* camera = new Camera(this); camera->parse(reader); return camera; - } else if(name == "tilemap") { - return new TileMap(reader); } else if(name == "particles-snow") { SnowParticleSystem* partsys = new SnowParticleSystem(); partsys->parse(reader); @@ -112,35 +104,16 @@ Sector::parse_object(const std::string& name, const lisp::Lisp& reader) CloudParticleSystem* partsys = new CloudParticleSystem(); partsys->parse(reader); return partsys; - } else if(name == "door") { - return new Door(reader); - } else if(name == "secretarea") { - return new SecretAreaTrigger(reader); - } else if(name == "platform") { - return new Platform(reader); - } else if(name == "jumpy" || name == "money") { + } else if(name == "money") { // for compatibility with old maps return new Jumpy(reader); - } else if(name == "snowball") { - return new SnowBall(reader); - } else if(name == "bouncingsnowball") { - return new BouncingSnowball(reader); - } else if(name == "flame") { - return new Flame(reader); - } else if(name == "mriceblock") { - return new MrIceBlock(reader); - } else if(name == "mrbomb") { - return new MrBomb(reader); - } else if(name == "dispenser") { - return new Dispenser(reader); - } else if(name == "spike") { - return new Spike(reader); - } else if(name == "spiky") { - return new Spiky(reader); - } else if(name == "nolok_01") { - return new Nolok_01(reader); - } - - std::cerr << "Unknown object type '" << name << "'.\n"; + } + + try { + return create_object(name, reader); + } catch(std::exception& e) { + std::cerr << e.what() << "\n"; + } + return 0; } @@ -459,11 +432,28 @@ Sector::get_best_spawn_point(Vector pos) return best_reset_point; } +Rectangle +Sector::get_active_region() +{ + return Rectangle( + camera->get_translation() - Vector(1600, 1200), + camera->get_translation() + Vector(1600, 1200)); +} + void Sector::action(float elapsed_time) { player->check_bounds(camera); - + +#if 0 + CollisionGridIterator iter(*grid, get_active_region()); + while(MovingObject* object = iter.next()) { + if(!object->is_valid()) + continue; + + object->action(elapsed_time); + } +#else /* update objects */ for(GameObjects::iterator i = gameobjects.begin(); i != gameobjects.end(); ++i) { @@ -473,7 +463,8 @@ Sector::action(float elapsed_time) object->action(elapsed_time); } - +#endif + /* Handle all possible collisions. */ collision_handler(); update_game_objects(); @@ -485,29 +476,42 @@ Sector::update_game_objects() /** cleanup marked objects */ for(std::vector::iterator i = gameobjects.begin(); i != gameobjects.end(); /* nothing */) { - if((*i)->is_valid() == false) { - Bullet* bullet = dynamic_cast (*i); - if(bullet) { - bullets.erase( - std::remove(bullets.begin(), bullets.end(), bullet), - bullets.end()); - } - delete *i; - i = gameobjects.erase(i); - } else { + GameObject* object = *i; + + if(object->is_valid()) { ++i; + continue; + } + + Bullet* bullet = dynamic_cast (object); + if(bullet) { + bullets.erase( + std::remove(bullets.begin(), bullets.end(), bullet), + bullets.end()); + } + MovingObject* movingobject = dynamic_cast (object); + if(movingobject) { + grid->remove_object(movingobject); } + delete *i; + i = gameobjects.erase(i); } /* add newly created objects */ for(std::vector::iterator i = gameobjects_new.begin(); i != gameobjects_new.end(); ++i) { - Bullet* bullet = dynamic_cast (*i); + GameObject* object = *i; + + Bullet* bullet = dynamic_cast (object); if(bullet) bullets.push_back(bullet); - TileMap* tilemap = dynamic_cast (*i); + MovingObject* movingobject = dynamic_cast (object); + if(movingobject) + grid->add_object(movingobject); + + TileMap* tilemap = dynamic_cast (object); if(tilemap && tilemap->is_solid()) { if(solids == 0) { solids = tilemap; @@ -516,7 +520,7 @@ Sector::update_game_objects() } } - Camera* camera = dynamic_cast (*i); + Camera* camera = dynamic_cast (object); if(camera) { if(this->camera != 0) { std::cerr << "Warning: Multiple cameras added. Ignoring."; @@ -525,7 +529,7 @@ Sector::update_game_objects() this->camera = camera; } - gameobjects.push_back(*i); + gameobjects.push_back(object); } gameobjects_new.clear(); } @@ -535,7 +539,16 @@ Sector::draw(DrawingContext& context) { context.push_transform(); context.set_translation(camera->get_translation()); - + +#if 0 + CollisionGridIterator iter(*grid, get_active_region()); + while(MovingObject* object = iter.next()) { + if(!object->is_valid()) + continue; + + object->draw(context); + } +#else for(GameObjects::iterator i = gameobjects.begin(); i != gameobjects.end(); ++i) { GameObject* object = *i; @@ -544,6 +557,7 @@ Sector::draw(DrawingContext& context) object->draw(context); } +#endif context.pop_transform(); } @@ -674,6 +688,9 @@ Sector::collision_object(MovingObject* object1, MovingObject* object2) void Sector::collision_handler() { +#if 0 + grid->check_collisions(); +#else for(std::vector::iterator i = gameobjects.begin(); i != gameobjects.end(); ++i) { GameObject* gameobject = *i; @@ -709,6 +726,7 @@ Sector::collision_handler() movingobject->bbox.move(movingobject->get_movement()); movingobject->movement = Vector(0, 0); } +#endif } bool