From a5ff1bc20d84d2acf9aa274310802f5e2cb0a1d1 Mon Sep 17 00:00:00 2001 From: Andreas Ortmann Date: Wed, 28 Sep 2016 17:38:32 +0200 Subject: [PATCH] replaced vectors with lists for easier managment. --- game/game.cpp | 4 +- game/state/commands.cpp | 15 ++--- game/state/missile.cpp | 2 +- game/state/player.hpp | 4 +- game/state/state.cpp | 126 +++++++++++++++++----------------------- game/state/state.hpp | 12 ++-- 6 files changed, 72 insertions(+), 91 deletions(-) diff --git a/game/game.cpp b/game/game.cpp index b8da6a7..bf2c093 100644 --- a/game/game.cpp +++ b/game/game.cpp @@ -51,8 +51,8 @@ bool Game::cycle(float dt) float angle = 360.0 * util::randf_0_1(); float speed = 0.005; - m_state->players[0]->addCommand(new game::SetSpeedCommand(speed)); - m_state->players[0]->addCommand(new game::ShootCommand(angle)); + m_state->players.back()->addCommand(new game::SetSpeedCommand(speed)); + m_state->players.back()->addCommand(new game::ShootCommand(angle)); //static bool done = false; //if (total >= 10.0 && !done) { diff --git a/game/state/commands.cpp b/game/state/commands.cpp index 5f83dfd..1c6b434 100644 --- a/game/state/commands.cpp +++ b/game/state/commands.cpp @@ -58,16 +58,17 @@ namespace game { { std::cout<<"clearing traces!!!" << std::endl; - size_t i = 0; - while(i < state->traces.size()) { - Trace *trace = state->traces[i]; - if (trace->missile == nullptr && trace->player == player) { - state->deleteTrace(i); + std::vector rm; - } else { - i++; + for (Trace *trace : state->traces) { + if (trace->missile == nullptr && trace->player == player) { + rm.push_back(trace); } } + + for (Trace *trace : rm) { + state->traces.remove(trace); + } } #if 0 diff --git a/game/state/missile.cpp b/game/state/missile.cpp index cbc3e58..07e61c1 100644 --- a/game/state/missile.cpp +++ b/game/state/missile.cpp @@ -23,7 +23,7 @@ namespace game { Missile::~Missile() { - //std::cout<<"destroyed missile" << std::endl; + //std::cout<<"~Missile" << std::endl; } Missile::Event Missile::advance(const game::State *state, float dt) diff --git a/game/state/player.hpp b/game/state/player.hpp index 3a6aeb4..06fa8d4 100644 --- a/game/state/player.hpp +++ b/game/state/player.hpp @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include @@ -21,7 +21,7 @@ namespace game { float deadTimeCounter; Ship *ship; std::string name; - std::vector missiles; + std::list missiles; Player(int id) : id(id), alive(true), speed(0.01), energy(0.0), ship(nullptr), name("") { diff --git a/game/state/state.cpp b/game/state/state.cpp index 0f04ea0..3527b52 100644 --- a/game/state/state.cpp +++ b/game/state/state.cpp @@ -18,8 +18,6 @@ #include "util.hpp" -using namespace std; - namespace game { void State::init() { @@ -77,13 +75,21 @@ namespace game { void State::quitPlayer(int playerId) { - (void) playerId; - cout << playerId << " quit" << endl; + std::cout << playerId << " quit" << std::endl; + + Player *player = playerForId(playerId); + if (player != nullptr) { + for (Missile *missile : player->missiles) { + missile->player = nullptr; + } + + players.remove(player); + } } void State::clear(int playerId) { - cout << playerId << " clear" << endl; + std::cout << playerId << " clear" << std::endl; } void State::setName(int playerId, std::string name) @@ -158,13 +164,7 @@ namespace game { std::cout<<"player " << killer->id << " killed " << victim->id << std::endl; // destroy ship - size_t i; - for (i=0; iship) { - ships.erase(ships.begin() + i); - break; - } - } + ships.remove(victim->ship); delete(victim->ship); victim->ship = nullptr; @@ -181,11 +181,11 @@ namespace game { void State::advancePlayerMissiles(float dt) { + std::vector rm; + // advance missiles for (Player *player : players) { - size_t i = 0; - while (imissiles.size()) { - Missile *missile = player->missiles[i]; + for (Missile *missile : player->missiles) { //std::cout<<"missile: " << (long unsigned int) missile << std::endl; const Missile::Event evt = missile->advance(this, dt); @@ -196,59 +196,59 @@ namespace game { missile->trace->addPointFromMissile(isHit); // force point if missile gets destroyed a } - if (!isHit) { - i++; + if (!isHit) { + continue; + } - } else { - switch(evt.hit) { - case Hit::Planet: - //std::cout<<"hit Planet" << std::endl; - break; + switch(evt.hit) { + case Hit::Planet: + //std::cout<<"hit Planet" << std::endl; + break; - case Hit::Ship: - //std::cout<<"hit Player" << std::endl; - playerKillsPlayer(playerForId(evt.playerIdKiller), playerForId(evt.playerIdVictim)); - break; + case Hit::Ship: + //std::cout<<"hit Player" << std::endl; + playerKillsPlayer(playerForId(evt.playerIdKiller), playerForId(evt.playerIdVictim)); + break; - case Hit::BorderOfUniverse: - //std::cout<<"missile left the universe." << std::endl; - break; + case Hit::BorderOfUniverse: + //std::cout<<"missile left the universe." << std::endl; + break; - default: - break; - } + default: + break; + } - addExplosionFromHit(&evt); + addExplosionFromHit(&evt); - if (missile->trace != nullptr) { - missile->trace->finish(); - } + if (missile->trace != nullptr) { + missile->trace->finish(); + } - player->missiles.erase(player->missiles.begin() + i); - delete(missile); - //std::cout<missiles.remove(missile); + delete(missile); + } } } void State::advanceExplosions(float dt) { - size_t i=0; - while(i < explosions.size()) { - Explosion *explosion = explosions[i]; + std::vector rm; + + for (Explosion *explosion : explosions) { explosion->age += dt; if (explosion->age >= explosion->maxAge) { - delete(explosion); - explosions.erase(explosions.begin()+i); - continue; + rm.push_back(explosion); } - - i++; } + + for (Explosion *explosion : rm) { + explosions.remove(explosion); + delete(explosion); + } } void State::advance(float dt) @@ -260,7 +260,6 @@ namespace game { advancePlayerCommands(dt); advancePlayerMissiles(dt); - } Player *State::playerForId(int playerId) @@ -288,7 +287,6 @@ namespace game { pos = glm::vec2(0.0, 0.0); } else { pos = glm::vec2(util::randf_0_1(), util::randf_m1_1()); - //glm::linearRand(-1.0, 1.0), glm::linearRand(-1.0, 1.0)); } for (Planet *p : planets) { @@ -332,37 +330,19 @@ namespace game { traces.push_back(trace); } - void State::deleteTrace(size_t index) + void State::deleteTrace(Trace *trace) { - if (index >= traces.size()) { - std::cerr << "can't find trace with invalid index " << index << std::endl; - return; - } + traces.remove(trace); - Trace *trace = traces[index]; - - //std::cout<<"removing a trace" << std::endl; if (trace->missile != nullptr) { // delete backlink. // XXX: there's a missile without a trace now. trace->missile->trace = nullptr; } - traces.erase(traces.begin() + index); delete(trace); } - void State::deleteTrace(Trace *trace) - { - size_t i = 0; - while(i < traces.size()) { - if (traces[i] == trace) { - deleteTrace(i); - break; - } - } - } - void State::addExplosionFromHit(const Missile::Event *evt) { if (evt->hit == Hit::Nothing || evt->hit == Hit::BorderOfUniverse) { diff --git a/game/state/state.hpp b/game/state/state.hpp index c57a849..bf2e213 100644 --- a/game/state/state.hpp +++ b/game/state/state.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -75,7 +76,6 @@ namespace game { // delete traces with this command void deleteTrace(Trace *trace); // using a pointer - void deleteTrace(size_t index); // using an index /*************************************************************************/ /* Rendering */ @@ -83,11 +83,11 @@ namespace game { // Game items which should be rendered are here: // (access missiles by iterating over player's missiles attribute) - std::vector planets; - std::vector ships; - std::vector players; - std::vector traces; - std::vector explosions; + std::vector planets; + std::list ships; + std::list players; + std::list traces; + std::list explosions; private: /*************************************************************************/