diff --git a/README.md b/README.md index 20fdd47..fa1c3e9 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ The following keyboard shortcuts are available * E toggle v-sync. V-sync limits the number of frames per second, so disabling it speeds up the simulation. * A toggle the visibility of the traces. * space toggle slow-motion. +* D spawn a ball. * R reset the view. * esc close the application. diff --git a/src/main.cpp b/src/main.cpp index 7fe674d..005b64f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -83,6 +83,17 @@ struct Ball } }; +void spawn(std::vector& balls, int minSize, int maxSize) { + const float angle = RNGf::getUnder(2.0f * 3.141592653f); + const float radius = 350.0f; + + const float start_x = radius * cos(angle); + const float start_y = radius * sin(angle); + + balls.push_back(Ball(start_x + WIN_WIDTH * 0.5f, start_y + WIN_HEIGHT * 0.5f, + RNGf::getRange(static_cast(minSize), static_cast(maxSize)))); +} + bool update(std::vector& balls, float speed) { bool stable = true; @@ -212,16 +223,8 @@ int main() const float spawn_range_factor = 0.5f; std::vector balls; - for (int i(0); i < nBalls; i++) { - const float angle = RNGf::getUnder(2.0f * 3.141592653f); - const float radius = 350.0f; - - const float start_x = radius * cos(angle); - const float start_y = radius * sin(angle); - - balls.push_back(Ball(start_x + WIN_WIDTH * 0.5f, start_y + WIN_HEIGHT * 0.5f, - RNGf::getRange(static_cast(minSize), static_cast(maxSize)))); - } + for (int i(0); i < nBalls; i++) + spawn(balls, minSize, maxSize); sf::RenderTexture traces, blurTexture, renderer; blurTexture.create(WIN_WIDTH, WIN_HEIGHT); @@ -231,22 +234,26 @@ int main() traces.clear(sf::Color::Black); traces.display(); - DisplayManager display_manager(window); - display_manager.event_manager.addKeyReleasedCallback(sf::Keyboard::A, [&](sfev::CstEv) { drawTraces = !drawTraces; }); - display_manager.event_manager.addKeyReleasedCallback(sf::Keyboard::C, [&](sfev::CstEv) { traces.clear(); }); - display_manager.event_manager.addKeyReleasedCallback(sf::Keyboard::Space, [&](sfev::CstEv) { - speedDownFactorGoal = speedDownFactor == 1 ? 10.0f : 1.0f; - }); - display_manager.event_manager.addKeyReleasedCallback(sf::Keyboard::Escape, [&](sfev::CstEv) {window.close(); }); - display_manager.event_manager.addKeyReleasedCallback(sf::Keyboard::E, [&](sfev::CstEv) { - synccEnable = !synccEnable; - window.setVerticalSyncEnabled(synccEnable); - }); + DisplayManager display_manager(window); + display_manager.event_manager.addKeyReleasedCallback(sf::Keyboard::A, [&](sfev::CstEv) { drawTraces = !drawTraces; }); + display_manager.event_manager.addKeyReleasedCallback(sf::Keyboard::C, [&](sfev::CstEv) { traces.clear(); }); + display_manager.event_manager.addKeyReleasedCallback(sf::Keyboard::Space, [&](sfev::CstEv) { + speedDownFactorGoal = speedDownFactor == 1 ? 10.0f : 1.0f; + }); + display_manager.event_manager.addKeyReleasedCallback(sf::Keyboard::Escape, [&](sfev::CstEv) {window.close(); }); + display_manager.event_manager.addKeyReleasedCallback(sf::Keyboard::E, [&](sfev::CstEv) { + synccEnable = !synccEnable; + window.setVerticalSyncEnabled(synccEnable); + }); + display_manager.event_manager.addKeyReleasedCallback(sf::Keyboard::D, [&](sfev::CstEv) { + nBalls++; + spawn(balls, minSize, maxSize); + }); const Ball* focus = nullptr; uint32_t ok_count = 0; - + while (window.isOpen()) { sf::Vector2i mousePos = sf::Mouse::getPosition(window);