An error occurred while loading the file. Please try again.
-
Чаадаев Алексей Константинович authored313139cd
#include "Entities.h"
#include "../Room/Room.h"
#include "Pacman.h"
//IENTITY
void IEntity::set_location(Room* ptr_room) {
m_ptr_room = ptr_room;
this->prepare_for_drawing(); //отрисовываем себя
}
Room* IEntity::get_location() {
return m_ptr_room;
}
//ENEMY
Enemy::Enemy() {
size_t ind = rand() % config::PATH_ENEMY_TEXTURES.size();
if (!m_texture.loadFromFile("../../../textures/" + config::PATH_ENEMY_TEXTURES.at(ind))) {
throw std::runtime_error("Textures loading error\n");
}
m_sprite.setOrigin({ m_texture.getSize().x / 2.0f, m_texture.getSize().y / 2.0f});
m_sprite.setTexture(m_texture);
m_sprite.setScale({ 2.5f,2.5f });
}
void Enemy::draw_into(sf::RenderWindow& window) const {
window.draw(m_sprite);
}
void Enemy::prepare_for_drawing() { //prep drawing проходит в конце set_pos
m_sprite.setTexture(m_texture);
m_sprite.setPosition(m_ptr_room->get_position());
}
std::unique_ptr<IDynamicEntity> Enemy::clone() const {
return std::make_unique<Enemy>(*this);
}
void Enemy::action() {
auto miliseconds = static_cast<size_t>(m_stopwatch.getElapsedTime().asMilliseconds()); //получаем сколько прошло времени
if (miliseconds < 500 + rand() % 10000) //если время меньше, чем случайное число до 10000 мс, то бездействие
return;
auto direction = static_cast<Room::Direction>(rand() % 4);
m_ptr_room->get_side(direction)->enter(this);
m_stopwatch.restart(); //запускаем секундомер сначала
}
std::unique_ptr<IGameEvent> Enemy::accept(IVisitor* ptr_visitor) {
return ptr_visitor->visit(this);
}
//FOOD
Food::Food() {
m_circle = sf::CircleShape(config::GAME_FOOD_SIZE/2);
m_circle.setOrigin({ config::GAME_FOOD_SIZE/2, config::GAME_FOOD_SIZE/2 });
m_circle.setFillColor(config::GAME_FOOD_COLOR);
}
void Food::catched(Inventory& inventory) {
inventory.increase_food();
}
void Food::draw_into(sf::RenderWindow& window) const {
window.draw(m_circle);
}
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
void Food::prepare_for_drawing() {
m_circle.setPosition(m_ptr_room->get_position());
}
std::unique_ptr<IStaticEntity> Food::clone() const {
return std::make_unique<Food>(*this);
}
std::unique_ptr<IGameEvent> Food::accept(IVisitor* ptr_visitor) {
return ptr_visitor->visit(this);
}
//INVISPOTION
InvisPotion::InvisPotion() {
m_circle = sf::CircleShape(config::GAME_INVIS_POTION_SIZE / 2);
m_circle.setOrigin({ config::GAME_INVIS_POTION_SIZE / 2, config::GAME_INVIS_POTION_SIZE / 2 });
m_circle.setFillColor(config::GAME_INVIS_POTION_COLOR);
m_rect = sf::RectangleShape({ config::GAME_INVIS_POTION_SIZE * 3 / 8, config::GAME_INVIS_POTION_SIZE * 3 / 4 });
m_rect.setFillColor(config::GAME_INVIS_POTION_COLOR);
m_rect.setOrigin({ config::GAME_INVIS_POTION_SIZE * 3 / 16, config::GAME_INVIS_POTION_SIZE });
}
void InvisPotion::catched(Inventory& inventory) {
inventory.increase_IP();
}
void InvisPotion::draw_into(sf::RenderWindow& window) const {
window.draw(m_circle);
window.draw(m_rect);
}
void InvisPotion::prepare_for_drawing() {
m_circle.setPosition(m_ptr_room->get_position());
sf::Vector2f circle_pos = m_circle.getPosition();
m_rect.setPosition({ circle_pos.x, circle_pos.y + config::GAME_INVIS_POTION_SIZE * 0.1f });
}
std::unique_ptr<IStaticEntity> InvisPotion::clone() const {
return std::make_unique<InvisPotion>(*this);
}
std::unique_ptr<IGameEvent> InvisPotion::accept(IVisitor* ptr_visitor) {
return ptr_visitor->visit(this);
}