supertux
collision_system.hpp
1 // SuperTux
2 // Copyright (C) 2006 Matthias Braun <matze@braunis.de>
3 // 2018 Ingo Ruhnke <grumbel@gmail.com>
4 //
5 // This program is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with this program. If not, see <http://www.gnu.org/licenses/>.
17 
18 #ifndef HEADER_SUPERTUX_COLLISION_COLLISION_SYSTEM_HPP
19 #define HEADER_SUPERTUX_COLLISION_COLLISION_SYSTEM_HPP
20 
21 #include <vector>
22 #include <stdint.h>
23 
24 #include "collision/collision.hpp"
25 
26 class CollisionObject;
27 class DrawingContext;
28 class Rectf;
29 class Sector;
30 class Vector;
31 
32 class CollisionSystem final
33 {
34 public:
35  CollisionSystem(Sector& sector);
36 
37  void add(CollisionObject* object);
38  void remove(CollisionObject* object);
39 
41  void draw(DrawingContext& context);
42 
46  void update();
47 
48  bool is_free_of_tiles(const Rectf& rect, const bool ignoreUnisolid = false) const;
49  bool is_free_of_statics(const Rectf& rect, const CollisionObject* ignore_object, const bool ignoreUnisolid) const;
50  bool is_free_of_movingstatics(const Rectf& rect, const CollisionObject* ignore_object) const;
51  bool free_line_of_sight(const Vector& line_start, const Vector& line_end, const CollisionObject* ignore_object) const;
52 
53  std::vector<CollisionObject*> get_nearby_objects(const Vector& center, float max_distance) const;
54 
55 private:
64  void collision_static(collision::Constraints* constraints,
65  const Vector& movement, const Rectf& dest,
66  CollisionObject& object);
67 
68  void collision_tilemap(collision::Constraints* constraints,
69  const Vector& movement, const Rectf& dest,
70  CollisionObject& object) const;
71 
72  uint32_t collision_tile_attributes(const Rectf& dest, const Vector& mov) const;
73 
74  void collision_object(CollisionObject* object1, CollisionObject* object2) const;
75 
76  void collision_static_constrains(CollisionObject& object);
77 
78 private:
79  Sector& m_sector;
80  std::vector<CollisionObject*> m_objects;
81 
82 private:
83  CollisionSystem(const CollisionSystem&) = delete;
84  CollisionSystem& operator=(const CollisionSystem&) = delete;
85 };
86 
87 #endif
88 
89 /* EOF */
Simple two dimensional vector.
Definition: vector.hpp:24
void draw(DrawingContext &context)
Draw collision shapes for debugging.
Definition: collision_system.cpp:62
Definition: collision_system.hpp:32
Represents one of (potentially) multiple, separate parts of a Level.
Definition: sector.hpp:49
void update()
Checks for all possible collisions.
Definition: collision_system.cpp:459
Definition: rectf.hpp:29
Definition: collision.hpp:31
Definition: collision_object.hpp:30
This class provides functions for drawing things on screen.
Definition: drawing_context.hpp:42