#include "imgui.h" #include "imgui-SFML.h" #define _USE_MATH_DEFINES #include #include #include #include #include #include #include void ImGui_setup(sf::RenderWindow &window) { int res = ImGui::SFML::Init(window); if(res == 1) { fmt::print("ImGui returned result {}\n", res); } else { fmt::print("ImGui returned an error code={}\n", res); } } void ImGui_update(sf::RenderWindow &window, sf::Clock &deltaClock, sf::Time &tick) { ImGui::SFML::Update(window, deltaClock.restart()); // ImGui::ShowDemoWindow(); ImGui::Begin("Clock"); sf::Vector2u size = window.getSize(); ImGui::SetWindowPos(ImVec2(size.x - 150, 0)); ImGui::SetWindowSize(ImVec2(150, 50)); std::string msg = fmt::format("Time: {}\n", tick.asSeconds()); ImGui::Button(msg.c_str()); ImGui::End(); } void Window_update(sf::RenderWindow &window, sf::Shape &shape) { window.clear(); window.draw(shape); ImGui::SFML::Render(window); window.display(); } struct BoxTest { b2Body *groundBody; b2Body *body; }; struct BoxTest Box2d_setup(b2World &world) { b2BodyDef groundBodyDef; groundBodyDef.position.Set(0.0f, -10.0f); b2Body *groundBody = world.CreateBody(&groundBodyDef); b2PolygonShape groundBox; groundBox.SetAsBox(50.0f, 10.0f); groundBody->CreateFixture(&groundBox, 0.0f); b2BodyDef bodyDef; bodyDef.type = b2_dynamicBody; bodyDef.position.Set(3.0f, 4.0f); b2Body *body = world.CreateBody(&bodyDef); b2PolygonShape dynamicBox; dynamicBox.SetAsBox(1.0f, 1.0f); b2FixtureDef fixtureDef; fixtureDef.shape = &dynamicBox; fixtureDef.density = 1.0f; fixtureDef.friction = 0.3f; body->CreateFixture(&fixtureDef); BoxTest box {groundBody, body}; return box; } int main() { fmt::print("Setting up a window for you...\n"); sf::ContextSettings settings; settings.antialiasingLevel = 8; sf::RenderWindow window(sf::VideoMode(1920, 1080), "Simple Game Demo", sf::Style::Default, settings); // window.setFramerateLimit(60); window.setVerticalSyncEnabled(true); ImGui_setup(window); sf::CircleShape shape(50.f, 4); sf::Vector2u winSize = window.getSize(); shape.setPosition(winSize.x / 2, winSize.y / 2); shape.setOrigin(50.f, 50.f); shape.setFillColor(sf::Color(150, 50, 250)); shape.setOutlineThickness(10.f); shape.setOutlineColor(sf::Color(250, 150, 100)); sf::Clock deltaClock; sf::Clock clock; sf::Time tick = clock.getElapsedTime(); // very cool, c++11 lambdas doing a 1 second slept thread sf::Thread thread([](){ for(int i = 0; i < 10; i++) { fmt::print("I'm a thread. {}\n", i); sf::sleep(sf::seconds(1)); } }); thread.launch(); b2Vec2 gravity(0.0f, -10.0f); b2World world(gravity); BoxTest box = Box2d_setup(world); float timeStep = 1.0f / 60.0f; int velocityIterations = 6; int positionIterations = 2; while (window.isOpen()) { sf::Event event; // is this a main event loop while (window.pollEvent(event)) { ImGui::SFML::ProcessEvent(window, event); switch(event.type) { case sf::Event::Closed: fmt::print("Exiting...\n"); window.close(); thread.terminate(); break; case sf::Event::KeyPressed: if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) { b2Vec2 force(-200, 1000); box.body->ApplyForceToCenter(force, true); } else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) { b2Vec2 force(200, 1000); box.body->ApplyForceToCenter(force, true); } break; case sf::Event::MouseButtonPressed: if(sf::Mouse::isButtonPressed(sf::Mouse::Left)) { b2Vec2 force(-200, 1000); box.body->ApplyForceToCenter(force, true); box.body->ApplyTorque(100.0f, true); } else if (sf::Mouse::isButtonPressed(sf::Mouse::Right)) { b2Vec2 force(200, 1000); box.body->ApplyForceToCenter(force, true); box.body->ApplyTorque(-100.0f, true); } break; } } // should this move up to the pollEvent loop? sf::Time since = clock.getElapsedTime(); if(since - tick > sf::seconds(1)) { tick = since; } world.Step(timeStep, velocityIterations, positionIterations); b2Vec2 position = box.body->GetPosition(); float angle = box.body->GetAngle(); shape.setPosition(position.x * 100.0f, winSize.y - position.y * 100.0f); shape.setRotation(angle * 180.0f / M_PI); ImGui_update(window, deltaClock, tick); Window_update(window, shape); } ImGui::SFML::Shutdown(); }