#ifndef PLAYER_H #define PLAYER_H // !!!!!!!!!!! OBS !!!!!!!!!!! // Notera att denna fil inte kompilerar, utan är endast ett // kompletterande exempel på hur ett spelobjekt kan tänkas se ut #include #include #include "state.h" class Player_Ship : public Game_Object { public: Player_Ship(sf::Vector2f position) { if (!texture.loadFromFile("fighter.png")) { throw std::runtime_error{"Couldn't open 'fighter.png'"}; } sprite.setTexture(texture); sf::Vector2u texture_size { texture.getSize() }; sprite.setOrigin(texture_size.x / 2, texture_size.y / 2); sprite.setPosition(position); } bool handle(sf::Event) override { // för den här klassen gör vi ingenting här return false; } void update(sf::Time delta) override { float const speed { 128.0f }; float current_speed { delta.asSeconds() * speed }; if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::W)) { sprite.setRotation(0); sprite.move(0, -current_speed); } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::A)) { sprite.setRotation(270); sprite.move(-current_speed, 0); } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::S)) { sprite.setRotation(180); sprite.move(0, current_speed); } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::D)) { sprite.setRotation(90); sprite.move(current_speed, 0); } } void render(sf::RenderWindow& window) override { window.draw(sprite); } sf::FloatRect bounds() const override { return sprite.getGlobalBounds(); } void collision(Game_Object* other) override { // Kolla om objekt vi tog emot (other) är en typ som ärver av // (eller är en) Enemy. Detta gör vi genom att försöka omvandla // other pekaren från Game_Object* till Enemy* m.h.a. dynamic_cast. // // Om denna typomvandlig inte var giltig (d.v.s. att other // inte är en Enemy) så blir enemy pekaren nullptr. Men om det // gick så blir det en giltig Enemy pekare till objektet. Enemy* enemy { dynamic_cast(other) }; if (enemy != nullptr) { // Om den vi kolliderade med är en Enemy så förlorar // spelaren lite hälsa. health -= 10; } } private: sf::Texture texture; sf::Sprite sprite; float health { 100.0f }; }; #endif