SFGF
Polygon.hpp
1 #ifndef POLYGON_HPP
2 #define POLYGON_HPP
3 
4 /* =========================================================== *
5  * SFGF (c) Kamil Koczurek | koczurekk@gmail.com *
6  * GNU GPL v3 License http://www.gnu.org/licenses/gpl-3.0.html *
7  * =========================================================== */
8 
9 #include <SFML/Graphics/RenderTarget.hpp>
10 #include <SFML/Graphics/Drawable.hpp>
11 #include <SFML/Graphics/Vertex.hpp>
12 #include "GameObject.hpp"
13 #include "Collider.hpp"
14 
15 namespace sfgf {
16  class Polygon
17  : public GameObject
18  , public sf::Drawable {
19  private:
20  Collider sample_collider;
21  Collider tranformed_collider;
22 
23  std::vector<sf::Vertex> m_arr;
24  const sf::Texture *m_tx = nullptr;
25 
26  virtual void draw(sf::RenderTarget& window, sf::RenderStates states) const {
27  states.transform *= getTransform();
28  states.texture = m_tx;
29 
30  window.draw(m_arr.data(), 4, sf::TriangleFan, states);
31  }
32 
33  public:
34  Polygon(size_t size);
35 
36  void setTexture(const sf::Texture& tex, const std::vector<sf::Vector2f>& texCorrds);
37 
38  void setColor(sf::Color c);
39 
40  void setVertices(const std::vector<sf::Vector2f>& vertices);
41  const std::vector<sf::Vertex>& getVertices() const;
42 
43  void setSampleCollider(const Collider& c);
44  const Collider &getSampleCollider() const;
45  const Collider &getTransformedCollider() const;
46  Collider getDefaultSampleCollider() const;
47 
48  void updateCollider();
49  virtual void update(sf::Time);
50 
51  bool contains(sf::Vector2f point) const;
52  bool intersects(Polygon& poly) const;
53  bool collides(Polygon& poly) const;
54 
55  sf::FloatRect getGlobalBounds() const;
56  };
57 
58  Polygon::Polygon(size_t size) {
59  m_arr.resize(size);
60  }
61 
62  void Polygon::setTexture(const sf::Texture& tex, const std::vector<sf::Vector2f>& texCorrds) {
63  for(auto i = 0u; i < texCorrds.size(); ++i) {
64  m_arr[i].texCoords = texCorrds[i];
65  }
66 
67  m_tx = &tex;
68  }
69 
70  void Polygon::setColor(sf::Color c) {
71  for(auto& v: m_arr) {
72  v.color = c;
73  }
74  }
75 
76  void Polygon::setVertices(const std::vector<sf::Vector2f>& vertices) {
77  for(auto i = 0u; i < vertices.size(); ++i) {
78  m_arr[i].position = vertices[i];
79  }
80 
81  setSampleCollider(getDefaultSampleCollider());
82  }
83  const std::vector<sf::Vertex>& Polygon::getVertices() const {
84  return m_arr;
85  }
86 
87  void Polygon::setSampleCollider(const Collider& c) {
88  sample_collider = c;
89  tranformed_collider = c;
90  }
91  const Collider& Polygon::getSampleCollider() const {
92  return sample_collider;
93  }
94  const Collider& Polygon::getTransformedCollider() const {
95  return tranformed_collider;
96  }
97  Collider Polygon::getDefaultSampleCollider() const {
98  Collider result;
99  for(const sf::Vertex& v: m_arr) {
100  result.pushBack(v.position);
101  }
102 
103  return result;
104  }
105 
106  void Polygon::updateCollider() {
107  tranformed_collider = sample_collider;
108  tranformed_collider.applyTransform(getTransform());
109  }
110  void Polygon::update(sf::Time) {
111  updateCollider();
112  }
113 
114  bool Polygon::intersects(Polygon& poly) const {
115  return tranformed_collider.intersects(poly.getTransformedCollider());
116  }
117  bool Polygon::collides(Polygon& poly) const {
118  return tranformed_collider.collides(poly.getTransformedCollider());
119  }
120  bool Polygon::contains(sf::Vector2f point) const {
121  return tranformed_collider.contains(point);
122  }
123 
124  sf::FloatRect Polygon::getGlobalBounds() const {
125  return tranformed_collider.getGlobalBounds();
126  }
127 }
128 
129 #endif // POLYGON_HPP
Contains all SFGF classes.
Definition: GameObject.hpp:14
bool intersects(const Collider &poly) const
Check for intersection.
Definition: Collider.hpp:260
void applyTransform(const sf::Transform &t)
Applies transform.
Definition: Collider.hpp:239
bool collides(const Collider &poly) const
Check if two colliders collide.
Definition: Collider.hpp:304
Handles collisions.
Definition: Collider.hpp:37
Collider class implementation.
void pushBack(sf::Vector2f pt)
Adds point to internal array.
Definition: Collider.hpp:251
Definition: Polygon.hpp:16
sf::FloatRect getGlobalBounds() const
Returns global bounds.
Definition: Collider.hpp:151
bool contains(sf::Vector2f point) const
Check if point is inside of collider.
Definition: Collider.hpp:287