#include #include #include unsigned const screen_width { 640 }; unsigned const screen_height { 640 }; void move_sprite(sf::Sprite& sprite, sf::Vector2f direction, float angle) { sprite.setRotation(angle); sprite.move(direction); } int main() { sf::RenderWindow window { sf::VideoMode { screen_width, screen_height }, "Basic SFML Example" }; float const radius { 16.0 }; sf::CircleShape circle { radius }; circle.setOrigin(radius, radius); circle.setFillColor(sf::Color::Green); sf::Vector2u window_size { window.getSize() }; circle.setPosition(window_size.x / 2, window_size.y / 2); sf::Texture texture { }; if (!texture.loadFromFile("fighter.png")) { std::cerr << "Kan inte öppna: fighter.png" << std::endl; return 1; } sf::Sprite sprite { texture }; sf::Vector2u texture_size { texture.getSize() }; sprite.setOrigin(texture_size.x / 2, texture_size.y / 2); sprite.setPosition(window_size.x / 2, 3 * window_size.y / 4); // Mät tidsåtgång för varje varv i Main-loopen sf::Clock clock; // Antal bildrutor per sekund float const fps { 60.0f }; // beräkna hur lång tid vi har per frame sf::Time const target { sf::milliseconds (1000.0 / fps) }; // Vi vill ha 128 pixlar per sekund, så pixlar per bildruta blir 128 / fps float const speed { 128.0f / fps }; while (window.isOpen()) { // Hantera inmatning // Börja tidtagning clock.restart(); sf::Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) { window.close(); } else if (event.type == sf::Event::MouseButtonPressed) { sf::Event::MouseButtonEvent mouse { event.mouseButton }; if (mouse.button == sf::Mouse::Button::Left) { circle.setPosition(mouse.x, mouse.y); } } } // Uppdatera logiken if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::W)) { move_sprite(sprite, {0, -speed}, 0); } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::A)) { move_sprite(sprite, {-speed, 0}, 270); } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::S)) { move_sprite(sprite, {0, speed}, 180); } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::D)) { move_sprite(sprite, {speed, 0}, 90); } // Rita window.clear(); window.draw(sprite); window.draw(circle); window.display(); // Plocka ut tidsåtgången för det här varvet sf::Time elapsed_time { clock.getElapsedTime() }; // Vänta tills den här iterationen har tagit 'target' tid. sf::sleep(target - elapsed_time); } }