123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- #pragma once
- #include <queue>
- #include <functional>
- #include "Array.h"
- #include "Mat3.h"
- #include "Punkt.h"
- #include "Rect2.h"
- namespace Framework
- {
- typedef Vec2< float > Vertex;
- class Bild;
- struct WeltInfo
- {
- float airResistance;
- bool hasSize;
- bool circular;
- Punkt size;
- };
- class Object2D
- {
- protected:
- std::queue< std::function< void() > > actions;
- Vertex position;
- Vertex speed;
- float rSpeed;
- float rotation;
- float size;
- bool collision;
- int ref;
- public:
- __declspec( dllexport ) Object2D();
- __declspec( dllexport ) virtual ~Object2D();
- // Übergibt einen Void Funktionspointer auf eine Aktion die einmalig vom Hauptthread ausgeführt werden soll. (Passiert nach dem Tick)
- __declspec( dllexport ) void postAction( std::function< void() > action );
- // Fügt einen Schub in die ausbreitungsrichtung der Explusion zur Bewegung des Objektes hinzu
- // worldPos: Die Position des Explusionsuhrsprungs
- // intensity: Die Intensität der Explusion
- __declspec( dllexport ) void explosion( Vertex worldPos, float intensity );
- // Übt auf das Objekt einen Impuls aus, der sowohl die geschwindigkeit, als auch die Drehungsgeschwindigkeit des Objektes beeinflusst
- // start: Die Startposition des Impulses in der Welt
- // speed: Die Geschwindigkeit des Impulses in der Welt
- // strength: Stärke des aufpralls
- __declspec( dllexport ) virtual void impuls( Vertex start, Vertex speed, float strength = 1.f );
- // Setzt die Geschwindigkeit des Objektes in der Welt
- // speed: Anzahl der zurückgelegten Koordinaten pro Sekunde
- __declspec( dllexport ) void setSpeed( Vertex speed );
- // Setzt die Geschwindigkeit des Objektes in der Welt
- // x: Anzahl der zurückgelegten x Koordinaten pro Sekunde
- // y: Anzahl der zurückgelegten y Koordinaten pro Sekunde
- __declspec( dllexport ) void setSpeed( float x, float y );
- // Setzt die Position des Objektes in der Welt
- // pos: Die Position in Weltkoordinaten
- __declspec( dllexport ) void setPosition( Vertex pos );
- // Setzt die Position des Objektes in der Welt
- // x: Die X Position in Weltkoordinaten
- // y: Die Y Position in Weltkoordinaten
- __declspec( dllexport ) void setPosition( float x, float y );
- // Setzt die Rotationsgeschwindigkeit in Radiant pro Sekunde
- // ds: Die neue Rptationsgeschwindigkeit
- __declspec( dllexport ) void setDrehungSpeed( float ds );
- // Setzt die Drehung des Models gegen den Uhrzeigersinn
- // drehung: Der winkel in Bogenmas
- __declspec( dllexport ) void setDrehung( float drehung );
- // Fügt zum aktuellen Drehungswinkel etwas hinzu
- // drehung: Der Winkel in Bogenmas, der hinzugefügt werden soll
- __declspec( dllexport ) void addDrehung( float drehung );
- // Setzt die Skallierung des Modells
- // size: Der Faktor, mit dem Skalliert wird
- __declspec( dllexport ) void setSize( float size );
- // Addiert zur Skallierung einen bestimmten Wert hinzu
- // size: Der Wert, der zur skallierung hinzugefügt werden soll
- __declspec( dllexport ) void addSize( float size );
- // Legt fest, ob andere Objekte mit diesem Objekt zusammenschtoßen können
- // handle: 0, falls keine Kollisionen existieren
- __declspec( dllexport ) void setCollision( bool handle );
- // Prüft ob eine Collision mit einem anderen Objekt vorliegt und passt die Geschwindigkeiten beider Objekte entsprechend an
- __declspec( dllexport ) virtual bool handleCollision( Object2D *obj );
- // Verarbeitet vargangene Zeit und aktualisiert die Position und die Drehung des Objektes in der Welt
- // zeit: Die vergangene Zeit in Sekunden
- __declspec( dllexport ) virtual bool tick( const WeltInfo &info, double zeit );
- // Zeichnet das Objekt in ein Bild
- // kamMat: Due Kamera Matrix, welche einen Punkt aus Weltkoordinaten in Bildschirmkoordinaten umwandelt
- // zRObj: Das Bild, in welches gezeichnet werden soll
- // ignoreTransparentFlag: wenn 1, dann werden auch collisionen mit transparenten polygonen beachtet
- virtual void render( Mat3< float > &kamMat, Bild &zRObj, const char *ignoreTransparentFlag ) = 0;
- // Gibt zurück, ob ein Punkt in dem Objekt enthalten ist
- // p: Der Punkt
- // ignoreTransparentFlag: wenn 1, dann werden auch collisionen mit transparenten polygonen beachtet
- __declspec( dllexport ) virtual bool istPunktInnen( Vertex p, bool ignoreTransparentFlag = 0 ) const;
- // Überprüft, ob eine Linie im Objekt enthalten ist
- // a: Der startpunkt der Linie
- // b: Der endpunkt der Linie
- // ignoreTransparentFlag: wenn 1, dann werden auch collisionen mit transparenten polygonen beachtet
- __declspec( dllexport ) virtual bool istLinieInnen( Vertex a, Vertex b, bool ignoreTransparentFlag = 0 ) const;
- // Überprüft, ob sich das Objekt mit einem anderen Überschneidet
- // zObj: Ein Zeiger auf das andere Objekt ohne erhöhten Reference Counter
- // sp: Ein Zeiger auf einen Punkt, in dem der Schnittpunkt gespeichert wird
- // end: 0, falls alle Ecken beider Objekte überprüft werdden sollen. 1, falls nur die Punkte dieses Models im anderen gesucht werden sollen
- __declspec( dllexport ) virtual bool istModelInnen( const Object2D *zObj, Vertex *sp = 0, bool end = 0, bool ignoreTransparent = 0 ) const;
- // Gibt eine Matrix zurück, welche einen Punkt aus Objektkoordinaten in Bildschirmkoordinaten umrechnet
- __declspec( dllexport ) Mat3< float > getObjectMatrix() const;
- // Gibt eine Matrix zurück, welche einen Punkt aus Bildschirmkoordinaten in Objektkoordinaten umrechnet
- __declspec( dllexport ) Mat3< float > getInverseObjectMatrix() const;
- // Rechnet einen Punkt aus Welt Koordinaten in Objektkoordinaten um
- // worldPos: Die Position des Punktes in der Welt
- __declspec( dllexport ) Vertex getObjectPos( Vertex worldPos ) const;
- // Rechnet eine Richtung aus Weltkoordinaten in Objektkoordinaten um
- // worldDir: Die Richtung in Weltkoordinaten
- __declspec( dllexport ) Vertex getObjectDir( Vertex worldDir ) const;
- // Rechnet einen Punkt aus Objektkoordinaten in Weltkoordinaten um
- // worldPos: Die Position des Punktes in Objektkoordinaten
- __declspec( dllexport ) Vertex getWorldPos( Vertex objectPos ) const;
- // Rechnet eine Richtung aus Objektkoordinaten in Weltkoordinaten um
- // worldDir: Die Richtung in Objektkoordinaten
- __declspec( dllexport ) Vertex getWorldDir( Vertex objectDir ) const;
- // Gibt die Geschwindigkeit des Objektes zurück
- __declspec( dllexport ) Vertex getSpeed() const;
- // gibt die Position des Objektes zurück
- __declspec( dllexport ) Vertex getPosition() const;
- // gibt die Drehgeschwindigkeit des Objektes zurück
- __declspec( dllexport ) float getDrehungSpeed() const;
- // gibt die Drehung des Objektes zurück
- __declspec( dllexport ) float getDrehung() const;
- // gibt den Skallierungs Objektes zurück
- __declspec( dllexport ) float getSize() const;
- // Gibt eine Boundingbox zurück, in der sich alle Punkte des Objektes befinden ( in Weltkoordinaten)
- __declspec( dllexport ) virtual Rect2< float > getBoundingBox() const = 0;
- // Bestimmt den Aufschlagspunkt eines Strahls, der von pos ausgehend in Richtung dir abgegeben wird.
- // pos: Der Stützvektor der Linie
- // dir: Der richtungsvektor der Linie
- // hitPoint: eine referenz auf die variable in dem der schnittpunkt gespeichert werden soll
- // return: 1, fals ein Schnittpunkt existiert
- __declspec( dllexport ) virtual bool calcHitPoint( Vertex pos, Vertex dir, Vertex &hitpoint ) const;
- // Ermittelt die Fläche des Objektes, welche rechtwinklich zum Bewegungsvektor steht
- __declspec( dllexport ) virtual float getLuftWiederstand() const;
- // Gibt die Masse des Objektes zurück
- __declspec( dllexport ) virtual float getMasse() const;
- // Legt fest, ob andere Objekte mit diesem Objekt zusammenschtoßen können
- // return: 0, falls keine Kollisionen existieren
- __declspec( dllexport ) bool canCollide();
- // Erhöht den Reference Counter um 1 und gibt this zurück
- __declspec( dllexport ) Object2D *getThis();
- // Verringert den Reference Counter um 1 (bei 0 löscht sich das Objekt selbst)
- // Gibt 0 zurück
- __declspec( dllexport ) Object2D *release();
- };
- class Welt2D
- {
- private:
- RCArray< Object2D > *objects;
- WeltInfo info;
- int ref;
- void render( Mat3< float > &kamMat, Punkt size, Bild &zRObj, int xOffset, int yOffset, const char *kamName );
- public:
- __declspec( dllexport ) Welt2D();
- __declspec( dllexport ) ~Welt2D();
- __declspec( dllexport ) void setAirResistance( float resistance );
- __declspec( dllexport ) void setSize( int width, int height );
- __declspec( dllexport ) void setSize( bool hasSize );
- __declspec( dllexport ) void setCircular( bool circular );
- __declspec( dllexport ) Object2D *zObjectAt( int x, int y, bool ignoreTransparentFlag = 0 );
- __declspec( dllexport ) Object2D *getObjectAt( int x, int y, bool ignoreTransparentFlag = 0 );
- __declspec( dllexport ) void addObject( Object2D *obj );
- __declspec( dllexport ) void removeObject( Object2D *zObj );
- __declspec( dllexport ) void removeAll();
- __declspec( dllexport ) void explosion( Vertex worldPos, float intensity, float maxRad );
- __declspec( dllexport ) void impuls( Vertex worldPos, Vertex worldDir );
- __declspec( dllexport ) bool tick( double zeit );
- __declspec( dllexport ) void render( Mat3< float > &kamMat, Punkt size, Bild &zRObj, const char *kamName );
- __declspec( dllexport ) const WeltInfo &getWorldInfo() const;
- __declspec( dllexport ) Iterator< Object2D * > getMembers();
- __declspec( dllexport ) Welt2D *getThis();
- __declspec( dllexport ) Welt2D *release();
- };
- }
|