Pacman.cpp 2.26 KiB
#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>();