From 99f61312354cd8a950491e5c7a7b744f06b7d17d Mon Sep 17 00:00:00 2001 From: Claudio Hoffmann <hoffmanncl72341@th-nuernberg.de> Date: Sat, 16 Jan 2021 17:39:46 +0100 Subject: [PATCH] Level: Prevent overlapping Scenery and Wall objects --- Level.cpp | 27 +++++++++++++++++++++++---- Level.hpp | 5 +++-- Position.hpp | 4 ++++ main.cpp | 48 ++++++++++++++++++++++++------------------------ 4 files changed, 54 insertions(+), 30 deletions(-) diff --git a/Level.cpp b/Level.cpp index 6a4d9fc..78f62e6 100644 --- a/Level.cpp +++ b/Level.cpp @@ -1,3 +1,4 @@ +#include <algorithm> #include "Level.hpp" #include "player.hpp" #include "Enemyprojectile.hpp" @@ -36,6 +37,11 @@ void Wall::setWallColor(Color color) this->wallColor = color; } +Orientation Wall::getOrientation() const +{ + return this->wallOrientation; +} + // Scenery stuff -------------------------------------------------------------------------- Scenery::Scenery(Position const &pos, SceneryType type) @@ -78,14 +84,27 @@ Level::Level(int width, int heigth, Player &player) : borders.push_back(Wall(heigth, thickness, { static_cast<float>(width - thickness), 0.0f }, Orientation::Vertical)); } -void Level::addWall(int length, int thickness, float posX, float posY, Orientation orientation) +void Level::addWall(int length, int thickness, Position const &topleft, Orientation orientation) { - wallVector.emplace_back(Wall{ length, thickness, { posX, posY }, orientation }); + if(std::none_of( + wallVector.begin(), wallVector.end(), [&](Wall const &i) { + return ( + (i.getTopLeft() == topleft) && + (orientation == i.getOrientation()) + ); + })) { + wallVector.emplace_back(Wall{ length, thickness, topleft, orientation }); + } } -void Level::addScenery(float posX, float posY, SceneryType type) +void Level::addScenery(Position const &topleft, SceneryType type) { - sceneryVector.emplace_back(Scenery{ { posX, posY }, type }); + if(std::none_of( + sceneryVector.begin(), sceneryVector.end(), [&](Scenery const &i) { + return (i.getTopLeft() == topleft); + })) { + sceneryVector.emplace_back(Scenery{ topleft, type }); + } } void Level::addEnemy(std::unique_ptr<Enemy> enemy_) diff --git a/Level.hpp b/Level.hpp index f15a313..af1b93d 100644 --- a/Level.hpp +++ b/Level.hpp @@ -31,6 +31,7 @@ public: DynamicPixelBuffer constructWallBuffer(Orientation orientation, int length, int thickness); PixelBuffer const& getSprite() override; void setWallColor(Color color); + Orientation getOrientation() const; private: int wallLength; @@ -128,8 +129,8 @@ public: Level(int width, int heigth, Player &player); void addEnemyProjectile(const EnemyProjectile & projectile); void addPlayerProjectile(const PlayerProjectile& projectile); - void addWall(int length, int thickness, float posX, float posY, Orientation orientation); - void addScenery(float posX, float posY, SceneryType type); + void addWall(int length, int thickness, Position const &topleft, Orientation orientation); + void addScenery(Position const &topleft, SceneryType type); void addEnemy(std::unique_ptr<Enemy> enemy_); void fillTrooperSpawner(float posX, float posY, unsigned int nmbrEnemies); std::unique_ptr<Enemy> getTrooperSpawn(); diff --git a/Position.hpp b/Position.hpp index 7891185..bc532b2 100644 --- a/Position.hpp +++ b/Position.hpp @@ -22,6 +22,10 @@ public: float X; float Y; + bool operator ==(Position const &other) const { + return ((X == other.X) && (Y == other.Y)); + } + operator PixelPoint() const { return { static_cast<int>(X), static_cast<int>(Y) }; } diff --git a/main.cpp b/main.cpp index b51b86b..15bff34 100644 --- a/main.cpp +++ b/main.cpp @@ -37,10 +37,10 @@ void addBuilding(float x, float y, int size, Level &level_ptr) { int thickness = 3; // adds a Wall to the level (length, thickness, position X, position Y, orientation) - level_ptr.addWall(size, thickness, x, y, Orientation::Horizontal); - level_ptr.addWall(size, thickness, x, y + size - thickness, Orientation::Horizontal); - level_ptr.addWall(size, thickness, x, y, Orientation::Vertical); - level_ptr.addWall(size, thickness, x + size - thickness, y, Orientation::Vertical); + level_ptr.addWall(size, thickness, { x, y }, Orientation::Horizontal); + level_ptr.addWall(size, thickness, { x, y + size - thickness }, Orientation::Horizontal); + level_ptr.addWall(size, thickness, { x, y }, Orientation::Vertical); + level_ptr.addWall(size, thickness, { x + size - thickness, y }, Orientation::Vertical); } // kruegerzo72182> // <hoffmanncl72341 @@ -252,26 +252,26 @@ int run(Platform &platform) addBuilding(10, 200, 15, level1); addBuilding(285, 270, 15, level1); // adds a scenery object to the level (position X, position Y, scenerytype) - level1.addScenery(150, 80, SceneryType::Dead_Tree); - level1.addScenery(50, 200, SceneryType::Dead_Tree); - level1.addScenery(280, 290, SceneryType::Dead_Tree); - level1.addScenery(200, 220, SceneryType::Dead_Tree); - level1.addScenery(40, 15, SceneryType::Rock); - level1.addScenery(40, 15, SceneryType::Rock); - level1.addScenery(270, 65, SceneryType::Rock); - level1.addScenery(230, 135, SceneryType::Rock); - level1.addScenery(30, 90, SceneryType::Rock); - level1.addScenery(100, 40, SceneryType::Rubble); - level1.addScenery(250, 190, SceneryType::Rubble); - level1.addScenery(60, 270, SceneryType::Rubble); - level1.addScenery(205, 250, SceneryType::Rubble); - level1.addScenery(200, 100, SceneryType::Bush); - level1.addScenery(180, 280, SceneryType::Bush); - level1.addScenery(240, 275, SceneryType::Bush); - level1.addScenery(270, 240, SceneryType::Bush); - level1.addScenery(100, 250, SceneryType::Bush); - level1.addScenery(280, 165, SceneryType::Bush); - level1.addScenery(245, 25, SceneryType::Bush); + level1.addScenery({ 150, 80 }, SceneryType::Dead_Tree); + level1.addScenery({ 50, 200 }, SceneryType::Dead_Tree); + level1.addScenery({ 280, 290 }, SceneryType::Dead_Tree); + level1.addScenery({ 200, 220 }, SceneryType::Dead_Tree); + level1.addScenery({ 40, 15 }, SceneryType::Rock); + level1.addScenery({ 40, 15 }, SceneryType::Rock); + level1.addScenery({ 270, 65 }, SceneryType::Rock); + level1.addScenery({ 230, 135 }, SceneryType::Rock); + level1.addScenery({ 30, 90 }, SceneryType::Rock); + level1.addScenery({ 100, 40 }, SceneryType::Rubble); + level1.addScenery({ 250, 190 }, SceneryType::Rubble); + level1.addScenery({ 60, 270 }, SceneryType::Rubble); + level1.addScenery({ 205, 250 }, SceneryType::Rubble); + level1.addScenery({ 200, 100 }, SceneryType::Bush); + level1.addScenery({ 180, 280 }, SceneryType::Bush); + level1.addScenery({ 240, 275 }, SceneryType::Bush); + level1.addScenery({ 270, 240 }, SceneryType::Bush); + level1.addScenery({ 100, 250 }, SceneryType::Bush); + level1.addScenery({ 280, 165 }, SceneryType::Bush); + level1.addScenery({ 245, 25 }, SceneryType::Bush); // add enemies to the level level1.addEnemy(std::make_unique<Tank>(Tank(50, 150, direction::BACK, 0))); -- GitLab