An error occurred while loading the file. Please try again.
-
Adam Reese authoredUnverified4f26b658
#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>();
}