#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); // Nu låter vi speed vara uttryckt i "pixlar per sekund" istället. float const speed { 128.0f }; // För att mäta hur lång tid det har gått sedan föregående varv i // loopen så använder vi en klocka. sf::Clock clock; while (window.isOpen()) { // Hantera inmatning // I början av varje varv startar vi om klockan så att vi kan // mäta hur lång tid detta varv tar (så att nästa varv kan // utnyttja det). Notera att clock.restart() returnerar // tidsåtgången innan klocka startades om. sf::Time frame_duration { 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 // frame_duration.asSeconds() returnerar tidsåtgången sedan // förra uppdateringen i sekunder. // // För att få ut hur många pixlar vi då behöver förflytta // skeppet den här iterationen så multiplicerar vid 'speed' // med tidsåtgången. float current_speed { frame_duration.asSeconds() * speed }; if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::W)) { move_sprite(sprite, {0, -current_speed}, 0); } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::A)) { move_sprite(sprite, {-current_speed, 0}, 270); } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::S)) { move_sprite(sprite, {0, current_speed}, 180); } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::D)) { move_sprite(sprite, {current_speed, 0}, 90); } // Rita window.clear(); window.draw(sprite); window.draw(circle); window.display(); } }