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