diff --git a/pacman/lib/Board.cpp b/pacman/lib/Board.cpp index 7dfff67..8b1994d 100644 --- a/pacman/lib/Board.cpp +++ b/pacman/lib/Board.cpp @@ -1,4 +1,4 @@ -#include "Board.h" +#include "Board.hpp" // Legend // 0 - wall @@ -7,9 +7,6 @@ // 3 - door // 4 - superpower -// 16 pixels per square -// Maze in pixels - width: 448 - height - 496 - static const uint8_t board[ROWS][COLUMNS] = { // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // 0 @@ -46,17 +43,12 @@ static const uint8_t board[ROWS][COLUMNS] = { }; Board::Board() { - resetBoardState(); -} - -void Board::resetBoardState() { for (uint8_t row = 0; row < ROWS; row++) for (uint8_t column = 0; column < COLUMNS; column++) board_state[row][column] = board[row][column]; } bool Board::isWalkable(Position point, float_t position_delta, Direction direction) const { - switch (direction) { case Direction::LEFT: return board_state[int(point.y)][int(point.x - position_delta)] != 0; @@ -72,15 +64,7 @@ bool Board::isWalkable(Position point, float_t position_delta, Direction directi } } -SDL_Rect Board::pelletSprite() { - return pellet; -} - -SDL_Rect Board::superPelletSprite() { - return super_pellet; -} - -std::vector Board::pelletPositions() { +std::vector Board::initialPelletPositions() const { std::vector positions; for (uint8_t row = 0; row < ROWS; row++) { for (uint8_t column = 0; column < COLUMNS; column++) { @@ -91,8 +75,7 @@ std::vector Board::pelletPositions() { return positions; } -std::vector Board::superPelletPositions() { - // Hard coded is probably better than this +std::vector Board::initialSuperPelletPositions() const { std::vector positions; for (uint8_t row = 0; row < ROWS; row++) { for (uint8_t column = 0; column < COLUMNS; column++) { diff --git a/pacman/lib/Board.h b/pacman/lib/Board.hpp similarity index 52% rename from pacman/lib/Board.h rename to pacman/lib/Board.hpp index 2f2e4a7..53f41b6 100644 --- a/pacman/lib/Board.h +++ b/pacman/lib/Board.hpp @@ -1,8 +1,9 @@ #ifndef PACMAN_BOARD_H #define PACMAN_BOARD_H -#include "Direction.h" -#include "Position.h" +#include "Direction.hpp" +#include "Position.hpp" + #include #include #include @@ -16,20 +17,14 @@ public: [[nodiscard]] bool isWalkable(Position point, float_t d, Direction direction) const; - SDL_Rect pelletSprite(); + [[nodiscard]] std::vector initialPelletPositions() const; - SDL_Rect superPelletSprite(); + [[nodiscard]] std::vector initialSuperPelletPositions() const; - std::vector pelletPositions(); - - std::vector superPelletPositions(); + static Position initialPacManPosition() { return {14, 23}; } private: uint8_t board_state[ROWS][COLUMNS]{}; - const SDL_Rect super_pellet = {0 * 32, 9 * 32, 32, 32}; - const SDL_Rect pellet = {1 * 32, 9 * 32, 32, 32}; - - void resetBoardState(); }; #endif //PACMAN_BOARD_H diff --git a/pacman/lib/Direction.h b/pacman/lib/Direction.hpp similarity index 100% rename from pacman/lib/Direction.h rename to pacman/lib/Direction.hpp diff --git a/pacman/lib/Game.cpp b/pacman/lib/Game.cpp index 7544c4c..b6ceca1 100644 --- a/pacman/lib/Game.cpp +++ b/pacman/lib/Game.cpp @@ -1,12 +1,13 @@ -#include "Game.h" - -#include +#include "Game.hpp" #include -Game::Game() - : window(448, 496) { -} +Game::Game() : + window(448, 496), + board(), + pacMan(board), + pellets(board), + superPellets(board) {} auto Game::now() { return std::chrono::system_clock::now(); @@ -21,7 +22,7 @@ void Game::run() { auto milli_delta = std::chrono::duration_cast(time_delta); pacMan.update(milli_delta, inputState, board); current_time += time_delta; - window.update(pacMan, board); + window.update(pacMan, pellets, superPellets); } } diff --git a/pacman/lib/Game.h b/pacman/lib/Game.hpp similarity index 65% rename from pacman/lib/Game.h rename to pacman/lib/Game.hpp index 21916a0..e4ad275 100644 --- a/pacman/lib/Game.h +++ b/pacman/lib/Game.hpp @@ -1,10 +1,13 @@ #ifndef PACMAN_GAME_H #define PACMAN_GAME_H -#include "Board.h" -#include "GameWindow.h" -#include "InputState.h" -#include "PacMan.h" +#include "Board.hpp" +#include "GameWindow.hpp" +#include "PacMan.hpp" +#include "Pellets.hpp" +#include "SuperPellets.hpp" + +class InputState; class Game { public: @@ -14,8 +17,10 @@ public: private: GameWindow window; - PacMan pacMan; Board board; + PacMan pacMan; + Pellets pellets; + SuperPellets superPellets; static void processEvents(InputState & inputState); diff --git a/pacman/lib/GameWindow.cpp b/pacman/lib/GameWindow.cpp index 87be0f3..1b1e718 100644 --- a/pacman/lib/GameWindow.cpp +++ b/pacman/lib/GameWindow.cpp @@ -1,10 +1,13 @@ -#include "GameWindow.h" -#include "PacMan.h" +#include "GameWindow.hpp" #include #include #include +#include "PacMan.hpp" +#include "Pellets.hpp" +#include "SuperPellets.hpp" + GameWindow::GameWindow(int width, int height) { initSDL(); initSDLImage(); @@ -16,11 +19,12 @@ GameWindow::GameWindow(int width, int height) { sprite_texture = loadTexture(sdl_renderer, "sprites32.png"); } -void GameWindow::update(const PacMan & pacMan, Board board) { +void GameWindow::update(const PacMan & pacMan, const Pellets & pellets, const SuperPellets & superPellets) { SDL_RenderClear(renderer.get()); renderMaze(); - renderBoard(board); + renderPellets(pellets); + renderSuperPellets(superPellets); renderPacMan(pacMan); SDL_RenderPresent(renderer.get()); @@ -30,23 +34,18 @@ void GameWindow::renderMaze() const { renderTexture(maze_texture.get(), nullptr, nullptr); } -void GameWindow::renderBoard(Board board) { - renderPellets(board); - renderSuperPellets(board); -} - -void GameWindow::renderSuperPellets(Board & board) const { - SDL_Rect sprite_rect = board.superPelletSprite(); - std::vector superPelletPositions = board.superPelletPositions(); +void GameWindow::renderSuperPellets(const SuperPellets & superPellets) const { + SDL_Rect sprite_rect = superPellets.currentSprite(); + std::vector superPelletPositions = superPellets.currentPositions(); for (const auto & pos : superPelletPositions) { SDL_Rect maze_rect = targetRect({float_t(pos.x), float_t(pos.y)}, 8 * SCALE_FACTOR); renderTexture(sprite_texture.get(), &sprite_rect, &maze_rect); } } -void GameWindow::renderPellets(Board & board) const { - SDL_Rect sprite_rect = board.pelletSprite(); - std::vector pelletPositions = board.pelletPositions(); +void GameWindow::renderPellets(const Pellets & pellets) const { + SDL_Rect sprite_rect = pellets.currentSprite(); + std::vector pelletPositions = pellets.currentPositions(); for (const auto & pos : pelletPositions) { SDL_Rect maze_rect = targetRect({float_t(pos.x), float_t(pos.y)}, 8 * SCALE_FACTOR); renderTexture(sprite_texture.get(), &sprite_rect, &maze_rect); diff --git a/pacman/lib/GameWindow.h b/pacman/lib/GameWindow.hpp similarity index 87% rename from pacman/lib/GameWindow.h rename to pacman/lib/GameWindow.hpp index fb0a955..b760388 100644 --- a/pacman/lib/GameWindow.h +++ b/pacman/lib/GameWindow.hpp @@ -3,8 +3,6 @@ #include #include - -#include "PacMan.h" #include struct SDL_Window_Deleter { @@ -32,12 +30,15 @@ struct SDL_Texture_Deleter { }; class PacMan; +class Pellets; +class Position; +class SuperPellets; class GameWindow { public: explicit GameWindow(int width, int height); - void update(const PacMan & pacMan, Board board); + void update(const PacMan & pacMan, const Pellets & pellets, const SuperPellets & superPellets); private: static const int16_t SCALE_FACTOR = 1; @@ -70,11 +71,9 @@ private: void renderPacMan(const PacMan & pac_man) const; - void renderBoard(Board board); + void renderPellets(const Pellets & pellets) const; - void renderPellets(Board & board) const; - - void renderSuperPellets(Board & board) const; + void renderSuperPellets(const SuperPellets & superPellets) const; static SDL_Rect targetRect(const Position & position, int pixel_increase); diff --git a/pacman/lib/InputState.cpp b/pacman/lib/InputState.cpp deleted file mode 100644 index 10ecd04..0000000 --- a/pacman/lib/InputState.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "InputState.h" diff --git a/pacman/lib/InputState.h b/pacman/lib/InputState.hpp similarity index 100% rename from pacman/lib/InputState.h rename to pacman/lib/InputState.hpp diff --git a/pacman/lib/PacMan.cpp b/pacman/lib/PacMan.cpp index 4832aa1..770400a 100644 --- a/pacman/lib/PacMan.cpp +++ b/pacman/lib/PacMan.cpp @@ -1,5 +1,7 @@ -#include "PacMan.h" -#include "PacManAnimation.hpp" +#include "PacMan.hpp" + +PacMan::PacMan(const Board & board) : + pos(board.initialPacManPosition()) {} SDL_Rect PacMan::currentSprite() const { return pacManAnimation.animationFrame(direction); diff --git a/pacman/lib/PacMan.h b/pacman/lib/PacMan.hpp similarity index 83% rename from pacman/lib/PacMan.h rename to pacman/lib/PacMan.hpp index 781eb6e..5b1d103 100644 --- a/pacman/lib/PacMan.h +++ b/pacman/lib/PacMan.hpp @@ -1,17 +1,20 @@ #ifndef PACMAN_PACMAN_H #define PACMAN_PACMAN_H -#include "Board.h" -#include "Direction.h" -#include "InputState.h" -#include "Position.h" +#include "Direction.hpp" +#include "Position.hpp" #include "PacManAnimation.hpp" #include #include +class Board; +class InputState; + class PacMan { public: + explicit PacMan(const Board & board); + [[nodiscard]] SDL_Rect currentSprite() const; [[nodiscard]] Position currentPosition() const; @@ -22,7 +25,7 @@ private: Direction direction = Direction::NONE; Direction desired_direction = Direction::NONE; - Position pos = {14, 23}; + Position pos; PacManAnimation pacManAnimation; void setDirection(const InputState & state); diff --git a/pacman/lib/PacManAnimation.hpp b/pacman/lib/PacManAnimation.hpp index 7d754f9..a38148b 100644 --- a/pacman/lib/PacManAnimation.hpp +++ b/pacman/lib/PacManAnimation.hpp @@ -1,10 +1,10 @@ #ifndef PACMAN_PACMAN_ANIMATION_HPP #define PACMAN_PACMAN_ANIMATION_HPP -#include "Board.h" -#include "Direction.h" -#include "InputState.h" -#include "Position.h" +#include "Board.hpp" +#include "Direction.hpp" +#include "InputState.hpp" +#include "Position.hpp" #include #include @@ -12,7 +12,7 @@ class PacManAnimation { public: - SDL_Rect animationFrame(Direction direction) const; + [[nodiscard]] SDL_Rect animationFrame(Direction direction) const; void updateAnimationPosition(std::chrono::milliseconds time_delta); diff --git a/pacman/lib/Pellets.cpp b/pacman/lib/Pellets.cpp new file mode 100644 index 0000000..138e755 --- /dev/null +++ b/pacman/lib/Pellets.cpp @@ -0,0 +1,4 @@ +#include "Pellets.hpp" + +Pellets::Pellets(const Board & board) : + positions(board.initialPelletPositions()) {} diff --git a/pacman/lib/Pellets.hpp b/pacman/lib/Pellets.hpp new file mode 100644 index 0000000..34c509a --- /dev/null +++ b/pacman/lib/Pellets.hpp @@ -0,0 +1,26 @@ +#ifndef PACMAN_PELLETS_HPP +#define PACMAN_PELLETS_HPP + +#include "Position.hpp" +#include "Board.hpp" + +#include + +class Pellets { +public: + explicit Pellets(const Board & board); + + [[nodiscard]] SDL_Rect currentSprite() const { + return pellet; + }; + + [[nodiscard]] std::vector currentPositions() const { + return positions; + } + +private: + const SDL_Rect pellet = {1 * 32, 9 * 32, 32, 32}; + std::vector positions; +}; + +#endif //PACMAN_PELLETS_HPP diff --git a/pacman/lib/Position.h b/pacman/lib/Position.hpp similarity index 87% rename from pacman/lib/Position.h rename to pacman/lib/Position.hpp index 6a08fe7..483acd2 100644 --- a/pacman/lib/Position.h +++ b/pacman/lib/Position.hpp @@ -1,7 +1,7 @@ #ifndef PACMAN_POSITION_H #define PACMAN_POSITION_H -#include +#include struct Position { float_t x; diff --git a/pacman/lib/SuperPellets.cpp b/pacman/lib/SuperPellets.cpp new file mode 100644 index 0000000..f1584e1 --- /dev/null +++ b/pacman/lib/SuperPellets.cpp @@ -0,0 +1,4 @@ +#include "SuperPellets.hpp" + +SuperPellets::SuperPellets(const Board & board) : + positions(board.initialSuperPelletPositions()) {} diff --git a/pacman/lib/SuperPellets.hpp b/pacman/lib/SuperPellets.hpp new file mode 100644 index 0000000..f8c6faa --- /dev/null +++ b/pacman/lib/SuperPellets.hpp @@ -0,0 +1,26 @@ +#ifndef PACMAN_SUPERPELLETS_HPP +#define PACMAN_SUPERPELLETS_HPP + +#include "Position.hpp" +#include "Board.hpp" + +#include + +class SuperPellets { +public: + explicit SuperPellets(const Board & board); + + [[nodiscard]] SDL_Rect currentSprite() const { + return super_pellet; + } + + [[nodiscard]] std::vector currentPositions() const { + return positions; + } + +private: + const SDL_Rect super_pellet = {0 * 32, 9 * 32, 32, 32}; + std::vector positions; +}; + +#endif //PACMAN_SUPERPELLETS_HPP diff --git a/pacman/src/main.cpp b/pacman/src/main.cpp index 1793632..08c4420 100644 --- a/pacman/src/main.cpp +++ b/pacman/src/main.cpp @@ -1,4 +1,4 @@ -#include "../lib/Game.h" +#include "../lib/Game.hpp" extern "C" int main([[maybe_unused]] int argc, [[maybe_unused]] char * argv[]) { Game game; diff --git a/pacman/test/CMakeLists.txt b/pacman/test/CMakeLists.txt index 5ef6ec1..a4982ef 100644 --- a/pacman/test/CMakeLists.txt +++ b/pacman/test/CMakeLists.txt @@ -6,6 +6,5 @@ include(GoogleTest) add_executable(tests tests.cpp) target_link_libraries(tests GTest::GTest libpacman) -#gtest_add_tests(TARGET tests TEST_PREFIX old_pacman:) gtest_discover_tests(tests TEST_PREFIX pacman:) add_test(NAME monolithic COMMAND tests) \ No newline at end of file diff --git a/pacman/test/tests.cpp b/pacman/test/tests.cpp index 1ac3ab3..eb630eb 100644 --- a/pacman/test/tests.cpp +++ b/pacman/test/tests.cpp @@ -1,8 +1,9 @@ #include -#include "../lib/PacMan.h" +#include "../lib/PacMan.hpp" TEST(PacManTest, InitialPosition) { - PacMan pacMan; + Board board; + PacMan pacMan(board); EXPECT_EQ(pacMan.currentPosition().x, 14); EXPECT_EQ(pacMan.currentPosition().y, 23); }