From b9b61daf13113dcb51354d6388c2274991975159 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20MARQUET?= Date: Mon, 29 Apr 2024 10:22:27 +0200 Subject: [PATCH] Add player display, movement --- .gitignore | 9 +++++++++ CMakeLists.txt | 2 +- ressources/player.png | Bin 0 -> 3017 bytes src/Game.cpp | 13 +++++++------ src/Game.h | 1 - src/Map.cpp | 11 +++++++++++ src/Map.h | 6 ++++++ src/Menu.cpp | 14 +++++++++----- src/Menu.h | 5 +++++ src/Player.cpp | 31 ++++++++++++++++++++++--------- src/Player.h | 9 ++++++--- src/main.cpp | 3 --- 12 files changed, 76 insertions(+), 28 deletions(-) create mode 100644 ressources/player.png diff --git a/.gitignore b/.gitignore index 259148f..3c59333 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,12 @@ *.exe *.out *.app + +# .idea folder +.idea/ + +# build folder +build/ + +# cmake-build-debug folder +cmake-build-debug/ \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index e1a1f2e..f0a79e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ set(CMAKE_CXX_STANDARD 17) set(CMAKE_AUTOMOC ON) -find_package(Qt6 REQUIRED COMPONENTS Widgets Sql) +find_package(Qt6 REQUIRED COMPONENTS Widgets Sql Gui Core) file(GLOB_RECURSE sourceCode src/*.cpp src/*.h) diff --git a/ressources/player.png b/ressources/player.png new file mode 100644 index 0000000000000000000000000000000000000000..350dc24cfd224c0afe7ec248100d0b158ea757b3 GIT binary patch literal 3017 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 Bb3gz9 literal 0 HcmV?d00001 diff --git a/src/Game.cpp b/src/Game.cpp index e614118..7e89256 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -5,12 +5,15 @@ #include "Game.h" #include #include +#include Game::Game(){ userGold = 0; waveNumber = 0; this->setFocusPolicy(Qt::StrongFocus); - player = new Player(100, 0, 10, 10, 1, "", 0, 0); + player = new Player(100, 0, 10, 10, 1, "../ressources/player.png", 0, 0, gameMap); + gameMap.addItem(player->getGraphics()); + this->setScene(&gameMap); } void Game::start() { @@ -29,26 +32,24 @@ void Game::start() { // Start the game timer gameTimer.start(1000); - player->getPlayerPosition(); + + // Set focus to the QGraphicsView + this->setFocus(); } void Game::keyPressEvent(QKeyEvent *event) { switch (event->key()) { case Qt::Key_Left: player->setPosition(player->getX() - 1, player->getY()); - player->getPlayerPosition(); break; case Qt::Key_Right: player->setPosition(player->getX() + 1, player->getY()); - player->getPlayerPosition(); break; case Qt::Key_Up: player->setPosition(player->getX(), player->getY() - 1); - player->getPlayerPosition(); break; case Qt::Key_Down: player->setPosition(player->getX(), player->getY() + 1); - player->getPlayerPosition(); break; default: QGraphicsView::keyPressEvent(event); diff --git a/src/Game.h b/src/Game.h index b8a1f85..6165cfc 100644 --- a/src/Game.h +++ b/src/Game.h @@ -17,7 +17,6 @@ public: Game(); void start(); Map gameMap; - void setPlayerPosition(int x, int y); private: int userGold; diff --git a/src/Map.cpp b/src/Map.cpp index 9b7aae5..28ec811 100644 --- a/src/Map.cpp +++ b/src/Map.cpp @@ -65,6 +65,9 @@ void Map::generateMap(const int width, const int height) { } } } + + this->width = width; + this->height = height; } @@ -103,4 +106,12 @@ Tile* Map::getStartTile() { } } return nullptr; +} + +int Map::getWidth() { + return width; +} + +int Map::getHeight() { + return height; } \ No newline at end of file diff --git a/src/Map.h b/src/Map.h index 400e95f..5190b33 100644 --- a/src/Map.h +++ b/src/Map.h @@ -19,9 +19,15 @@ public: Tile* getEndTile(); Tile* getStartTile(); + QGraphicsScene scene; + + int getWidth(); + int getHeight(); private: QVector> tiles; + int width; + int height; }; diff --git a/src/Menu.cpp b/src/Menu.cpp index 0279ff2..529a44e 100644 --- a/src/Menu.cpp +++ b/src/Menu.cpp @@ -3,11 +3,6 @@ // #include "Menu.h" -#include "Game.h" -#include "Rules.h" -#include "Leaderboard.h" -#include -#include #include Menu::Menu(QWidget *parent) : QWidget(parent) { @@ -54,6 +49,15 @@ void Menu::onPlayButtonClicked() { // Show the game view->setScene(&game->gameMap); view->setFocus(); // Set focus to the QGraphicsView + + // Get a pointer to the MainWindow + auto* mainWindow = qobject_cast(this->parentWidget()); + + // Set the Game object as the central widget of the MainWindow + if (mainWindow) { + mainWindow->setCentralWidget(game); + QTimer::singleShot(0, game, SLOT(setFocus())); + } } void Menu::onRulesButtonClicked() { diff --git a/src/Menu.h b/src/Menu.h index bbaaf0b..cf1e31e 100644 --- a/src/Menu.h +++ b/src/Menu.h @@ -5,6 +5,11 @@ #ifndef POULPES_DE_L_ESPACE_LA_DERNIERE_LIGNE_DE_DEFENSE_MENU_H #define POULPES_DE_L_ESPACE_LA_DERNIERE_LIGNE_DE_DEFENSE_MENU_H #include "Game.h" +#include "Rules.h" +#include "Leaderboard.h" +#include "MainWindow.h" +#include +#include #include #include #include diff --git a/src/Player.cpp b/src/Player.cpp index d49486e..b9e8079 100644 --- a/src/Player.cpp +++ b/src/Player.cpp @@ -5,30 +5,43 @@ #include "Player.h" #include -Player::Player(int health, int shield, int damage, float regenerationRate, int speed, std::string avatarPath, int x, int y) - : Mob(health, shield, damage, regenerationRate, speed, avatarPath, x, y) { +Player::Player(int health, int shield, int damage, float regenerationRate, int speed, const std::string& avatarPath, int x, int y, Map& gameMap) + : Mob(health, shield, damage, regenerationRate, speed, avatarPath, x, y), gameMap(gameMap) { this->x = x; this->y = y; - graphics = new QGraphicsEllipseItem(x, y, 10, 10); - graphics->setBrush(QBrush(Qt::blue)); + QPixmap pixmap(QString::fromStdString(avatarPath)); + if (pixmap.isNull()) { + std::cerr << "Failed to load image from path: " << avatarPath << std::endl; + } else { + graphics = new QGraphicsPixmapItem(); + QPixmap scaledPixmap = pixmap.scaled(50, 50, Qt::KeepAspectRatio, Qt::SmoothTransformation); // Scale the pixmap to 50x50 pixels + graphics->setPixmap(scaledPixmap); + graphics->setPos(x * 50, y * 50); + graphics->setZValue(1); // Set the Z-value to 1 to draw the player on top of the map tiles + } } + void Player::setPosition(Tile* tile) { this->x = tile->gridX(); this->y = tile->gridY(); - graphics->setRect(x * 50, y * 50, 50, 50); + graphics->setPos(x * 50, y * 50); } void Player::setPosition(int x, int y) { - this->x = x; - this->y = y; - graphics->setRect(x * 50, y * 50, 50, 50); + int mapWidth = gameMap.getWidth(); + int mapHeight = gameMap.getHeight(); + if (x >= 0 && x < mapWidth && y >= 0 && y < mapHeight) { + this->x = x; + this->y = y; + graphics->setPos(x * 50, y * 50); + } } void Player::getPlayerPosition() { std::cout << "Player position: x: " << x << " y: " << y << std::endl; } -QGraphicsEllipseItem* Player::getGraphics() { +QGraphicsPixmapItem* Player::getGraphics() { return graphics; } diff --git a/src/Player.h b/src/Player.h index 6a3b0b9..2d7d92e 100644 --- a/src/Player.h +++ b/src/Player.h @@ -6,22 +6,25 @@ #define POULPES_DE_L_ESPACE_LA_DERNIERE_LIGNE_DE_DEFENSE_PLAYER_H #include "Mob.h" #include "Tile.h" +#include "Map.h" #include +#include #include class Player : public Mob { public: - Player(int health, int shield, int damage, float regenerationRate, int speed, std::string avatarPath, int x, int y); + Player(int health, int shield, int damage, float regenerationRate, int speed, const std::string& avatarPath, int x, int y, Map& gameMap); void setPosition(Tile* tile); void setPosition(int x, int y); void getPlayerPosition(); int getX(); int getY(); - QGraphicsEllipseItem* getGraphics(); + QGraphicsPixmapItem* getGraphics(); private: - QGraphicsEllipseItem* graphics; + QGraphicsPixmapItem* graphics; + Map& gameMap; }; diff --git a/src/main.cpp b/src/main.cpp index d2398a5..673be36 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,8 +1,5 @@ #include -#include #include "MainWindow.h" -#include "Menu.h" -#include "Rules.h" int main(int argc, char *argv[]) {