From 20c30712b929ff5a70d6815a713fdf12bce0364b Mon Sep 17 00:00:00 2001 From: zv0n Date: Fri, 18 Dec 2020 16:02:02 +0100 Subject: [PATCH] SDLPP: make copySelf actually copy everything --- sdlpp/sdlpp_circlecolider.cpp | 4 ++++ sdlpp/sdlpp_circlecolider.hpp | 1 + sdlpp/sdlpp_collision.hpp | 1 + sdlpp/sdlpp_rectcolider.cpp | 5 +++++ sdlpp/sdlpp_rectcolider.hpp | 1 + sdlpp/sdlpp_rectrenderer.cpp | 9 ++++++--- sdlpp/sdlpp_rectrenderer.hpp | 2 ++ sdlpp/sdlpp_renderobject.cpp | 15 +++++++++++++++ sdlpp/sdlpp_renderobject.hpp | 1 + 9 files changed, 36 insertions(+), 3 deletions(-) diff --git a/sdlpp/sdlpp_circlecolider.cpp b/sdlpp/sdlpp_circlecolider.cpp index e26eed7..bc0325d 100644 --- a/sdlpp/sdlpp_circlecolider.cpp +++ b/sdlpp/sdlpp_circlecolider.cpp @@ -130,4 +130,8 @@ void CircleColider::render( Renderer &renderer ) { int CircleColider::getRadius() const { return rad_; } + +std::shared_ptr< CollisionPolygon > CircleColider::copySelf() { + return std::make_shared< CircleColider >( *this ); +} } // namespace SDLPP diff --git a/sdlpp/sdlpp_circlecolider.hpp b/sdlpp/sdlpp_circlecolider.hpp index e598de5..551677c 100644 --- a/sdlpp/sdlpp_circlecolider.hpp +++ b/sdlpp/sdlpp_circlecolider.hpp @@ -24,6 +24,7 @@ public: render( Renderer &renderer, const std::tuple< int, int, int, int > &color ) override; virtual void render( Renderer &renderer ) override; + virtual std::shared_ptr copySelf() override; private: int getRadius() const; diff --git a/sdlpp/sdlpp_collision.hpp b/sdlpp/sdlpp_collision.hpp index a32c431..e78e5ce 100644 --- a/sdlpp/sdlpp_collision.hpp +++ b/sdlpp/sdlpp_collision.hpp @@ -25,6 +25,7 @@ public: int getY() const; void setColor( const std::string &color ); void setOutlineColor( const std::string &color ); + virtual std::shared_ptr copySelf() = 0; protected: double original_x; diff --git a/sdlpp/sdlpp_rectcolider.cpp b/sdlpp/sdlpp_rectcolider.cpp index 4c7f273..1507291 100644 --- a/sdlpp/sdlpp_rectcolider.cpp +++ b/sdlpp/sdlpp_rectcolider.cpp @@ -88,4 +88,9 @@ SDL_Rect RectColider::getRect() { r.h = pixel_h; return r; } + +std::shared_ptr< CollisionPolygon > RectColider::copySelf() { + return std::make_shared< RectColider >( *this ); +} + } // namespace SDLPP diff --git a/sdlpp/sdlpp_rectcolider.hpp b/sdlpp/sdlpp_rectcolider.hpp index ece0db0..75d0918 100644 --- a/sdlpp/sdlpp_rectcolider.hpp +++ b/sdlpp/sdlpp_rectcolider.hpp @@ -22,6 +22,7 @@ public: render( Renderer &renderer, const std::tuple< int, int, int, int > &color ) override; virtual void render( Renderer &renderer ) override; + virtual std::shared_ptr copySelf() override; private: SDL_Rect getRect(); diff --git a/sdlpp/sdlpp_rectrenderer.cpp b/sdlpp/sdlpp_rectrenderer.cpp index 50aff61..a1c3975 100644 --- a/sdlpp/sdlpp_rectrenderer.cpp +++ b/sdlpp/sdlpp_rectrenderer.cpp @@ -139,9 +139,12 @@ void RectangleRender::centerX() { updateSizeAndPosition(); } std::shared_ptr< RenderObject > RectangleRender::copySelf() { - // TODO ACTUALLY copy, don't just copy pointers to textures and whatnot, - // create new textures!!! - return std::make_shared< RectangleRender >( *this ); + auto ret = std::make_shared< RectangleRender >( *this ); + copyTo(ret); + return ret; +} +void RectangleRender::copyTo(std::shared_ptr other) { + RenderObject::copyTo(other); } std::string RectangleRender::getColor() const { return color; diff --git a/sdlpp/sdlpp_rectrenderer.hpp b/sdlpp/sdlpp_rectrenderer.hpp index ea86393..f07ef2d 100644 --- a/sdlpp/sdlpp_rectrenderer.hpp +++ b/sdlpp/sdlpp_rectrenderer.hpp @@ -4,6 +4,7 @@ #include "sdlpp_common.hpp" #include "sdlpp_renderobject.hpp" #include "sdlpp_rectcolider.hpp" +#include "sdlpp_circlecolider.hpp" namespace SDLPP { class SDLPPSCOPE RectangleRender : public RenderObject { @@ -45,6 +46,7 @@ public: std::string getColor() const; protected: + virtual void copyTo(std::shared_ptr other) override; void updateXY(); double og_x; double og_y; diff --git a/sdlpp/sdlpp_renderobject.cpp b/sdlpp/sdlpp_renderobject.cpp index a7a8477..1a7cbc8 100644 --- a/sdlpp/sdlpp_renderobject.cpp +++ b/sdlpp/sdlpp_renderobject.cpp @@ -104,4 +104,19 @@ std::shared_ptr< Renderer > RenderObject::getRenderer() const { void RenderObject::setSceneID( int id ) { scene_id = id; } +void RenderObject::copyTo(std::shared_ptr other) { + other->collisions.clear(); + for ( auto &colider : collisions ) { + other->collisions.push_back(colider->copySelf()); + } + other->texture.reset(); + if ( texture ) { + other->texture = std::make_shared< Texture >( *texture ); + } + other->polygon.reset(); + if ( polygon ) { + other->polygon = polygon->copySelf(); + } + other->colidedWith.clear(); +} } // namespace SDLPP diff --git a/sdlpp/sdlpp_renderobject.hpp b/sdlpp/sdlpp_renderobject.hpp index 48de5d7..6131827 100644 --- a/sdlpp/sdlpp_renderobject.hpp +++ b/sdlpp/sdlpp_renderobject.hpp @@ -80,6 +80,7 @@ public: std::shared_ptr< Renderer > getRenderer() const; protected: + virtual void copyTo(std::shared_ptr other); std::vector< std::shared_ptr< CollisionPolygon > > collisions; std::shared_ptr< Texture > texture; std::shared_ptr< Renderer > renderer;