From 948a08f9d76b320fa357bdd483772a0c0e9a9d3a Mon Sep 17 00:00:00 2001 From: DarthMooMancer Date: Thu, 23 Oct 2025 17:27:04 -0400 Subject: [PATCH] optimizing for loops and player collisions --- include/elements.hpp | 5 ++-- src/elements.cpp | 19 +++++++++++-- src/main.cpp | 68 ++++++++++++++++++-------------------------- 3 files changed, 47 insertions(+), 45 deletions(-) diff --git a/include/elements.hpp b/include/elements.hpp index 2504d86..7e3ef29 100644 --- a/include/elements.hpp +++ b/include/elements.hpp @@ -34,8 +34,9 @@ public: bool get_jumping(); void horizontal_no_out_of_bounds(Entity &base); void vertical_no_out_of_bounds(Entity &base); - bool vertical_top_collision(Entity *wall_list[MAX_ROWS][MAX_COLS]); - bool vertical_bottom_collision(Entity *wall_list[MAX_ROWS][MAX_COLS]); + bool get_horizontal_collision(Entity *wall_list[MAX_ROWS][MAX_COLS]); + bool get_vertical_top_collision(Entity *wall_list[MAX_ROWS][MAX_COLS]); + bool get_vertical_bottom_collision(Entity *wall_list[MAX_ROWS][MAX_COLS]); }; #endif diff --git a/src/elements.cpp b/src/elements.cpp index 71332d5..b8aa571 100644 --- a/src/elements.cpp +++ b/src/elements.cpp @@ -95,7 +95,22 @@ void Player::vertical_no_out_of_bounds(Entity &base) { } } -bool Player::vertical_top_collision(Entity *wall_list[MAX_ROWS][MAX_COLS]) { +bool Player::get_horizontal_collision(Entity *wall_list[MAX_ROWS][MAX_COLS]) { + for(auto [i, j] : std::views::cartesian_product(std::views::iota(0, MAX_ROWS), std::views::iota(0, MAX_COLS))) { + if(wall_list[i][j] == nullptr) continue; + auto collision = wall_list[i][j]->find_intersection(*this); + if(collision == CollisionDir::None) continue; + if(collision == CollisionDir::Left) { + rect.setPosition({ wall_list[i][j]->rect.getPosition().x - rect.getSize().x, rect.getPosition().y }); + } + if(collision == CollisionDir::Right) { + rect.setPosition({ wall_list[i][j]->rect.getPosition().x + wall_list[i][j]->rect.getSize().x, rect.getPosition().y }); + } + } + return false; +} + +bool Player::get_vertical_top_collision(Entity *wall_list[MAX_ROWS][MAX_COLS]) { for(int i : std::views::iota(0, MAX_ROWS)) { for(int j : std::views::iota(0, MAX_COLS)) { if(wall_list[i][j] == nullptr) continue; @@ -111,7 +126,7 @@ bool Player::vertical_top_collision(Entity *wall_list[MAX_ROWS][MAX_COLS]) { return false; } -bool Player::vertical_bottom_collision(Entity *wall_list[MAX_ROWS][MAX_COLS]) { +bool Player::get_vertical_bottom_collision(Entity *wall_list[MAX_ROWS][MAX_COLS]) { for(int i : std::views::iota(0, MAX_ROWS)) { for(int j : std::views::iota(0, MAX_COLS)) { if(wall_list[i][j] == nullptr) continue; diff --git a/src/main.cpp b/src/main.cpp index 3f44412..e2697c5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -50,18 +50,14 @@ int main() { float border_size { -1.0f }; } simulated_data; - for(int i : std::views::iota(0, MAX_ROWS)) { - for(int j : std::views::iota(0, MAX_COLS)) { - if(map_data[i][j] != 1) continue; - wall_list[i][j] = new Entity { tile_data.size, tile_data.pos, tile_data.velocity, tile_data.border_size, sf::Color::Black }; - } + for(auto[i, j] : std::views::cartesian_product(std::views::iota(0, MAX_ROWS), std::views::iota(0, MAX_COLS))) { + if(map_data[i][j] != 1) continue; + wall_list[i][j] = new Entity { tile_data.size, tile_data.pos, tile_data.velocity, tile_data.border_size, sf::Color::Black }; } - for(int i : std::views::iota(0, MAX_ROWS)) { - for(int j : std::views::iota(0, MAX_COLS)) { - if(wall_list[i][j] == nullptr) continue; - wall_list[i][j]->rect.setPosition({ (j * tile_data.size.x), (i * tile_data.size.y) }); - } + for(auto[i, j] : std::views::cartesian_product(std::views::iota(0, MAX_ROWS), std::views::iota(0, MAX_COLS))) { + if(wall_list[i][j] == nullptr) continue; + wall_list[i][j]->rect.setPosition({ (j * tile_data.size.x), (i * tile_data.size.y) }); } Player player { @@ -85,7 +81,6 @@ int main() { sf::Text text(font, "0, 0", 16); text.setPosition({ WIDTH - (TILESIZE * 11.5), HEIGHT - (int)(TILESIZE / 1.5)}); - float f = -1; while (window.isOpen()) { window.clear(sf::Color::Black); text.setString(std::to_string((int)player.rect.getPosition().x) + ", " + std::to_string((int)player.rect.getPosition().y)); @@ -96,48 +91,39 @@ int main() { if(sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Escape)) { window.close(); } - - player.handle_movment(); - for(int i : std::views::iota(0, MAX_ROWS)) { - for(int j : std::views::iota(0, MAX_COLS)) { - if(wall_list[i][j] == nullptr) continue; - auto collision = wall_list[i][j]->find_intersection(player); - if(collision == CollisionDir::None) continue; - switch (collision) { - case CollisionDir::Left: - player.rect.setPosition({ wall_list[i][j]->rect.getPosition().x - player.rect.getSize().x, player.rect.getPosition().y }); - break; - case CollisionDir::Right: - player.rect.setPosition({ wall_list[i][j]->rect.getPosition().x + wall_list[i][j]->rect.getSize().x, player.rect.getPosition().y }); - break; - default: break; - } - } + if(sf::Keyboard::isKeyPressed(sf::Keyboard::Key::W)) { + player.set_velocity_x(20); } + + // Handle Horizontal movement and collisions + player.handle_movment(); + player.get_horizontal_collision(wall_list); + player.horizontal_no_out_of_bounds(line); + + if(player.get_velocity().x > 4) { + player.set_velocity_x(player.get_velocity().x - player.m_acceleration); + } + + // Handle Vertical movement and collisions player.set_velocity_y(player.get_velocity().y + player.m_acceleration); player.rect.move({0, player.get_velocity().y}); - if(!player.vertical_bottom_collision(wall_list)) { - player.vertical_top_collision(wall_list); + if(!player.get_vertical_bottom_collision(wall_list)) { + player.get_vertical_top_collision(wall_list); } player.vertical_no_out_of_bounds(line); - player.horizontal_no_out_of_bounds(line); - for(int i : std::views::iota(0, MAX_ROWS)) { - for(int j : std::views::iota(0, MAX_COLS)) { - if(wall_list[i][j] != nullptr) { - window.draw(wall_list[i][j]->rect); - } - } + // Drawing Everything to window + for(auto[i, j] : std::views::cartesian_product(std::views::iota(0, MAX_ROWS), std::views::iota(0, MAX_COLS))) { + if(wall_list[i][j] == nullptr) continue; + window.draw(wall_list[i][j]->rect); } window.draw(player.rect); window.draw(line.rect); window.draw(text); window.display(); } - for(int i : std::views::iota(0, MAX_ROWS)) { - for(int j : std::views::iota(0, MAX_COLS)) { - delete wall_list[i][j]; - } + for(auto[i, j] : std::views::cartesian_product(std::views::iota(0, MAX_ROWS), std::views::iota(0, MAX_COLS))) { + delete wall_list[i][j]; } }