diff --git a/basic/player.png b/basic/player.png new file mode 100644 index 0000000000000000000000000000000000000000..f19959c83b34b2833d9da7300114c225faa6a631 Binary files /dev/null and b/basic/player.png differ diff --git a/basic/step05.cpp b/basic/step05.cpp index c23a6448b2e9b0cf7bdc8efd8c62113f51aaf8fc..6041d202015370cfc931833db0b9a30a73a10fab 100644 --- a/basic/step05.cpp +++ b/basic/step05.cpp @@ -8,6 +8,7 @@ * Fundera på: * - Vad är skillnaden här jämfört med förra? * - Hur påverkas hastigheten av olika hastighet på programmet? + * - Hur fungerar detta med avseende på om programmet har fokus eller ej? */ diff --git a/basic/step06.cpp b/basic/step06.cpp index 976c26bd3a42dbf73be6c358116948b37dbe0828..32a3841fcd8d4108ff13ae81ccc9abca4f63220f 100644 --- a/basic/step06.cpp +++ b/basic/step06.cpp @@ -57,7 +57,7 @@ int main() { auto delta = clock.restart(); { - float distance = 250.0f * (delta.asMicroseconds() / 1000000.0f); + float distance = 250.0f * delta.asSeconds(); location += direction * distance; } diff --git a/basic/step07.cpp b/basic/step07.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c9bfd797e104c29a46c34bf3080529f99ff5bd32 --- /dev/null +++ b/basic/step07.cpp @@ -0,0 +1,120 @@ +#include <SFML/Graphics.hpp> +#include "point.h" +#include "standard.h" + +/** + * Steg 7: Alternativ hantering av tangentbordsinmatning. + * + * Fundera på: + * - Vad är fördelar och nackdelar gentemot förra lösningen? + * - Finns det problem med den här lösningen? + */ + + +const size_t width = 1024; +const size_t height = 768; + + +class Key_State { +public: + Key_State() + : up{false}, + down{false}, + left{false}, + right{false} + {} + + void onKey(sf::Keyboard::Key key, bool pressed) { + switch (key) { + case sf::Keyboard::W: + case sf::Keyboard::Up: + up = pressed; + break; + case sf::Keyboard::S: + case sf::Keyboard::Down: + down = pressed; + break; + case sf::Keyboard::A: + case sf::Keyboard::Left: + left = pressed; + break; + case sf::Keyboard::D: + case sf::Keyboard::Right: + right = pressed; + break; + default: + break; + } + } + + sf::Vector2f direction() const { + sf::Vector2f result; + if (up) + result.y -= 1; + if (down) + result.y += 1; + if (left) + result.x -= 1; + if (right) + result.x += 1; + return normalize(result); + } + +private: + bool up; + bool down; + bool left; + bool right; +}; + + +int main() { + sf::RenderWindow window{sf::VideoMode{width, height}, "Demo"}; + window.setKeyRepeatEnabled(false); + window.setVerticalSyncEnabled(true); + + sf::CircleShape circle{40}; + sf::Vector2f location{300, 300}; + + sf::Clock clock; + + Key_State keys; + + bool quit = false; + while (!quit) { + sf::Event event; + while (window.pollEvent(event)) { + switch (event.type) { + case sf::Event::Closed: + quit = true; + break; + case sf::Event::KeyPressed: + keys.onKey(event.key.code, true); + break; + case sf::Event::KeyReleased: + keys.onKey(event.key.code, false); + break; + default: + break; + } + } + + if (quit) + break; + + sf::Vector2f direction = keys.direction(); + + auto delta = clock.restart(); + { + float distance = 250.0f * delta.asSeconds(); + location += direction * distance; + } + + window.clear(); + circle.setPosition(location); + window.draw(circle); + window.display(); + } + + return 0; +} diff --git a/basic/step08.cpp b/basic/step08.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5a99a78e39457b5280d4dc918c1ab0d64c77c295 --- /dev/null +++ b/basic/step08.cpp @@ -0,0 +1,74 @@ +#include <SFML/Graphics.hpp> +#include "point.h" +#include "standard.h" + +/** + * Steg 8: Använda texturer. + */ + + +const size_t width = 1024; +const size_t height = 768; + +sf::Vector2f find_direction() { + sf::Vector2f direction; + if (sf::Keyboard::isKeyPressed(sf::Keyboard::W) || sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) + direction.y -= 1; + if (sf::Keyboard::isKeyPressed(sf::Keyboard::S) || sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) + direction.y += 1; + if (sf::Keyboard::isKeyPressed(sf::Keyboard::A) || sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) + direction.x -= 1; + if (sf::Keyboard::isKeyPressed(sf::Keyboard::D) || sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) + direction.x += 1; + + return normalize(direction); +} + +int main() { + sf::RenderWindow window{sf::VideoMode{width, height}, "Demo"}; + window.setKeyRepeatEnabled(false); + window.setVerticalSyncEnabled(true); + + sf::Texture texture; + texture.loadFromFile("player.png"); + + sf::Vector2f textureSize{texture.getSize()}; + sf::RectangleShape player{textureSize}; + player.setTexture(&texture); + player.setOrigin(textureSize / 2.0f); + sf::Vector2f location{300, 300}; + + sf::Clock clock; + + bool quit = false; + while (!quit) { + sf::Event event; + while (window.pollEvent(event)) { + switch (event.type) { + case sf::Event::Closed: + quit = true; + break; + default: + break; + } + } + + if (quit) + break; + + sf::Vector2f direction = find_direction(); + + auto delta = clock.restart(); + { + float distance = 250.0f * delta.asSeconds(); + location += direction * distance; + } + + window.clear(); + player.setPosition(location); + window.draw(player); + window.display(); + } + + return 0; +}