1 #ifndef _ball_h 2 #define _ball_h 3 4 // 5 // In dem Modul 'ball.h' sind alle Klassen vereint, die mit B�llen und B�gen 6 // zu tun haben. Dabei gelten die folgenden Ableitungen 7 // 8 // StaticArc : Grundfunktionalit�t 9 // / \ 10 // OuterArc InnerArc : Bogen, der von au�en/innen reflektiert 11 // | \ | 12 // | ArcWall : beidseitig reflektierend (Ableitung nur symbolisch) 13 // StaticBall : 360 Grad Bogen, nicht beweglich 14 // | 15 // Ball : Kugel (gleichzeitig ein DynObj) 16 // 17 // 18 // Eine Besonderheit stellt der Ball dar, welcher die Funktionalit�t des 19 // DynObj und des Object besitzt. Au�erdem ist er ein Beispiel, wie durch 20 // spezielle Ausnutzung der HitFromBall-Routine die Kontrolle an ein Objekt 21 // gebracht werden kann. Um Schrittweise die Geschwindigkeit durch Reibung 22 // zu verringern, gibt er in der HitFromBall-Routine die Zeit des n�chsten 23 // Verlangsamungsschrittes zur�ck, wenn er nach einer Kollision mit sich 24 // selbst befragt wird. 25 // 26 27 #ifndef _arcs_h 28 # include "arcs.h" // Oberklasse StaticBall 29 #endif 30 #ifndef _dynobj_h 31 # include "dynobj.h" // zweite Oberklasse DynObj 32 #endif 33 34 class BallStateTop; // forward 35 class PBallTop; 36 37 // 38 // ------------------------------------------------------------------------- 39 // class Ball: Fliegende Kugeln 40 // ------------------------------------------------------------------------- 41 // 42 43 class Ball : public StaticBall, public DynObj { 44 public: // private 45 Vec2 v; // Geschwindigkeits-Vektor 46 char run_flag; // Geschwingkeit ungleich null 47 const Real a; // Absolutwert der Negativ-Beschleunigung 48 #if (SIM_SLOW) 49 Real next_slowstep; // Zeitpunkt der n�chsten Verlangsamung 50 Real last_slowstep; // Zeitpunkt der letzten Verlangsamung 51 Real slow_granoff; // Offset bei Start, damit Kugeln zu 52 // unterschiedlicher Zeit gebremst werden. 53 void SlowStep(); // Kugel verlangsamen 54 #endif 55 56 PBallTop *pball; // PBall, welcher den Lock hat 57 int Lock( PBallTop *pball ); 58 int Unlock( PBallTop *pball ); 59 void GoUnlocked(); 60 61 BallStateTop *state; SetState(BallStateTop * state_in)62 void SetState( BallStateTop *state_in ) { state = state_in; } 63 64 public: // protected 65 Real m; // Masse, wird vom RemotePBall veraendert !!! 66 67 #if (TIME_CACHE) 68 virtual void CollisionCalc(); 69 virtual void HitYouAt( Object *obj, Real time ); 70 71 Object *collision_object; 72 Real collision_time; 73 #endif 74 75 public: 76 Ball( double x, double y, double vx, double vy, double r, double m ); 77 Ball( double x, double y, double vx, double vy, double r ); 78 Ball( double x, double y, double vx, double vy ); 79 Ball( const Vec2 &v, double r, double m ); 80 Ball( const Vec2 &v, double r ); 81 ~Ball(); 82 V()83 const Vec2 &V() const { return v; } VX()84 const Real &VX() const { return v.X(); } VY()85 const Real &VY() const { return v.Y(); } 86 // Real VXpix() const { return v.Xpix(); } 87 // Real VYpix() const { return v.Ypix(); } M()88 const Real &M() const { return m; } 89 IsRunning()90 int IsRunning() const { return run_flag; } 91 92 Vec2 Dir() const; Len()93 Real Len() const { return V().Norm(); } 94 95 void SetP( const Vec2 &new_p ); // Kugel auf Position setzen (mit Zeichnen) 96 void SetV( const Vec2 &v_in ); 97 void SetPV( const Vec2 &new_p, const Vec2 &v_in=Vec2Zero ) 98 { SetP( new_p ); SetV( v_in ); } ChgV(const Vec2 & v_in)99 void ChgV( const Vec2 &v_in ) { 100 SetV( v_in ); 101 #if (TIME_CACHE) 102 CollisionCalc(); 103 #endif 104 } 105 106 void TellPressed(); 107 108 Real HitFromBall( Ball *b ); 109 virtual Real NextCollision(); 110 void CollideWithBall( Ball *b ); 111 112 static Real FindClosest( const Ball *myself, const Vec2 &pos, Ball **best ); 113 int FitsAt(const Vec2 &pos); 114 int FitsNextTo(const Vec2 &pos, const Vec2 &delta, Vec2 *newpos); 115 116 virtual void Move( Real t ); 117 virtual void Reset(); 118 virtual void Redraw(); 119 120 virtual void Info(); 121 virtual void WasHit(Object *); 122 GetState()123 const BallStateTop *GetState() { return state; } 124 125 virtual void Draw(); 126 127 friend class PBallTop; 128 friend class LineKeeper; 129 friend class StackKeeper; 130 friend class Goal; 131 }; 132 133 134 #endif 135