Welt2D.h 9.4 KB

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