Welt2D.h 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. #pragma once
  2. #include <functional>
  3. #include <queue>
  4. #include "Array.h"
  5. #include "Mat3.h"
  6. #include "Punkt.h"
  7. #include "Rect2.h"
  8. namespace Framework
  9. {
  10. typedef Vec2<float> Vertex;
  11. class Bild;
  12. struct WeltInfo
  13. {
  14. float airResistance;
  15. bool hasSize;
  16. bool circular;
  17. Punkt size;
  18. };
  19. class Object2D : public virtual ReferenceCounter
  20. {
  21. protected:
  22. std::queue<std::function<void()>> actions;
  23. Vertex position;
  24. Vertex speed;
  25. float rSpeed;
  26. float rotation;
  27. float size;
  28. bool collision;
  29. public:
  30. DLLEXPORT Object2D();
  31. DLLEXPORT virtual ~Object2D();
  32. //! Übergibt einen Void Funktionspointer auf eine Aktion die einmalig
  33. //! vom Hauptthread ausgeführt werden soll. (Passiert nach dem Tick)
  34. DLLEXPORT void postAction(std::function<void()> action);
  35. //! Fügt einen Schub in die ausbreitungsrichtung der Explusion zur
  36. //! Bewegung des Objektes hinzu \param worldPos Die Position des
  37. //! Explusionsuhrsprungs \param intensity Die Intensität der Explusion
  38. DLLEXPORT void explosion(Vertex worldPos, float intensity);
  39. //! Übt auf das Objekt einen Impuls aus, der sowohl die geschwindigkeit,
  40. //! als auch die Drehungsgeschwindigkeit des Objektes beeinflusst \param
  41. //! start Die Startposition des Impulses in der Welt \param speed Die
  42. //! Geschwindigkeit des Impulses in der Welt \param strength Stärke des
  43. //! aufpralls
  44. DLLEXPORT virtual void impuls(
  45. Vertex start, Vertex speed, float strength = 1.f);
  46. //! Setzt die Geschwindigkeit des Objektes in der Welt
  47. //! \param speed Anzahl der zurückgelegten Koordinaten pro Sekunde
  48. DLLEXPORT void setSpeed(Vertex speed);
  49. //! Setzt die Geschwindigkeit des Objektes in der Welt
  50. //! \param x Anzahl der zurückgelegten x Koordinaten pro Sekunde
  51. //! \param y Anzahl der zurückgelegten y Koordinaten pro Sekunde
  52. DLLEXPORT void setSpeed(float x, float y);
  53. //! Setzt die Position des Objektes in der Welt
  54. //! \param pos Die Position in Weltkoordinaten
  55. DLLEXPORT void setPosition(Vertex pos);
  56. //! Setzt die Position des Objektes in der Welt
  57. //! \param x Die X Position in Weltkoordinaten
  58. //! \param y Die Y Position in Weltkoordinaten
  59. DLLEXPORT void setPosition(float x, float y);
  60. //! Setzt die Rotationsgeschwindigkeit in Radiant pro Sekunde
  61. //! \param ds Die neue Rptationsgeschwindigkeit
  62. DLLEXPORT void setDrehungSpeed(float ds);
  63. //! Setzt die Drehung des Models gegen den Uhrzeigersinn
  64. //! \param drehung Der winkel in Bogenmas
  65. DLLEXPORT void setDrehung(float drehung);
  66. //! Fügt zum aktuellen Drehungswinkel etwas hinzu
  67. //! \param drehung Der Winkel in Bogenmas, der hinzugefügt werden soll
  68. DLLEXPORT void addDrehung(float drehung);
  69. //! Setzt die Skallierung des Modells
  70. //! \param size Der Faktor, mit dem Skalliert wird
  71. DLLEXPORT void setSize(float size);
  72. //! Addiert zur Skallierung einen bestimmten Wert hinzu
  73. //! \param size Der Wert, der zur skallierung hinzugefügt werden soll
  74. DLLEXPORT void addSize(float size);
  75. //! Legt fest, ob andere Objekte mit diesem Objekt zusammenschtoßen
  76. //! können \param handle 0, falls keine Kollisionen existieren
  77. DLLEXPORT void setCollision(bool handle);
  78. //! Prüft ob eine Collision mit einem anderen Objekt vorliegt und passt
  79. //! die Geschwindigkeiten beider Objekte entsprechend an
  80. DLLEXPORT virtual bool handleCollision(Object2D* obj);
  81. //! Verarbeitet vargangene Zeit und aktualisiert die Position und die
  82. //! Drehung des Objektes in der Welt \param zeit Die vergangene Zeit in
  83. //! Sekunden
  84. DLLEXPORT virtual bool tick(const WeltInfo& info, double zeit);
  85. //! Zeichnet das Objekt in ein Bild
  86. //! \param kamMat Due Kamera Matrix, welche einen Punkt aus
  87. //! Weltkoordinaten in Bildschirmkoordinaten umwandelt \param zRObj Das
  88. //! Bild, in welches gezeichnet werden soll \param ignoreTransparentFlag
  89. //! wenn 1, dann werden auch collisionen mit transparenten polygonen
  90. //! beachtet
  91. virtual void render(
  92. Mat3<float>& kamMat, Bild& zRObj, const char* ignoreTransparentFlag)
  93. = 0;
  94. //! Gibt zurück, ob ein Punkt in dem Objekt enthalten ist
  95. //! \param p Der Punkt
  96. //! \param ignoreTransparentFlag wenn 1, dann werden auch collisionen
  97. //! mit transparenten polygonen beachtet
  98. DLLEXPORT virtual bool istPunktInnen(
  99. Vertex p, bool ignoreTransparentFlag = 0) const;
  100. //! Überprüft, ob eine Linie im Objekt enthalten ist
  101. //! \param a Der startpunkt der Linie
  102. //! \param b Der endpunkt der Linie
  103. //! \param ignoreTransparentFlag wenn 1, dann werden auch collisionen
  104. //! mit transparenten polygonen beachtet
  105. DLLEXPORT virtual bool istLinieInnen(
  106. Vertex a, Vertex b, bool ignoreTransparentFlag = 0) const;
  107. //! Überprüft, ob sich das Objekt mit einem anderen Überschneidet
  108. //! \param zObj Ein Zeiger auf das andere Objekt ohne erhöhten Reference
  109. //! Counter \param sp Ein Zeiger auf einen Punkt, in dem der
  110. //! Schnittpunkt gespeichert wird \param end 0, falls alle Ecken beider
  111. //! Objekte überprüft werdden sollen. 1, falls nur die Punkte dieses
  112. //! Models im anderen gesucht werden sollen
  113. DLLEXPORT virtual bool istModelInnen(const Object2D* zObj,
  114. Vertex* sp = 0,
  115. bool end = 0,
  116. bool ignoreTransparent = 0) const;
  117. //! Gibt eine Matrix zurück, welche einen Punkt aus Objektkoordinaten in
  118. //! Bildschirmkoordinaten umrechnet
  119. DLLEXPORT Mat3<float> getObjectMatrix() const;
  120. //! Gibt eine Matrix zurück, welche einen Punkt aus
  121. //! Bildschirmkoordinaten in Objektkoordinaten umrechnet
  122. DLLEXPORT Mat3<float> getInverseObjectMatrix() const;
  123. //! Rechnet einen Punkt aus Welt Koordinaten in Objektkoordinaten um
  124. //! \param worldPos Die Position des Punktes in der Welt
  125. DLLEXPORT Vertex getObjectPos(Vertex worldPos) const;
  126. //! Rechnet eine Richtung aus Weltkoordinaten in Objektkoordinaten um
  127. //! \param worldDir Die Richtung in Weltkoordinaten
  128. DLLEXPORT Vertex getObjectDir(Vertex worldDir) const;
  129. //! Rechnet einen Punkt aus Objektkoordinaten in Weltkoordinaten um
  130. //! \param worldPos Die Position des Punktes in Objektkoordinaten
  131. DLLEXPORT Vertex getWorldPos(Vertex objectPos) const;
  132. //! Rechnet eine Richtung aus Objektkoordinaten in Weltkoordinaten um
  133. //! \param worldDir Die Richtung in Objektkoordinaten
  134. DLLEXPORT Vertex getWorldDir(Vertex objectDir) const;
  135. //! Gibt die Geschwindigkeit des Objektes zurück
  136. DLLEXPORT Vertex getSpeed() const;
  137. //! gibt die Position des Objektes zurück
  138. DLLEXPORT Vertex getPosition() const;
  139. //! gibt die Drehgeschwindigkeit des Objektes zurück
  140. DLLEXPORT float getDrehungSpeed() const;
  141. //! gibt die Drehung des Objektes zurück
  142. DLLEXPORT float getDrehung() const;
  143. //! gibt den Skallierungs Objektes zurück
  144. DLLEXPORT float getSize() const;
  145. //! Gibt eine Boundingbox zurück, in der sich alle Punkte des Objektes
  146. //! befinden ( in Weltkoordinaten)
  147. DLLEXPORT virtual Rect2<float> getBoundingBox() const = 0;
  148. //! Bestimmt den Aufschlagspunkt eines Strahls, der von pos ausgehend in
  149. //! Richtung dir abgegeben wird. \param pos Der Stützvektor der Linie
  150. //! \param dir Der richtungsvektor der Linie
  151. //! \param hitPoint eine referenz auf die variable in dem der
  152. //! schnittpunkt gespeichert werden soll \return 1, fals ein
  153. //! Schnittpunkt existiert
  154. DLLEXPORT virtual bool calcHitPoint(
  155. Vertex pos, Vertex dir, Vertex& hitpoint) const;
  156. //! Ermittelt die Fläche des Objektes, welche rechtwinklich zum
  157. //! Bewegungsvektor steht
  158. DLLEXPORT virtual float getLuftWiederstand() const;
  159. //! Gibt die Masse des Objektes zurück
  160. DLLEXPORT virtual float getMasse() const;
  161. //! Legt fest, ob andere Objekte mit diesem Objekt zusammenschtoßen
  162. //! können \return 0, falls keine Kollisionen existieren
  163. DLLEXPORT bool canCollide();
  164. };
  165. class Welt2D : public virtual ReferenceCounter
  166. {
  167. private:
  168. RCArray<Object2D>* objects;
  169. WeltInfo info;
  170. void render(Mat3<float>& kamMat,
  171. Punkt size,
  172. Bild& zRObj,
  173. int xOffset,
  174. int yOffset,
  175. const char* kamName);
  176. public:
  177. DLLEXPORT Welt2D();
  178. DLLEXPORT ~Welt2D();
  179. DLLEXPORT void setAirResistance(float resistance);
  180. DLLEXPORT void setSize(int width, int height);
  181. DLLEXPORT void setSize(bool hasSize);
  182. DLLEXPORT void setCircular(bool circular);
  183. DLLEXPORT Object2D* zObjectAt(
  184. int x, int y, bool ignoreTransparentFlag = 0);
  185. DLLEXPORT Object2D* getObjectAt(
  186. int x, int y, bool ignoreTransparentFlag = 0);
  187. DLLEXPORT void addObject(Object2D* obj);
  188. DLLEXPORT void removeObject(Object2D* zObj);
  189. DLLEXPORT void removeAll();
  190. DLLEXPORT void explosion(
  191. Vertex worldPos, float intensity, float maxRad);
  192. DLLEXPORT void impuls(Vertex worldPos, Vertex worldDir);
  193. DLLEXPORT bool tick(double zeit);
  194. DLLEXPORT void render(
  195. Mat3<float>& kamMat, Punkt size, Bild& zRObj, const char* kamName);
  196. DLLEXPORT const WeltInfo& getWorldInfo() const;
  197. DLLEXPORT Iterator<Object2D*> getMembers();
  198. };
  199. } // namespace Framework