/* * location.h * BoE * * Created by Celtic Minstrel on 20/04/09. * */ #ifndef BOE_LOCATION_H #define BOE_LOCATION_H #include struct rectangle; struct location { int x,y; location(); location(int x, int y); template location(sf::Vector2 other) : location(other.x, other.y) {} bool in(rectangle r); template operator typename sf::template Vector2() { return sf::Vector2(x,y); } }; class rectangle_size_delegate { friend struct rectangle; rectangle& forRect; int rectangle::* b1; int rectangle::* b2; rectangle_size_delegate(rectangle& rect, int rectangle::* first, int rectangle::* last); public: operator int(); rectangle_size_delegate& operator=(int val); rectangle_size_delegate& operator+=(int val); rectangle_size_delegate& operator-=(int val); rectangle_size_delegate& operator*=(int val); rectangle_size_delegate& operator/=(int val); }; struct rectangle { int top, left, bottom, right; rectangle(); rectangle(location tl, location br); rectangle(int t, int l, int b, int r); explicit rectangle(sf::Texture& texture); explicit rectangle(sf::RenderTarget& texture); template rectangle(sf::Rect other) : rectangle(other.top, other.left, other.top + other.height, other.left + other.width) {} template rectangle(sf::Vector2 size) : rectangle(0, 0, size.y, size.x) {} rectangle_size_delegate width(); rectangle_size_delegate height(); location centre(); location topLeft(); location topRight(); location bottomLeft(); location bottomRight(); bool contains(location p); bool contains(int x, int y); void offset(int h, int v); void offset(location diff); template void offset(sf::Vector2 diff) {offset(diff.x,diff.y);} void inset(int dh, int dv); rectangle& operator|=(rectangle other); template operator typename sf::template Rect() { return sf::Rect(left, top, width(), height()); } }; using RECT = rectangle; // TODO: A temporary measure, eventually I'll actually replace RECT with rectangle everywhere bool operator == (location p1,location p2); bool operator != (location p1,location p2); bool operator == (rectangle r1, rectangle r2); bool operator != (rectangle r1, rectangle r2); rectangle operator|(rectangle one, rectangle two); rectangle rectunion(rectangle one, rectangle two); short dist(location p1,location p2); short vdist(location p1,location p2); location loc(int a, int b); location loc(); rectangle rect(); rectangle rect(location tl, location br); rectangle rect(int top, int left, int bottom, int right); #endif