From ef4e89e63cb2646ea33d0d0d313664989949d367 Mon Sep 17 00:00:00 2001 From: Benjamin Kraft Date: Wed, 25 Jan 2023 12:18:42 +0100 Subject: [PATCH] new event, added walls --- src/Entity.cpp | 1 - src/Entity.h | 5 ----- src/Event.h | 4 ++++ src/Game.cpp | 24 ++++++++++++++++++++++-- src/Game.h | 7 ++++++- src/Listener.cpp | 2 ++ src/Listener.h | 1 + src/Player.cpp | 34 +++++++++++++++++++++++++--------- src/Player.h | 6 +++--- src/Spectator.cpp | 7 +++++++ src/Spectator.h | 4 ++-- src/Wall.cpp | 26 ++++++++++++++++++++++++++ src/Wall.h | 17 +++++++++++++++++ 13 files changed, 115 insertions(+), 23 deletions(-) delete mode 100644 src/Entity.cpp delete mode 100644 src/Entity.h create mode 100644 src/Wall.cpp create mode 100644 src/Wall.h diff --git a/src/Entity.cpp b/src/Entity.cpp deleted file mode 100644 index 8fb9f04..0000000 --- a/src/Entity.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "Entity.h" diff --git a/src/Entity.h b/src/Entity.h deleted file mode 100644 index af35ce2..0000000 --- a/src/Entity.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -class Entity { - -}; diff --git a/src/Event.h b/src/Event.h index a6b3505..cbe4205 100644 --- a/src/Event.h +++ b/src/Event.h @@ -55,4 +55,8 @@ class Player; struct WallJumpEvent : GameEvent { double wallHeight = 0; Player * player = nullptr; +}; + +struct WallCrashEvent : GameEvent { + Player * player = nullptr; }; \ No newline at end of file diff --git a/src/Game.cpp b/src/Game.cpp index b468fd4..99a765c 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -2,19 +2,38 @@ #include "Game.h" #include "InputWindow.h" #include "Window.h" +#include void Game::draw(QPixmap &output) { QPainter p(&output); - p.drawText(50, 50, QString::fromStdString(std::to_string(int(window->currentFPS)))); for (auto & spectator : spectators) spectator.draw(p); + for (auto & wall : walls) + wall.draw(p); player.draw(p); } void Game::update(float dTime) { eTime += dTime; - player.update(dTime); + player.update(dTime, walls); + for (auto & wall : walls) + wall.update(dTime); + tryCreateWall(); + removeWalls(); +} + +void Game::tryCreateWall() { + int val = rand() % 1000; + if (val > 990){ + walls.emplace_back(); + } +} + +void Game::removeWalls() { + erase_if(walls, [](const Wall& wall){ + return wall.isLost(); + }); } Game::Game() { @@ -27,3 +46,4 @@ Game::Game() { GameQueue * Game::eventQueue = new GameQueue; Game * Game::instance = nullptr; + diff --git a/src/Game.h b/src/Game.h index a16bab3..5256741 100644 --- a/src/Game.h +++ b/src/Game.h @@ -3,6 +3,7 @@ #include "Queue.h" #include "Player.h" #include "Spectator.h" +#include "Wall.h" #define WIDTH 1000 #define HEIGHT 500 @@ -13,8 +14,12 @@ class Window; class Game { Player player; std::vector spectators {5}; + std::vector walls; + void tryCreateWall(); + void removeWalls(); public: - Window * window; + Window * window = nullptr; + // seconds float eTime = 0; static Game * instance; static GameQueue * eventQueue; diff --git a/src/Listener.cpp b/src/Listener.cpp index 1f8129c..01a563c 100644 --- a/src/Listener.cpp +++ b/src/Listener.cpp @@ -3,6 +3,8 @@ void GameListener::accept(GameEvent *event) { if (auto wallJumpEvent = dynamic_cast(event)) OnWallJumped(wallJumpEvent); + if (auto wallCrashEvent = dynamic_cast(event)) + OnWallCrashed(wallCrashEvent); } void InputListener::accept(InputEvent *event) { diff --git a/src/Listener.h b/src/Listener.h index c3b3c4d..aae05e9 100644 --- a/src/Listener.h +++ b/src/Listener.h @@ -27,4 +27,5 @@ public: void accept(GameEvent * event) override; protected: virtual void OnWallJumped(WallJumpEvent * event) {}; + virtual void OnWallCrashed(WallCrashEvent * event) {}; }; \ No newline at end of file diff --git a/src/Player.cpp b/src/Player.cpp index ae64da3..5b454bd 100644 --- a/src/Player.cpp +++ b/src/Player.cpp @@ -4,26 +4,20 @@ #include "Game.h" void Player::mousePressed(MouseEvent *event) { - if (pos.y() == GROUND_Y && event->button == Qt::MouseButton::LeftButton){ + if (pos.y() == GROUND_Y && event->button == Qt::MouseButton::LeftButton) jump(); - auto e = new WallJumpEvent; - e->time = Game::instance->eTime; - e->player = this; - e->wallHeight = 100; - Game::eventQueue->submitEvent(e); - } } void Player::draw(QPainter &painter) const { painter.save(); painter.translate(pos.toPoint()); - painter.fillRect(-5, -5, 10, 10, Qt::black); + painter.fillRect(-5, -10, 10, 10, Qt::black); painter.restore(); } -void Player::update(float dTime) { +void Player::update(float dTime, std::vector &walls) { pos += vel * dTime; vel += acc * dTime; @@ -31,6 +25,28 @@ void Player::update(float dTime) { pos.setY(GROUND_Y); vel = {}; } + + for (auto &wall : walls){ + if (!wall.jumped && !wall.failed){ + if (pos.x() > wall.pos.x() - wall.size.width() / 2 + && pos.x() < wall.pos.x() + wall.size.width() / 2){ + if (pos.y() < wall.pos.y() - wall.size.height()){ + wall.jumped = true; + auto e = new WallJumpEvent; + e->time = Game::instance->eTime; + e->player = this; + e->wallHeight = wall.size.height(); + Game::eventQueue->submitEvent(e); + } else { + wall.failed = true; + auto e = new WallCrashEvent; + e->time = Game::instance->eTime; + e->player = this; + Game::eventQueue->submitEvent(e); + } + } + } + } } void Player::jump() { diff --git a/src/Player.h b/src/Player.h index 2d7380b..8022301 100644 --- a/src/Player.h +++ b/src/Player.h @@ -2,10 +2,10 @@ #include "Listener.h" #include "Event.h" -#include "Entity.h" +#include "Wall.h" #include -class Player : public Entity, public InputListener { +class Player : public InputListener { QVector2D pos {50, 50}; QVector2D vel {}; QVector2D acc {0, 9.81 * 30}; @@ -13,7 +13,7 @@ class Player : public Entity, public InputListener { void jump(); public: void draw(QPainter &painter) const; - void update(float dTime); + void update(float dTime, std::vector&); protected: void mousePressed(MouseEvent *) override; diff --git a/src/Spectator.cpp b/src/Spectator.cpp index 0fdf457..7edb463 100644 --- a/src/Spectator.cpp +++ b/src/Spectator.cpp @@ -7,6 +7,13 @@ void Spectator::OnWallJumped(WallJumpEvent *event) { std::cout << "Wall jump at " << event->time << std::endl; } +void Spectator::OnWallCrashed(WallCrashEvent *event) { + std::cout << "Wall crash at " << event->time << std::endl; +} + + void Spectator::draw(QPainter &painter) const { } + + diff --git a/src/Spectator.h b/src/Spectator.h index 366d3ed..481ee1b 100644 --- a/src/Spectator.h +++ b/src/Spectator.h @@ -1,11 +1,11 @@ #pragma once -#include "Entity.h" #include "Listener.h" -class Spectator : public Entity, public GameListener { +class Spectator : public GameListener { protected: void OnWallJumped(WallJumpEvent * event) override; + void OnWallCrashed(WallCrashEvent * event) override; public: void draw(QPainter &painter) const; }; diff --git a/src/Wall.cpp b/src/Wall.cpp new file mode 100644 index 0000000..3cd32b9 --- /dev/null +++ b/src/Wall.cpp @@ -0,0 +1,26 @@ +#include "Wall.h" +#include "Game.h" + +void Wall::draw(QPainter &painter) const { + painter.save(); + + int w = size.width(); + int h = size.height(); + painter.translate(pos.toPoint()); + painter.fillRect(w / 2, -h, w, h, Qt::black); + + painter.restore(); +} + +void Wall::update(float dTime) { + pos.setX(pos.x() - dTime * velocity); +} + +Wall::Wall() { + pos = {WIDTH, GROUND_Y}; + size = {50, 50}; +} + +bool Wall::isLost() const { + return pos.x() < -100; +} diff --git a/src/Wall.h b/src/Wall.h new file mode 100644 index 0000000..d126028 --- /dev/null +++ b/src/Wall.h @@ -0,0 +1,17 @@ +#pragma once + +#include +#include + +class Wall { + float velocity = 300; +public: + bool jumped = false; + bool failed = false; + QVector2D pos; + QSize size; + bool isLost() const; + explicit Wall(); + void draw(QPainter &painter) const; + void update(float dTime); +};