From 37ede843444b47161ce32249e7c60023c8ed5c76 Mon Sep 17 00:00:00 2001 From: Maximilian Giller Date: Sat, 10 Jun 2023 15:24:03 +0200 Subject: [PATCH] Player now colliding with map properly and other small adjustments --- CMakeLists.txt | 1 - src/debug/grid_debug_layer.cpp | 2 +- src/debug/grid_debug_layer.h | 2 +- src/game/camera/tracking_view.cpp | 2 +- src/game/camera/tracking_view.h | 2 +- .../collectables/environment_collectable.cpp | 2 +- .../collectables/environment_collectable.hpp | 2 +- src/game/game_object.cpp | 2 +- src/game/game_object.h | 2 +- src/game/physics/map_player.cpp | 1 - src/game/physics/map_player.hpp | 22 ++++++++++++++++++- src/game/physics/map_simulation.cpp | 19 +++++----------- src/game/player/player_spawner.cpp | 3 +++ src/primitives/circle_object.cpp | 7 +----- src/primitives/circle_object.h | 3 +-- src/sprites/animated_sprite.cpp | 2 +- src/sprites/animated_sprite.hpp | 2 +- src/sprites/single_sprite.cpp | 8 ++----- src/sprites/single_sprite.hpp | 4 +--- 19 files changed, 44 insertions(+), 44 deletions(-) delete mode 100644 src/game/physics/map_player.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index deb6c15..fa8c037 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -84,7 +84,6 @@ set(SOURCES src/game/input/gamepad_buttons.hpp src/game/physics/map_simulation.cpp src/game/physics/map_simulation.hpp - src/game/physics/map_player.cpp src/game/physics/map_player.hpp src/game/level/level_config.hpp src/game/level/level_loader.cpp diff --git a/src/debug/grid_debug_layer.cpp b/src/debug/grid_debug_layer.cpp index 0c3ef8a..7520da2 100644 --- a/src/debug/grid_debug_layer.cpp +++ b/src/debug/grid_debug_layer.cpp @@ -28,7 +28,7 @@ GridDebugLayer::GridDebugLayer(int minX, int maxX, int minY, int maxY) } } -void GridDebugLayer::draw(sf::RenderWindow *window) const +void GridDebugLayer::draw(sf::RenderWindow *window) { for (auto &gameObject: getChildren()) { diff --git a/src/debug/grid_debug_layer.h b/src/debug/grid_debug_layer.h index 320c6da..3c94587 100644 --- a/src/debug/grid_debug_layer.h +++ b/src/debug/grid_debug_layer.h @@ -9,7 +9,7 @@ class GridDebugLayer : public GameObject public: GridDebugLayer(int minX, int maxX, int minY, int maxY); - void draw(sf::RenderWindow *window) const override; + void draw(sf::RenderWindow *window) override; }; diff --git a/src/game/camera/tracking_view.cpp b/src/game/camera/tracking_view.cpp index cf6688a..7bd3c1e 100644 --- a/src/game/camera/tracking_view.cpp +++ b/src/game/camera/tracking_view.cpp @@ -132,7 +132,7 @@ void TrackingView::moveCenter(sf::Vector2 delta) hasViewChanged = true; } -void TrackingView::draw(sf::RenderWindow *window) const +void TrackingView::draw(sf::RenderWindow *window) { if (!DEVELOPER_MODE) { diff --git a/src/game/camera/tracking_view.h b/src/game/camera/tracking_view.h index 5a7079d..ff3f908 100644 --- a/src/game/camera/tracking_view.h +++ b/src/game/camera/tracking_view.h @@ -18,7 +18,7 @@ public: ~TrackingView(); - void draw(sf::RenderWindow *window) const override; + void draw(sf::RenderWindow *window) override; void lateUpdate() override; diff --git a/src/game/collectables/environment_collectable.cpp b/src/game/collectables/environment_collectable.cpp index 0de8c6e..1dde598 100644 --- a/src/game/collectables/environment_collectable.cpp +++ b/src/game/collectables/environment_collectable.cpp @@ -5,7 +5,7 @@ EnvironmentCollectable::EnvironmentCollectable(GridCoordinates position) coordinates->set(position); } -void EnvironmentCollectable::draw(sf::RenderWindow *window) const +void EnvironmentCollectable::draw(sf::RenderWindow *window) { } diff --git a/src/game/collectables/environment_collectable.hpp b/src/game/collectables/environment_collectable.hpp index c248ee7..227ed9c 100644 --- a/src/game/collectables/environment_collectable.hpp +++ b/src/game/collectables/environment_collectable.hpp @@ -9,7 +9,7 @@ class EnvironmentCollectable : public GameObject public: EnvironmentCollectable(GridCoordinates position); - void draw(sf::RenderWindow *window) const override; + void draw(sf::RenderWindow *window) override; }; diff --git a/src/game/game_object.cpp b/src/game/game_object.cpp index d342608..a8332af 100644 --- a/src/game/game_object.cpp +++ b/src/game/game_object.cpp @@ -17,7 +17,7 @@ void GameObject::setActive(bool active) } } -void GameObject::draw(sf::RenderWindow *window) const +void GameObject::draw(sf::RenderWindow *window) { for (auto &child: children) { diff --git a/src/game/game_object.h b/src/game/game_object.h index e14c405..a4f53a8 100644 --- a/src/game/game_object.h +++ b/src/game/game_object.h @@ -12,7 +12,7 @@ class GameObject public: GameObject(); - virtual void draw(sf::RenderWindow *window) const; + virtual void draw(sf::RenderWindow *window); virtual void update(); diff --git a/src/game/physics/map_player.cpp b/src/game/physics/map_player.cpp deleted file mode 100644 index 38876c7..0000000 --- a/src/game/physics/map_player.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "map_player.hpp" diff --git a/src/game/physics/map_player.hpp b/src/game/physics/map_player.hpp index 15c7fce..2290576 100644 --- a/src/game/physics/map_player.hpp +++ b/src/game/physics/map_player.hpp @@ -4,13 +4,33 @@ #include #include "../player/player.hpp" +#include "../../config.h" struct MapPlayer { Player *player; b2Body *body; - MapPlayer(Player *player, b2Body *body) : player(player), body(body) {} + MapPlayer(Player *player, b2Body *body) : player(player), body(body) + {} + + void updateSimulationPosition() const + { + auto coordinates = player->coordinates->world(); + b2Vec2 playerPosition = b2Vec2(coordinates.x, coordinates.y); + + // Calculate velocity that theoretically needs to be applied to the body, to get to the same position + b2Vec2 delta = playerPosition - body->GetPosition(); + b2Vec2 velocity = {delta.x * FRAME_RATE, delta.y * FRAME_RATE}; + + body->SetLinearVelocity(velocity); + } + + void updatePlayerPosition() const + { + b2Vec2 playerPosition = body->GetPosition(); + player->coordinates->set(sf::Vector2f(playerPosition.x, playerPosition.y)); + } }; diff --git a/src/game/physics/map_simulation.cpp b/src/game/physics/map_simulation.cpp index cfd0173..bd0df39 100644 --- a/src/game/physics/map_simulation.cpp +++ b/src/game/physics/map_simulation.cpp @@ -17,15 +17,10 @@ std::shared_ptr MapSimulation::getInstance() void MapSimulation::updateSimulation() { - // Get player positions + // Update simulation positions for (auto &mapPlayer: mapPlayersById) { - auto player = mapPlayer.second->player; - auto body = mapPlayer.second->body; - - auto coordinates = player->coordinates->world(); - b2Vec2 playerPosition = b2Vec2(coordinates.x, coordinates.y); - body->SetTransform(playerPosition, 0); + mapPlayer.second->updateSimulationPosition(); } world->Step(FRAME_TIME.asSeconds(), MAPSIM_VELOCITY_ITERATIONS, MAPSIM_POSITION_ITERATIONS); @@ -33,11 +28,7 @@ void MapSimulation::updateSimulation() // Update player positions for (auto &mapPlayer: mapPlayersById) { - auto player = mapPlayer.second->player; - auto body = mapPlayer.second->body; - - b2Vec2 playerPosition = body->GetPosition(); - player->coordinates->set(sf::Vector2f(playerPosition.x, playerPosition.y)); + mapPlayer.second->updatePlayerPosition(); } } @@ -74,8 +65,8 @@ void MapSimulation::constructSquareObstacle(float minX, float minY, float maxX, void MapSimulation::addPlayer(Player *player) { b2BodyDef bodyDef; - bodyDef.type = b2_kinematicBody; - bodyDef.position.Set(player->getTrackablePosition().x, player->getTrackablePosition().y); + bodyDef.type = b2_dynamicBody; + bodyDef.position.Set(player->coordinates->world().x, player->coordinates->world().y); b2Body *body = world->CreateBody(&bodyDef); b2CircleShape shape; diff --git a/src/game/player/player_spawner.cpp b/src/game/player/player_spawner.cpp index 52b26f7..d0d546d 100644 --- a/src/game/player/player_spawner.cpp +++ b/src/game/player/player_spawner.cpp @@ -1,6 +1,7 @@ #include "player_spawner.hpp" #include "player.hpp" #include "../../texture_config.h" +#include "../physics/map_simulation.hpp" PlayerSpawner::PlayerSpawner(const std::vector &spawnPoints) { @@ -30,7 +31,9 @@ void PlayerSpawner::spawnPlayer(const std::shared_ptr &inputIdent auto player = new Player(inputIdentity, PLAYER_SKIN, spawn); + MapSimulation::getInstance()->addPlayer(player); Game::getInstance()->addGameObject(player); + // TODO: Better view handling Game::getInstance()->views[0]->addTrackable(player); } diff --git a/src/primitives/circle_object.cpp b/src/primitives/circle_object.cpp index bb7a5f7..37a8580 100644 --- a/src/primitives/circle_object.cpp +++ b/src/primitives/circle_object.cpp @@ -6,7 +6,7 @@ CircleObject::CircleObject(int radius, sf::Color color) : radius(radius), color( } -void CircleObject::draw(sf::RenderWindow *window) const +void CircleObject::draw(sf::RenderWindow *window) { sf::CircleShape circle(radius); circle.setFillColor(color); @@ -15,11 +15,6 @@ void CircleObject::draw(sf::RenderWindow *window) const window->draw(circle); } -void CircleObject::update() -{ - -} - int CircleObject::getRadius() const { return radius; diff --git a/src/primitives/circle_object.h b/src/primitives/circle_object.h index 92ef083..dfab5ec 100644 --- a/src/primitives/circle_object.h +++ b/src/primitives/circle_object.h @@ -10,8 +10,7 @@ class CircleObject : public GameObject { public: CircleObject(int radius, sf::Color color); - void draw(sf::RenderWindow *window) const override; - void update() override; + void draw(sf::RenderWindow *window) override; int getRadius() const; diff --git a/src/sprites/animated_sprite.cpp b/src/sprites/animated_sprite.cpp index 04bd42f..e890e98 100644 --- a/src/sprites/animated_sprite.cpp +++ b/src/sprites/animated_sprite.cpp @@ -22,7 +22,7 @@ void AnimatedSprite::update() } } -void AnimatedSprite::draw(sf::RenderWindow *window) const +void AnimatedSprite::draw(sf::RenderWindow *window) { auto currentSprite = sprites[currentFrame]; currentSprite.setPosition(coordinates->isometric().toScreen()); diff --git a/src/sprites/animated_sprite.hpp b/src/sprites/animated_sprite.hpp index 907bc4c..5357499 100644 --- a/src/sprites/animated_sprite.hpp +++ b/src/sprites/animated_sprite.hpp @@ -13,7 +13,7 @@ public: void update() override; - void draw(sf::RenderWindow *window) const override; + void draw(sf::RenderWindow *window) override; sf::Time frameDuration = sf::seconds(0.1f); diff --git a/src/sprites/single_sprite.cpp b/src/sprites/single_sprite.cpp index 8fe4b44..94c5a34 100644 --- a/src/sprites/single_sprite.cpp +++ b/src/sprites/single_sprite.cpp @@ -15,14 +15,10 @@ SingleSprite::SingleSprite(const std::shared_ptr &texture, const sf setSize(size); } -void SingleSprite::draw(sf::RenderWindow *window) const -{ - window->draw(sprite); -} - -void SingleSprite::lateUpdate() +void SingleSprite::draw(sf::RenderWindow *window) { sprite.setPosition(coordinates->isometric().toScreen()); + window->draw(sprite); } void SingleSprite::setSize(const sf::Vector2f &size) diff --git a/src/sprites/single_sprite.hpp b/src/sprites/single_sprite.hpp index d6430c1..9757bcc 100644 --- a/src/sprites/single_sprite.hpp +++ b/src/sprites/single_sprite.hpp @@ -13,9 +13,7 @@ public: SingleSprite(const std::shared_ptr &texture, const sf::Vector2f &size = sf::Vector2f(0, 0)); - void draw(sf::RenderWindow *window) const override; - - void lateUpdate() override; + void draw(sf::RenderWindow *window) override; void setSize(const sf::Vector2f &size) override;