From: Ricardo Cruz Date: Mon, 13 Sep 2004 18:50:46 +0000 (+0000) Subject: Spawn points should now be working! X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=a79a5bdef2706f0970b06446a22797175db1068a;p=supertux.git Spawn points should now be working! SVN-Revision: 1900 --- diff --git a/src/gameloop.cpp b/src/gameloop.cpp index 5a85fa104..62e0d7f42 100644 --- a/src/gameloop.cpp +++ b/src/gameloop.cpp @@ -60,6 +60,7 @@ #include "worldmap.h" #include "intro.h" #include "misc.h" +#include "camera.h" GameSession* GameSession::current_ = 0; @@ -110,13 +111,11 @@ GameSession::restart_level() last_keys.clear(); -#if 0 - float old_x_pos = -1; - if (world) + Vector tux_pos = Vector(-1,-1); + if (currentsector) { // Tux has lost a life, so we try to respawn him at the nearest reset point - old_x_pos = world->get_tux()->base.x; + tux_pos = currentsector->player->base; } -#endif delete level; currentsector = 0; @@ -125,31 +124,24 @@ GameSession::restart_level() level->load(levelname); if(flip_level) level->do_vertical_flip(); + currentsector = level->get_sector("main"); if(!currentsector) Termination::abort("Level has no main sector.", ""); currentsector->activate("main"); -#if 0 // TODO // Set Tux to the nearest reset point - if (old_x_pos != -1) + if(tux_pos.x != -1) { - ResetPoint best_reset_point = { -1, -1 }; - for(std::vector::iterator i = get_level()->reset_points.begin(); - i != get_level()->reset_points.end(); ++i) - { - if (i->x < old_x_pos && best_reset_point.x < i->x) - best_reset_point = *i; - } - - if (best_reset_point.x != -1) - { - world->get_tux()->base.x = best_reset_point.x; - world->get_tux()->base.y = best_reset_point.y; - } - } -#endif + tux_pos = currentsector->get_best_spawn_point(tux_pos); + currentsector->player->base.x = tux_pos.x; + currentsector->player->base.y = tux_pos.y; + // has to reset camera on swapping + currentsector->camera->reset(Vector(currentsector->player->base.x, + currentsector->player->base.y)); + } + if (st_gl_mode != ST_GL_DEMO_GAME) { if(st_gl_mode == ST_GL_PLAY || st_gl_mode == ST_GL_LOAD_LEVEL_FILE) @@ -377,6 +369,10 @@ GameSession::process_events() } break; default: + break; + } + } + /* Check if chacrater is ASCII */ char ch[2]; if((event.key.keysym.unicode & 0xFF80) == 0) @@ -420,9 +416,7 @@ GameSession::process_events() tux.invincible_timer.start(time_left.get_left()); last_keys.clear(); } - break; - } - } + break; case SDL_JOYAXISMOTION: diff --git a/src/sector.cpp b/src/sector.cpp index c31dda2b6..9064af73d 100644 --- a/src/sector.cpp +++ b/src/sector.cpp @@ -96,7 +96,7 @@ Sector::parse(LispReader& lispreader) } else if(token == "background") { background = new Background(reader); add_object(background); - } else if(token == "playerspawn") { + } else if(token == "spawn-points") { SpawnPoint* sp = new SpawnPoint; reader.read_string("name", sp->name); reader.read_float("x", sp->pos.x); @@ -228,7 +228,27 @@ Sector::parse_old_format(LispReader& reader) add_object(tilemap); } - // TODO read resetpoints + // read reset-points (now spawn-points) + { + lisp_object_t* cur = 0; + if(reader.read_lisp("reset-points", cur)) { + while(!lisp_nil_p(cur)) { + lisp_object_t* data = lisp_car(cur); + LispReader reader(lisp_cdr(data)); + + Vector sp_pos; + if(reader.read_float("x", sp_pos.x) && reader.read_float("y", sp_pos.y)) + { + SpawnPoint* sp = new SpawnPoint; + sp->name = "main"; + sp->pos = sp_pos; + spawnpoints.push_back(sp); + } + + cur = lisp_cdr(cur); + } + } + } // read objects { @@ -272,11 +292,11 @@ Sector::write(LispWriter& writer) for(SpawnPoints::iterator i = spawnpoints.begin(); i != spawnpoints.end(); ++i) { SpawnPoint* spawn = *i; - writer.start_list("playerspawn"); + writer.start_list("spawn-points"); writer.write_string("name", spawn->name); writer.write_float("x", spawn->pos.x); writer.write_float("y", spawn->pos.y); - writer.end_list("playerspawn"); + writer.end_list("spawn-points"); } // write objects @@ -363,6 +383,22 @@ Sector::activate(const std::string& spawnpoint) camera->reset(Vector(player->base.x, player->base.y)); } +Vector +Sector::get_best_spawn_point(Vector pos) +{ +Vector best_reset_point = Vector(-1,-1); + +for(SpawnPoints::iterator i = spawnpoints.begin(); i != spawnpoints.end(); + ++i) { + if((*i)->name != "main") + continue; + if((*i)->pos.x > best_reset_point.x && (*i)->pos.x < pos.x) + best_reset_point = (*i)->pos; + } + +return best_reset_point; +} + void Sector::action(float elapsed_time) { diff --git a/src/sector.h b/src/sector.h index 1b186ef4f..e9c1206cd 100644 --- a/src/sector.h +++ b/src/sector.h @@ -72,6 +72,8 @@ public: /// activates this sector (change music, intialize player class, ...) void activate(const std::string& spawnpoint = "main"); + /// get best spawn point + Vector get_best_spawn_point(Vector pos); void action(float elapsed_time); void update_game_objects();