#include <Configuration.h> #include <States/GameState/Entities/DynamicEntities/DynamicEntities.h> #include <States/GameState/Entities/Pacman/Pacman.h> #include <States/GameState/Entities/StaticEntities/StaticEntities.h> Pacman::Pacman() : m_circle{ config::GAME_PACMAN_SIZE/2 } { m_circle.setFillColor(config::GAME_COLOR_PACMAN); m_circle.setOrigin(config::GAME_PACMAN_SIZE/2, config::GAME_PACMAN_SIZE/2); m_distance_limit = config::PACMAN_SPEED/config::ROOM_SIZE; } void Pacman::replace(const Room::Direction direction) { if (m_is_moving) return; m_ptr_room->get_side(direction)->enter(this); } void Pacman::move() { const float frame_duration = m_stopwatch.getElapsedTime().asSeconds(); m_stopwatch.restart(); if (!m_is_moving) return; const sf::Vector2f cur_pos = m_circle.getPosition(); const sf::Vector2f displacement = m_estimated_position - cur_pos; const float distance = std::sqrt(displacement.x * displacement.x + displacement.y * displacement.y); if (distance < m_distance_limit) { m_circle.setPosition(m_estimated_position); m_is_moving = false; return; } const sf::Vector2f direction = config::PACMAN_SPEED * frame_duration * displacement / distance; float delta_x, delta_y; if (direction.x > 0) delta_x = std::min(direction.x, displacement.x); else delta_x = std::max(direction.x, displacement.x); if (direction.y > 0) delta_y = std::min(direction.y, displacement.y); else delta_y = std::max(direction.y, displacement.y); m_circle.move(delta_x, delta_y); } void Pacman::draw_into(sf::RenderWindow& window) const { window.draw(m_circle); } void Pacman::prepare_for_first_drawing() { m_circle.setPosition(m_ptr_room->get_position()); } void Pacman::prepare_for_drawing() { m_estimated_position = m_ptr_room->get_position(); m_is_moving = true; move(); } std::unique_ptr<IGameEvent> Pacman::visit(Food* ptr_food) { if (!this->getBounds().intersects(ptr_food->getBounds())) return {}; return std::make_unique<DeleteStaticEntity>(ptr_food); } std::unique_ptr<IGameEvent> Pacman::visit(Enemy* ptr_enemy) { if (!this->getBounds().intersects(ptr_enemy->getBounds())) return {}; return std::make_unique<LostGame>(); }