pacman/lib/Ghost.hpp

74 lines
1.5 KiB
C++
Raw Normal View History

2021-06-24 11:32:52 +00:00
#pragma once
#include <chrono>
#include "Atlas.hpp"
#include "Board.hpp"
#include "Position.hpp"
class Ghost {
public:
enum class State {
Chase,
Scatter,
2021-06-28 10:42:21 +00:00
Frightened,
2021-06-24 11:32:52 +00:00
Eyes,
};
explicit Ghost(Atlas::Ghost spritesSet, Position startingPosition, Position scatterTarget);
[[nodiscard]] PositionInt currentSprite() const;
[[nodiscard]] Position position() const;
[[nodiscard]] Position positionInGrid() const;
void update(std::chrono::milliseconds time_delta, const Board & board);
2021-06-28 10:42:21 +00:00
void frighten();
void eat();
bool isFrightened() const;
bool isEyes() const;
void reset();
2021-06-24 11:32:52 +00:00
private:
2021-06-28 10:42:21 +00:00
double speed() const;
void updateAnimation(std::chrono::milliseconds time_delta);
void updatePosition(std::chrono::milliseconds time_delta, const Board & board);
void updateDirection(const Board & board);
Position target(const Board & board) const;
2021-06-24 11:32:52 +00:00
protected:
Atlas::Ghost spritesSet;
Direction direction = Direction::NONE;
2021-06-28 10:42:21 +00:00
double timeForAnimation = 0;
int animationIndex = 0;
2021-06-24 11:32:52 +00:00
State state = State::Chase;
2021-06-28 10:42:21 +00:00
int timeFrighten = 0;
int timeChase = 0;
2021-06-24 11:32:52 +00:00
Position pos;
Position startingPosition;
Position scatterTarget;
2021-06-28 10:42:21 +00:00
Position lastIntersection = { -1, -1 };
2021-07-01 12:53:52 +00:00
bool isInPen(const Board & board) const;
2021-06-24 11:32:52 +00:00
};
class Blinky : public Ghost {
public:
explicit Blinky(const Board & board);
};
class Speedy : public Ghost {
public:
explicit Speedy(const Board & board);
};
class Inky : public Ghost {
public:
explicit Inky(const Board & board);
};
class Clyde : public Ghost {
public:
explicit Clyde(const Board & board);
};