diff --git a/main.cpp b/main.cpp index 734fb1d..78fac44 100644 --- a/main.cpp +++ b/main.cpp @@ -102,7 +102,7 @@ void addStuff(SDLPP::Scene &scene, std::shared_ptr &r) { x->addCollision(SDLPP::Rect(0.3,0.7,0.05,0.31)); x->addCollision(SDLPP::Rect(0.65,0.7,0.05,0.31)); x->addCollision(SDLPP::Rect(0.2,0.3,0.6,0.45)); - x->addCollision(SDLPP::Rect(0.35,0,0.3,0.3)); + x->addCollision(SDLPP::Circle(0.5,0.15,0.3)); x->setTexture("5.png"); x->setId(PLAYER_ID); x->setColiderColor("00FF00"); @@ -273,7 +273,7 @@ int main() { SDL_setFramerate(&gFPS, 60); std::thread inputThread(doInput, main_scene); while( !quit ) { -// SDL_framerateDelay(&gFPS); + SDL_framerateDelay(&gFPS); main_scene->renderScene(); main_scene->presentScene(); frames++; diff --git a/sdlpp.hpp b/sdlpp.hpp index 2910b80..cff11f8 100644 --- a/sdlpp.hpp +++ b/sdlpp.hpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -549,19 +550,46 @@ private: class Circle : public CollisionPolygon { public: Circle(double x, double y, double rad) : CollisionPolygon(x, y) { - rad_ = rad; + original_rad = rad; } virtual ~Circle() {} - virtual bool colidesWith(const CollisionPolygon &other) const; - virtual bool isCircle() const { return true; } - virtual int topmost() const { return getY() - rad_; } - virtual int bottommost() const { return getY() + rad_; }; - virtual int leftmost() const { return getX() - rad_; } - virtual int rightmost() const { return getX() + rad_; } + virtual bool colidesWith(const CollisionPolygon &other) const override; + virtual bool isCircle() const override { return true; } + virtual int topmost() const override { return getY() - rad_; } + virtual int bottommost() const override { return getY() + rad_; }; + virtual int leftmost() const override { return getX() - rad_; } + virtual int rightmost() const override { return getX() + rad_; } + virtual void updateCollision(int x, int y, int w, int h) override { + position_x = original_x * w + x; + position_y = original_y * h + y; + rad_ = original_rad * w; + } + virtual void render(Renderer &renderer, const std::tuple &color) override { + std::vector rect = {leftmost(), topmost(), rightmost(), bottommost()}; + auto center_x = getX(); + auto center_y = getY(); + auto radsq = rad_ * rad_; + for(int i = rect[0]; i <= rect[2]; i++) { + auto xdiff = center_x - i; + auto xdist = xdiff * xdiff; + auto allowed_rad = sqrt(radsq - xdist); + SDL_SetRenderDrawColor(renderer.getRendererPtr(), std::get<0>(color), std::get<1>(color), std::get<2>(color), 0x40); + SDL_RenderDrawLine(renderer.getRendererPtr(), i, center_y - allowed_rad, i, center_y + allowed_rad); + SDL_SetRenderDrawColor(renderer.getRendererPtr(), std::get<0>(color), std::get<1>(color), std::get<2>(color), 0x80); + SDL_RenderDrawLine(renderer.getRendererPtr(), i, center_y - allowed_rad, i, center_y - allowed_rad + 2); + SDL_RenderDrawLine(renderer.getRendererPtr(), i, center_y + allowed_rad, i, center_y + allowed_rad - 2); + } + SDL_SetRenderDrawColor(renderer.getRendererPtr(), 0xFF, 0, 0, 0xFF); + SDL_RenderDrawLine(renderer.getRendererPtr(), center_x, center_y, center_x + rad_, center_y); + SDL_RenderDrawLine(renderer.getRendererPtr(), center_x, center_y, center_x, center_y + rad_); + SDL_RenderDrawLine(renderer.getRendererPtr(), center_x, center_y, center_x - rad_, center_y); + SDL_RenderDrawLine(renderer.getRendererPtr(), center_x, center_y, center_x, center_y - rad_); + } private: int getRadius() const { return rad_; } + double original_rad; int rad_; };