1 #include <GL/glut.h>
2 #include <math.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5
6 #include "Textfeld.h"
7 #include "Kamera.h"
8 #include "Kugel.h"
9 #include "Anzeige.h"
10 #include "Namen.h"
11 #include "Schild.h"
12 #include "Menu.h"
13 #include "Schiedsrichter.h"
14
15 #include "Einsetzen.h"
16 #include "Handling.h"
17
18 #ifndef M_PI
19 #define M_PI 3.14159265358979323846
20 #endif
21
22
StartHandling()23 void StartHandling() {
24 Kamera.Rundflug(Faktor);
25 //Menu.Update(Faktor);
26 }
27
BetrachtenHandling()28 void BetrachtenHandling() {
29 //Menu.Update(Faktor);
30 if (Taste_Pfeil_Oben) {Kamera.Beweg_Vor(Faktor);}
31 if (Taste_Pfeil_Unten) {Kamera.Beweg_Zurueck(Faktor);}
32 if (Taste_Pfeil_Rechts){Kamera.Beweg_Rechts(Faktor);}
33 if (Taste_Pfeil_Links) {Kamera.Beweg_Links(Faktor);}
34 if (Taste_Shift) {Kamera.Beweg_Hoch(Faktor);}
35 if (Taste_Strg) {Kamera.Beweg_Runter(Faktor);}
36 if (Taste_Bild_Auf) {Kamera.Beweg_Rein(Faktor);}
37 if (Taste_Bild_Ab) {Kamera.Beweg_Raus(Faktor);}
38 if (Taste_Pos1) {Kamera.Zoom_Rein(Faktor);}
39 if (Taste_Ende) {Kamera.Zoom_Raus(Faktor);}
40 }
41
ZielenHandling()42 void ZielenHandling() {
43 if (Taste_Pfeil_Oben) {Kamera.Beweg_Rein(Faktor);}
44 if (Taste_Pfeil_Unten) {Kamera.Beweg_Raus(Faktor);}
45 if (Taste_Pfeil_Rechts){Kamera.Schwenk_Rechts(2*Faktor,Kugel[0].Pos_xCM(),Kugel[0].Pos_yCM());}
46 if (Taste_Pfeil_Links) {Kamera.Schwenk_Links(2*Faktor,Kugel[0].Pos_xCM(),Kugel[0].Pos_yCM());}
47 if (Taste_Shift) {Kamera.Schwenk_Runter(Faktor,Kugel[0].Pos_xCM(),Kugel[0].Pos_yCM());}
48 if (Taste_Strg) {Kamera.Schwenk_Hoch(Faktor,Kugel[0].Pos_xCM(),Kugel[0].Pos_yCM());}
49 if (Taste_Bild_Auf) {Kamera.Beweg_Rein(Faktor);}
50 if (Taste_Bild_Ab) {Kamera.Beweg_Raus(Faktor);}
51 if (Taste_Pos1) {Kamera.Vertigo_Rein(Faktor);}
52 if (Taste_Ende) {Kamera.Vertigo_Raus(Faktor);}
53 }
54
AusholenHandling()55 void AusholenHandling() {
56 if (Taste_Pfeil_Oben) {Kamera.Beweg_Rein(Faktor);}
57 if (Taste_Pfeil_Unten) {Kamera.Beweg_Raus(Faktor);}
58 if (Taste_Pfeil_Rechts){Kamera.Schwenk_Rechts(2*Faktor,Kugel[0].Pos_xCM(),Kugel[0].Pos_yCM());}
59 if (Taste_Pfeil_Links) {Kamera.Schwenk_Links(2*Faktor,Kugel[0].Pos_xCM(),Kugel[0].Pos_yCM());}
60 if (Taste_Shift) {Kamera.Schwenk_Runter(Faktor,Kugel[0].Pos_xCM(),Kugel[0].Pos_yCM());}
61 if (Taste_Strg) {Kamera.Schwenk_Hoch(Faktor,Kugel[0].Pos_xCM(),Kugel[0].Pos_yCM());}
62 if (Taste_Bild_Auf) {Kamera.Beweg_Rein(Faktor);}
63 if (Taste_Bild_Ab) {Kamera.Beweg_Raus(Faktor);}
64 if (Taste_Pos1) {Kamera.Zoom_Rein(Faktor);}
65 if (Taste_Ende) {Kamera.Zoom_Raus(Faktor);}
66
67 AusholStaerke=MaxAusholStaerke*(1-exp((-FrameZeitpunkt+AusholStartzeit)/400.0));
68 Anzeige.setzeStossStaerke(AusholStaerke/3.333);
69
70 }
71
StossHandling()72 void StossHandling() {
73
74 AllerersterStoss=0;
75 //WeisseVersetzbar=0;
76
77 if (Taste_Pfeil_Oben) {Kamera.Beweg_Vor(Faktor);}
78 if (Taste_Pfeil_Unten) {Kamera.Beweg_Zurueck(Faktor);}
79 if (Taste_Pfeil_Rechts){Kamera.Beweg_Rechts(Faktor);}
80 if (Taste_Pfeil_Links) {Kamera.Beweg_Links(Faktor);}
81 if (Taste_Shift) {Kamera.Beweg_Hoch(Faktor);}
82 if (Taste_Strg) {Kamera.Beweg_Runter(Faktor);}
83 if (Taste_Bild_Auf) {Kamera.Beweg_Rein(Faktor);}
84 if (Taste_Bild_Ab) {Kamera.Beweg_Raus(Faktor);}
85 if (Taste_Pos1) {Kamera.Zoom_Rein(Faktor);}
86 if (Taste_Ende) {Kamera.Zoom_Raus(Faktor);}
87
88 //Frames++; // F"ur die Frames/sec-Anzeige
89
90 // Zeit seit Stossbeginn
91 GLint Zeit=FrameZeitpunkt-Startzeit;
92
93 // Letzten Zustand noch zeichnen, wenn Stoss
94 if (Zeit>Stossdauer) {Zeit=Stossdauer;} // eigentlich schon vorbei
95
96 //printf("%i-%i=%i: ",FrameZeitpunkt,Startzeit,Zeit);
97
98 for (int Kugelnr=0;Kugelnr<16;Kugelnr++) { // Alle Kugeln neu positionieren
99 if (Bewegungstabelle[Zeit][Kugelnr][2]<=0) {
100 //if (Kugelnr<8)
101 //printf("%i,%i ",(GLint)Bewegungstabelle[Zeit][Kugelnr][0],(GLint)Bewegungstabelle[Zeit][Kugelnr][1]);
102 Kugel[Kugelnr].neuePositionD(Bewegungstabelle[Zeit][Kugelnr]);
103 }
104 }
105 //printf("\n");
106
107 //DelayAusgleich=1;
108
109 Anzeige.setzeStossStaerke(AusholStaerke/3.333-Zeit/3.0);
110
111 if (!(Zeit & 31)) {
112 GLint neu=0;
113 for (int i=0;i<16;i++) {
114 if (KugelnImSpiel[i] && !KugelnVersenkt[i] && (Kugel[i].Pos_x()==3000)) {
115 KugelnVersenkt[i]=1;
116 neu=1;
117 }
118 }
119 if (neu) {Menu.NeuerMenuZustand();}
120 }
121
122
123 if (Zeit==Stossdauer &&
124 !(SpielModus == TUTORIAL && FrameZeitpunkt-Startzeit < 1900)) {
125 // Animation schon fertig?
126
127 //#ifndef _WIN32
128 //printf(" %f Frames/sec\n",(Frames*100.0)/(Stossdauer+1.0));
129 //#endif
130
131 for (int i=0;i<16;i++) {
132 if (KugelnImSpiel[i] && !KugelnVersenkt[i] && (Kugel[i].Pos_x()==3000)) {
133 KugelnVersenkt[i]=1;
134 }
135 }
136
137 if (SpielModus == TRAININGSSPIEL||SpielModus == TUTORIAL) {
138 if (Kugel[0].Pos_x()==3000) {
139 StateMaschin=WEISSNEU;
140 Anzeige.setzeStossStaerke(0.0);
141 LageVerbesserung=1;
142 LageVerbesserungKopffeld=1;
143 WeisseEinsetzen();
144 Menu.NeuerMenuZustand();
145 } else {
146 StateMaschin=BETRACHTEN;
147 Anzeige.setzeStossStaerke(0.0);
148 Menu.NeuerMenuZustand();
149 }
150 } else if (Schiedsrichter.Entscheidung()) {
151 StateMaschin=SCHIEDSRICHTER;
152 Anzeige.setzeStossStaerke(0.0);
153 } else {
154 StateMaschin=BETRACHTEN;
155 Anzeige.setzeStossStaerke(0.0);
156 Menu.NeuerMenuZustand();
157 }
158 }
159 }
160
WeissneuHandling()161 void WeissneuHandling() {
162
163 if (SpielModus==TRAININGSSPIEL) {
164 LageVerbesserungKopffeld=0;
165 LageVerbesserung=1;
166 }
167
168 GLfloat x=Kugel[0].Pos_xCM();
169 GLfloat y=Kugel[0].Pos_yCM();
170
171 GLfloat Faktor2=sqrt((Kugel[0].Pos_xCM()-Kamera.Pos_xCM())*
172 (Kugel[0].Pos_xCM()-Kamera.Pos_xCM())+
173 (Kugel[0].Pos_yCM()-Kamera.Pos_yCM())*
174 (Kugel[0].Pos_yCM()-Kamera.Pos_yCM())+
175 Kamera.Pos_zCM()*Kamera.Pos_zCM());
176
177 Faktor2*=.005;
178
179 if (Taste_Pfeil_Oben) {
180 x+=.3*Faktor*Faktor2*sin(Kamera.Beta*M_PI/180.0);
181 y+=.3*Faktor*Faktor2*cos(Kamera.Beta*M_PI/180.0);
182 }
183 if (Taste_Pfeil_Unten) {
184 x-=.3*Faktor*Faktor2*sin(Kamera.Beta*M_PI/180.0);
185 y-=.3*Faktor*Faktor2*cos(Kamera.Beta*M_PI/180.0);
186 }
187 if (Taste_Pfeil_Links) {
188 x-=.3*Faktor*Faktor2*cos(Kamera.Beta*M_PI/180.0);
189 y+=.3*Faktor*Faktor2*sin(Kamera.Beta*M_PI/180.0);
190 }
191 if (Taste_Pfeil_Rechts) {
192 x+=.3*Faktor*Faktor2*cos(Kamera.Beta*M_PI/180.0);
193 y-=.3*Faktor*Faktor2*sin(Kamera.Beta*M_PI/180.0);
194 }
195
196 GLint ungueltig=0;
197
198 if (x<-124 || x>124 || (x>-63.5 && LageVerbesserungKopffeld)) {
199 x=Kugel[0].Pos_xCM();
200 }
201 if (y<-60.5||y>60.5) {
202 y=Kugel[0].Pos_yCM();
203 }
204
205 for (int nr=1;nr<16;nr++) {
206 if ((Kugel[nr].Pos_xCM()-x)*(Kugel[nr].Pos_xCM()-x)+
207 (Kugel[nr].Pos_yCM()-y)*(Kugel[nr].Pos_yCM()-y)<32.7) {
208 ungueltig=1;
209 }
210 }
211
212 if (!ungueltig) {
213 Kugel[0].neuePositionCM(x,y);
214 }
215
216 if (Taste_Shift) {Kamera.Beweg_Hoch(Faktor);}
217 if (Taste_Strg) {Kamera.Beweg_Runter(Faktor);}
218 if (Taste_Bild_Auf) {Kamera.Beweg_Rein(Faktor);}
219 if (Taste_Bild_Ab) {Kamera.Beweg_Raus(Faktor);}
220 if (Taste_Pos1) {Kamera.Zoom_Rein(Faktor);}
221 if (Taste_Ende) {Kamera.Zoom_Raus(Faktor);}
222 }
223
SchiedsrichterHandling()224 void SchiedsrichterHandling() {
225 if (SchiedsrichterEntscheidung == -1) {
226 SchiedsrichterEntscheidung = Schiedsrichter.Entscheidung();
227
228 AufnahmeWechsel = SchiedsrichterEntscheidung & 1;
229 Foul = SchiedsrichterEntscheidung & 2;
230 LageVerbesserungKopffeld = SchiedsrichterEntscheidung & 4;
231 LageVerbesserung = SchiedsrichterEntscheidung & 8;
232 NeuAufbauenOderWeiterspielen = SchiedsrichterEntscheidung & 16;
233 NeuAufbauenOderAchtEinsetzen = SchiedsrichterEntscheidung & 32;
234 Spieler1Gewonnen = SchiedsrichterEntscheidung & 64;
235 Spieler2Gewonnen = SchiedsrichterEntscheidung & 128;
236
237 Menu.NeuerMenuZustand();
238
239 }
240 }
241
242
243
244
245