Commit b09b172d authored by Авдеев Евгений Владимирович's avatar Авдеев Евгений Владимирович
Browse files

created teleport betwen walls

parent e0d11226
No related merge requests found
Showing with 122 additions and 24 deletions
+122 -24
......@@ -121,9 +121,19 @@ void SimpleBuilder::set_rooms_sides() {
}
if (j == 0) {
side = std::make_shared<Wall>(*m_rooms.at(i).at(j));
m_rooms.at(i).at(j)->set_side(Room::Direction::LEFT, side);
m_rooms.at(i).at(j)->get_side(Room::Direction::LEFT)->prepare_for_drawing();
if (i == m_rooms_in_col / 2) {
side = std::make_shared<Teleport>(*m_rooms.at(i).at(j), *m_rooms.at(i).at(m_rooms_in_row - 1));
m_rooms.at(i).at(j)->set_side(Room::Direction::LEFT, side);
m_rooms.at(i).at(j)->get_side(Room::Direction::LEFT)->prepare_for_drawing();
side = std::make_shared<Teleport>(*m_rooms.at(i).at(j), *m_rooms.at(i).at(m_rooms_in_row - 1));
m_rooms.at(i).at(m_rooms_in_row - 1)->set_side(Room::Direction::RIGHT, side);
m_rooms.at(i).at(m_rooms_in_row - 1)->get_side(Room::Direction::RIGHT)->prepare_for_drawing();
}
else {
side = std::make_shared<Wall>(*m_rooms.at(i).at(j));
m_rooms.at(i).at(j)->set_side(Room::Direction::LEFT, side);
m_rooms.at(i).at(j)->get_side(Room::Direction::LEFT)->prepare_for_drawing();
}
}
else {
side = std::make_shared<Pass>(*m_rooms.at(i).at(j), *m_rooms.at(i).at(j - 1));
......@@ -131,9 +141,14 @@ void SimpleBuilder::set_rooms_sides() {
}
if (j == m_rooms_in_row - 1) {
side = std::make_shared<Wall>(*m_rooms.at(i).at(j));
m_rooms.at(i).at(j)->set_side(Room::Direction::RIGHT, side);
m_rooms.at(i).at(j)->get_side(Room::Direction::RIGHT)->prepare_for_drawing();
if(i == m_rooms_in_col / 2){
continue;
}
else {
side = std::make_shared<Wall>(*m_rooms.at(i).at(j));
m_rooms.at(i).at(j)->set_side(Room::Direction::RIGHT, side);
m_rooms.at(i).at(j)->get_side(Room::Direction::RIGHT)->prepare_for_drawing();
}
}
else {
side = std::make_shared<Pass>(*m_rooms.at(i).at(j), *m_rooms.at(i).at(j + 1));
......@@ -243,9 +258,11 @@ void ComplexBuilder::create_rooms() {
void ComplexBuilder::set_rooms_sides() {
std::shared_ptr<IRoomSide> side;
size_t counter = 0;
for (size_t i = 0; i < m_rooms_in_col; ++i) {
std::cout << "rows = " << m_rooms_in_col << "; cols = " << m_rooms.at(i).size() << "; in_row = " << m_rooms_in_row << '\n';
for (size_t j = 0; j < m_rooms.at(i).size(); ++j) {
std::cout << " i = " << i << "; j = " << j << '\n';
if (i % 2 == 1) { //
if (j % 2 == 0) {
side = std::make_shared<Wall>(*m_rooms.at(i).at(j));
......@@ -262,18 +279,34 @@ void ComplexBuilder::set_rooms_sides() {
m_rooms.at(i).at(j)->set_side(Room::Direction::DOWN, side);
}
if (j == 0) {
side = std::make_shared<Wall>(*m_rooms.at(i).at(j));
m_rooms.at(i).at(j)->set_side(Room::Direction::LEFT, side);
m_rooms.at(i).at(j)->get_side(Room::Direction::LEFT)->prepare_for_drawing();
if (i == m_rooms_in_col / 2) {
std::cout << "WOOOOOOOOOOOOOOOOOOOOOOORK\n";
side = std::make_shared<Teleport>(*m_rooms.at(i).at(j), *m_rooms.at(i).back());
m_rooms.at(i).at(j)->set_side(Room::Direction::LEFT, side);
m_rooms.at(i).at(j)->get_side(Room::Direction::LEFT)->prepare_for_drawing();
side = std::make_shared<Teleport>(*m_rooms.at(i).at(j), *m_rooms.at(i).back());
m_rooms.at(i).back()->set_side(Room::Direction::RIGHT, side);
m_rooms.at(i).back()->get_side(Room::Direction::RIGHT)->prepare_for_drawing();
}
else {
side = std::make_shared<Wall>(*m_rooms.at(i).at(j));
m_rooms.at(i).at(j)->set_side(Room::Direction::LEFT, side);
m_rooms.at(i).at(j)->get_side(Room::Direction::LEFT)->prepare_for_drawing();
}
}
else {
side = std::make_shared<Pass>(*m_rooms.at(i).at(j), *m_rooms.at(i).at(j - 1));
m_rooms.at(i).at(j)->set_side(Room::Direction::LEFT, side);
}
if (j == m_rooms_in_row - 1) {
side = std::make_shared<Wall>(*m_rooms.at(i).at(j));
m_rooms.at(i).at(j)->set_side(Room::Direction::RIGHT, side);
m_rooms.at(i).at(j)->get_side(Room::Direction::RIGHT)->prepare_for_drawing();
if (i == m_rooms_in_col / 2) {
continue;
}
else {
side = std::make_shared<Wall>(*m_rooms.at(i).at(j));
m_rooms.at(i).at(j)->set_side(Room::Direction::RIGHT, side);
m_rooms.at(i).at(j)->get_side(Room::Direction::RIGHT)->prepare_for_drawing();
}
}
else {
side = std::make_shared<Pass>(*m_rooms.at(i).at(j), *m_rooms.at(i).at(j + 1));
......@@ -281,15 +314,39 @@ void ComplexBuilder::set_rooms_sides() {
}
}
else {
//if (j % 2 == 0) { continue; }
side = std::make_shared<Wall>(*m_rooms.at(i).at(j));
m_rooms.at(i).at(j)->set_side(Room::Direction::RIGHT, side);
m_rooms.at(i).at(j)->get_side(Room::Direction::RIGHT)->prepare_for_drawing();
side = std::make_shared<Wall>(*m_rooms.at(i).at(j));
m_rooms.at(i).at(j)->set_side(Room::Direction::LEFT, side);
m_rooms.at(i).at(j)->get_side(Room::Direction::LEFT)->prepare_for_drawing();
if ((j == 0 || j == (m_rooms.at(i).size()-1)) && i == m_rooms_in_col / 2) {
if (counter != 0) {
++counter;
}
else {
side = std::make_shared<Teleport>(*m_rooms.at(i).at(j), *m_rooms.at(i).at(m_rooms.at(i).size() - 1));
m_rooms.at(i).at(j)->set_side(Room::Direction::LEFT, side);
m_rooms.at(i).at(j)->get_side(Room::Direction::LEFT)->prepare_for_drawing();
side = std::make_shared<Wall>(*m_rooms.at(i).at(j));
m_rooms.at(i).at(j)->set_side(Room::Direction::RIGHT, side);
m_rooms.at(i).at(j)->get_side(Room::Direction::RIGHT)->prepare_for_drawing();
side = std::make_shared<Teleport>(*m_rooms.at(i).at(j), *m_rooms.at(i).at(m_rooms.at(i).size() - 1));
m_rooms.at(i).at(m_rooms.at(i).size() - 1)->set_side(Room::Direction::RIGHT, side);
m_rooms.at(i).at(m_rooms.at(i).size() - 1)->get_side(Room::Direction::RIGHT)->prepare_for_drawing();
side = std::make_shared<Wall>(*m_rooms.at(i).at(m_rooms.at(i).size() - 1));
m_rooms.at(i).at(m_rooms.at(i).size() - 1)->set_side(Room::Direction::LEFT, side);
m_rooms.at(i).at(m_rooms.at(i).size() - 1)->get_side(Room::Direction::LEFT)->prepare_for_drawing();
++counter;
}
}
else {
side = std::make_shared<Wall>(*m_rooms.at(i).at(j));
m_rooms.at(i).at(j)->set_side(Room::Direction::RIGHT, side);
m_rooms.at(i).at(j)->get_side(Room::Direction::RIGHT)->prepare_for_drawing();
side = std::make_shared<Wall>(*m_rooms.at(i).at(j));
m_rooms.at(i).at(j)->set_side(Room::Direction::LEFT, side);
m_rooms.at(i).at(j)->get_side(Room::Direction::LEFT)->prepare_for_drawing();
}
if (i == 0) {
side = std::make_shared<Wall>(*m_rooms.at(i).at(j));
m_rooms.at(i).at(j)->set_side(Room::Direction::UP, side);
......
......@@ -44,6 +44,7 @@ namespace config {
const sf::Color GAME_COLOR_PACMAN{ 250, 150, 0 };
const sf::Color GAME_COLOR_ROOM{ 0, 0, 0 };
const sf::Color GAME_COLOR_WALL{ 80, 190, 255 };
const sf::Color GAME_COLOR_TELEPORT{ 255, 0, 0 };
const sf::Color GAME_FOOD_COLOR{ 0, 200, 100 };
const sf::Color GAME_ENEMY_COLOR{ 255, 50, 0 };
}
\ No newline at end of file
......@@ -8,8 +8,6 @@ GameContext GameContext::clone() {
for (auto& dyn : dynamic_obj) {
context.dynamic_obj.emplace_back(dyn->clone());
}
for (auto& stat : static_obj) {
context.static_obj.emplace_back(stat->clone());
}
......
......@@ -63,6 +63,35 @@ void Pass::enter(IEntity* entity) {
}
}
Teleport::Teleport(Room& room1, Room& room2) : m_room_left(room1), m_room_right(room2) {}
void Teleport::draw_into(sf::RenderWindow& window) const {
window.draw(m_line_left, 2, sf::Lines);
window.draw(m_line_right, 2, sf::Lines);
};
void Teleport::prepare_for_drawing() {
sf::Vector2f pos_left = m_room_left.get_position();
sf::Vector2f pos_right = m_room_right.get_position();
float size = config::ROOM_SIZE;
m_line_left[0] = sf::Vertex({ pos_left.x - size / 2, pos_left.y + size / 2 }, config::GAME_COLOR_TELEPORT);
m_line_left[1] = sf::Vertex({ pos_left.x - size / 2, pos_left.y - size / 2 }, config::GAME_COLOR_TELEPORT);
m_line_right[0] = sf::Vertex({ pos_right.x + size / 2, pos_right.y - size / 2 }, config::GAME_COLOR_TELEPORT);
m_line_right[1] = sf::Vertex({ pos_right.x + size / 2, pos_right.y + size / 2 }, config::GAME_COLOR_TELEPORT);
};
void Teleport::enter(IEntity* entity) {
if (entity->get_location() == &m_room_left) {
entity->set_location(&m_room_right);
}
else {
entity->set_location(&m_room_left);
}
}
Wall::Wall(Room& room) : m_room(room) {}
void Wall::draw_into(sf::RenderWindow& window) const {
......
......@@ -62,3 +62,16 @@ public:
void draw_into(sf::RenderWindow& window) const override;
};
class Teleport :public IRoomSide {
private:
Room& m_room_right;
Room& m_room_left;
sf::Vertex m_line_left[2];
sf::Vertex m_line_right[2];
public:
Teleport(Room& room1, Room& room2);
void enter(IEntity* entity) override;
void prepare_for_drawing() override;
void draw_into(sf::RenderWindow& window) const override;
};
\ No newline at end of file
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment