2020-11-21 19:57:40 +00:00
|
|
|
#include "sdlpp_rectcolider.hpp"
|
|
|
|
|
|
|
|
namespace SDLPP {
|
|
|
|
RectColider::RectColider( double x, double y, double w, double h )
|
|
|
|
: CollisionPolygon( x, y ) {
|
|
|
|
w_ = w;
|
|
|
|
h_ = h;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool RectColider::colidesWith( const SDLPP::CollisionPolygon &other ) const {
|
|
|
|
if ( other.isCircle() ) {
|
|
|
|
return other.colidesWith( *this );
|
|
|
|
}
|
|
|
|
if ( other.isInfinite() ) {
|
|
|
|
return infinityIntersection( other, *this );
|
|
|
|
}
|
|
|
|
if ( isInfinite() )
|
|
|
|
return infinityIntersection( *this, other );
|
|
|
|
return intersects( *this, other );
|
|
|
|
}
|
|
|
|
|
|
|
|
bool RectColider::isCircle() const {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
int RectColider::topmost() const {
|
|
|
|
return ( !isInfinite() || original_y != -1 ) * getY() + isInfinite() * -1;
|
|
|
|
}
|
|
|
|
int RectColider::bottommost() const {
|
|
|
|
return ( !isInfinite() || h_ != -1 ) * ( getY() + pixel_h ) +
|
|
|
|
isInfinite() * -1;
|
|
|
|
}
|
|
|
|
int RectColider::leftmost() const {
|
|
|
|
return ( !isInfinite() || original_x != -1 ) * getX() + isInfinite() * -1;
|
|
|
|
}
|
|
|
|
int RectColider::rightmost() const {
|
|
|
|
return ( !isInfinite() || w_ != -1 ) * ( getX() + pixel_w ) +
|
|
|
|
isInfinite() * -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void RectColider::updateCollision( int x, int y, int w, int h ) {
|
|
|
|
position_x = original_x * w + x;
|
|
|
|
position_y = original_y * h + y;
|
|
|
|
pixel_w = w_ * w;
|
|
|
|
pixel_h = h_ * h;
|
|
|
|
}
|
|
|
|
|
|
|
|
void RectColider::render( Renderer &renderer,
|
|
|
|
const std::tuple< int, int, int, int > &color ) {
|
|
|
|
auto rect = getRect();
|
|
|
|
// outline with desired color at 50% opacity
|
|
|
|
SDL_SetRenderDrawColor( renderer.getRendererPtr(), std::get< 0 >( color ),
|
|
|
|
std::get< 1 >( color ), std::get< 2 >( color ),
|
|
|
|
0x80 );
|
|
|
|
SDL_RenderDrawRect( renderer.getRendererPtr(), &rect );
|
|
|
|
// fill with desired color at 25% opacity
|
|
|
|
SDL_SetRenderDrawColor( renderer.getRendererPtr(), std::get< 0 >( color ),
|
|
|
|
std::get< 1 >( color ), std::get< 2 >( color ),
|
|
|
|
0x40 );
|
|
|
|
SDL_RenderFillRect( renderer.getRendererPtr(), &rect );
|
|
|
|
}
|
|
|
|
|
|
|
|
void RectColider::render( Renderer &renderer ) {
|
|
|
|
auto rect = getRect();
|
|
|
|
SDL_SetRenderDrawColor( renderer.getRendererPtr(), sdl_color.r, sdl_color.g,
|
|
|
|
sdl_color.b, sdl_color.a );
|
|
|
|
SDL_RenderFillRect( renderer.getRendererPtr(), &rect );
|
|
|
|
SDL_SetRenderDrawColor( renderer.getRendererPtr(), sdl_outline.r,
|
|
|
|
sdl_outline.g, sdl_outline.b, sdl_outline.a );
|
|
|
|
SDL_RenderDrawRect( renderer.getRendererPtr(), &rect );
|
|
|
|
}
|
|
|
|
|
|
|
|
SDL_Rect RectColider::getRect() {
|
|
|
|
if ( !isInfinite() )
|
|
|
|
return { leftmost(), topmost(), pixel_w, pixel_h };
|
|
|
|
|
|
|
|
SDL_Rect r = { 0, 0, 0, 0 };
|
|
|
|
if ( ( r.x = leftmost() ) == -1 )
|
|
|
|
r.x = 0;
|
|
|
|
if ( ( r.y = topmost() ) == -1 )
|
|
|
|
r.y = 0;
|
|
|
|
if ( rightmost() == -1 )
|
|
|
|
r.w = std::numeric_limits< int >::max();
|
|
|
|
else
|
|
|
|
r.w = pixel_w;
|
|
|
|
if ( bottommost() == -1 )
|
|
|
|
r.h = std::numeric_limits< int >::max();
|
|
|
|
else
|
|
|
|
r.h = pixel_h;
|
|
|
|
return r;
|
|
|
|
}
|
2020-12-18 15:02:02 +00:00
|
|
|
|
|
|
|
std::shared_ptr< CollisionPolygon > RectColider::copySelf() {
|
|
|
|
return std::make_shared< RectColider >( *this );
|
|
|
|
}
|
|
|
|
|
2020-11-21 19:57:40 +00:00
|
|
|
} // namespace SDLPP
|