94 lines
3.4 KiB
C++
94 lines
3.4 KiB
C++
#include "maps.hpp"
|
|
|
|
#include "data.hpp"
|
|
#include "elements.hpp"
|
|
#include "globals.hpp"
|
|
|
|
#include <SFML/Graphics/RenderWindow.hpp>
|
|
#include <array>
|
|
#ifdef __APPLE__
|
|
#include <range/v3/view/cartesian_product.hpp>
|
|
#include <range/v3/view/iota.hpp>
|
|
namespace rv = ranges::views;
|
|
#else
|
|
#include <ranges>
|
|
namespace rv = std::views;
|
|
#endif
|
|
|
|
void Manager::clear() {
|
|
for (auto [i, j] : rv::cartesian_product(rv::iota(0, MAX_ROWS), rv::iota(0, MAX_COLS))) {
|
|
delete wall_list[i][j];
|
|
wall_list[i][j] = nullptr;
|
|
}
|
|
}
|
|
|
|
int Manager::get_active() { return _active; }
|
|
|
|
void Manager::set_active(int level) { _active = level; }
|
|
|
|
void Manager::set_next() {
|
|
_active++;
|
|
clear();
|
|
load(level_data[_active].data);
|
|
}
|
|
|
|
void Manager::set_previous() {
|
|
_active--;
|
|
clear();
|
|
load(level_data[_active].data);
|
|
}
|
|
|
|
void Manager::draw(sf::RenderWindow& window) {
|
|
for (auto [i, j] : rv::cartesian_product(rv::iota(0, MAX_ROWS), rv::iota(0, MAX_COLS))) {
|
|
if (wall_list[i][j] == nullptr) continue;
|
|
window.draw(wall_list[i][j]->rect);
|
|
}
|
|
}
|
|
|
|
void Manager::load(const std::array<std::array<char, MAX_COLS>, MAX_ROWS> map_data) {
|
|
for (auto [i, j] : rv::cartesian_product(rv::iota(0, MAX_ROWS), rv::iota(0, MAX_COLS))) {
|
|
if (map_data[i][j] == ' ') continue;
|
|
if (map_data[i][j] == '0') {
|
|
wall_list[i][j] = new Object { object_data[0] };
|
|
wall_list[i][j]->rect.setPosition({ wall_list[i][j]->rect.getPosition().x * j,
|
|
wall_list[i][j]->rect.getPosition().y * i });
|
|
}
|
|
if (map_data[i][j] == '1' && j + 1 < MAX_COLS && map_data[i][j + 1] == '2') {
|
|
int start = j, end = j + 1;
|
|
wall_list[i][j] = new Object { object_data[0] };
|
|
wall_list[i][j]->rect.setSize({ wall_list[i][j]->rect.getSize().x * float(end - start + 1),
|
|
wall_list[i][j]->rect.getSize().y });
|
|
wall_list[i][j]->rect.setPosition({ wall_list[i][j]->rect.getPosition().x * j,
|
|
wall_list[i][j]->rect.getPosition().y * i });
|
|
}
|
|
if (map_data[i][j] == '1' && i + 1 < MAX_ROWS && map_data[i + 1][j] == '2') {
|
|
int start = i, end = i + 1;
|
|
wall_list[i][j] = new Object { object_data[0] };
|
|
wall_list[i][j]->rect.setSize({ wall_list[i][j]->rect.getSize().x,
|
|
wall_list[i][j]->rect.getSize().y * float(end - start + 1) });
|
|
wall_list[i][j]->rect.setPosition({ wall_list[i][j]->rect.getPosition().x * j,
|
|
wall_list[i][j]->rect.getPosition().y * i });
|
|
}
|
|
if (map_data[i][j] == '1' && j + 1 < MAX_COLS && map_data[i][j + 1] == '-') {
|
|
int start = j, end = j;
|
|
while (end + 1 < MAX_COLS && map_data[i][end + 1] != '2') end++;
|
|
if (map_data[i][end + 1] == '2') end++;
|
|
wall_list[i][j] = new Object { object_data[0] };
|
|
wall_list[i][j]->rect.setSize({ wall_list[i][j]->rect.getSize().x * float(end - start + 1),
|
|
wall_list[i][j]->rect.getSize().y });
|
|
wall_list[i][j]->rect.setPosition({ wall_list[i][j]->rect.getPosition().x * j,
|
|
wall_list[i][j]->rect.getPosition().y * i });
|
|
}
|
|
if (map_data[i][j] == '1' && i + 1 < MAX_ROWS && map_data[i + 1][j] == '|') {
|
|
int start = i, end = i;
|
|
while (end + 1 < MAX_ROWS && map_data[end + 1][j] != '2') end++;
|
|
if (map_data[end + 1][j] == '2') end++;
|
|
wall_list[i][j] = new Object { object_data[0] };
|
|
wall_list[i][j]->rect.setSize({ wall_list[i][j]->rect.getSize().x,
|
|
wall_list[i][j]->rect.getSize().y * float(end - start + 1) });
|
|
wall_list[i][j]->rect.setPosition({ wall_list[i][j]->rect.getPosition().x * j,
|
|
wall_list[i][j]->rect.getPosition().y * i });
|
|
}
|
|
}
|
|
}
|