1 /****************************************************************************
2 **
3 ** BillardGL.cpp Stefan Disch, Tobias Nopper, Martina Welte 2001
4 **
5 ****************************************************************************/
6
7
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <GL/glut.h>
11 #include <math.h>
12 #include <string.h>
13
14 #include "Textfeld.h"
15 #include "Schild.h"
16 #include "Tisch.h"
17 #include "Kamera.h"
18 #include "Kugel.h"
19 #include "Anzeige.h"
20 #include "Menu.h"
21 #include "Beleuchtung.h"
22
23 #include "Namen.h"
24 #include "LA.h"
25 #include "bmp.h"
26 #include "Zeit.h"
27 #include "Physik.h"
28 #include "SpielfeldAufbau.h"
29 #include "Benutzerschnittstelle.h"
30 #include "KommandoZeilenParameter.h"
31 #include "Handling.h"
32 #include "Schiedsrichter.h"
33 #include "kugeltabellen.h"
34 #include "LadeScreen.h"
35
36 #include "BillardGL.h"
37
38 #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
39
40 //Tabellen
41 GLfloat Bewegungstabelle[2000][16][3];
42 GLint Soundtabelle[1000];
43
44 //Objekte
45 class Kugel Kugel[16];
46 class Tisch Tisch;
47 class Anzeige Anzeige;
48 class Kamera Kamera;
49 class Menu Menu;
50 class Schiedsrichter Schiedsrichter;
51 class Beleuchtung Beleuchtung;
52
53 //Sonstige Variablen
54 GLint MouseLookLast_x;
55 GLint MouseLookLast_y;
56
57 GLint Stossdauer=1999;
58 GLint Startzeit;
59 GLint Frames=0;
60 GLint FrameZeitpunkt;
61 GLint LetztesFrameZeitpunkt=-1;
62
63 GLint AusholStartzeit;
64 GLfloat AusholStaerke=0;
65 GLfloat MaxAusholStaerke=100;
66
67 GLint DelayAusgleich;
68 GLint Faktor;
69
70 GLint AllerersterStoss=1;
71
72 GLint FullScreen;
73 GLint Hintergrundfarbe=0;
74
75 GLint KugelnVersenkt[16];
76 GLint KugelnImSpiel[16];
77
78 GLint xnor=0;
79 GLint MausTasteAbgefangen=0;
80
81 //State-Maschin'
82 GLint StateMaschin=START;
83 GLint Spiel=ACHTBALL;
84 GLint SpielModus=TRAININGSSPIEL;
85
86 // Schiedsrichter
87 GLint SchiedsrichterEntscheidung=0;
88 GLint AufnahmeWechsel=0;
89 //GLint SpielerAmStoss=0;
90 GLint Foul=0;
91 GLint LageVerbesserungKopffeld=1;
92 GLint LageVerbesserung=0;
93 GLint NeuAufbauenOderWeiterspielen=0;
94 GLint NeuAufbauenOderAchtEinsetzen=0;
95 GLint Spieler1Gewonnen=0;
96 GLint Spieler2Gewonnen=0;
97
98 //Tasten
99 GLint Taste_Pfeil_Oben=0;
100 GLint Taste_Pfeil_Unten=0;
101 GLint Taste_Pfeil_Rechts=0;
102 GLint Taste_Pfeil_Links=0;
103 GLint Taste_Shift=0;
104 GLint Taste_Strg=0;
105 GLint Taste_Bild_Auf=0;
106 GLint Taste_Bild_Ab=0;
107 GLint Taste_Pos1=0;
108 GLint Taste_Ende=0;
109
110
111 //GLint KameraFahrt=0;
112
113
114 //Betrachtungsweise
115 GLint PolygonMode_mode=GL_FILL;
116 GLint PolygonMode_view=GL_FRONT;
117
118 int value;
119
120 GLint Texturgroesse,AnzeigeTexturgroesse,TischTexturgroesse;
121 GLint KugelAufloesung;
122 GLint InvertX,InvertY,Schatten,ZBufferLoeschen;
123 GLint TexMMM;
124 GLfloat MouseSpeed,Epsilon;
125 GLint PhysikFrequenz=400;
126 GLfloat ReibungsFaktor,BandenFaktor,KollisionsFaktor;
127 GLint Farbtiefe, Reflektionen;
128 GLint BildschirmAufloesung;
129 GLint Sprache;
130
131 GLint LadeFortschritt=0;
132 GLuint dreizehntextur;
133 GLuint logotextur;
134
135 char Spieler1[10];
136 char Spieler2[10];
137 char NetzwerkSpieler[10];
138 char NetzwerkGegner[10];
139
140 int OriginalFenster=0,AktuellesFenster=0;
141
142 GLint ZeigeFPS;
143 GLint AmbientesLicht;
144 GLint TischLampen;
145 GLint GrueneLampe;
146
147 GLfloat EffektLautstaerke=.5;
148 GLfloat MusikLautstaerke=.5;
149
150 //KugelTabellen
151
152 GLfloat *ball_vertices[30];
153 GLfloat *ball_texcoord[30];
154 GLint *ball_indices[30];
155
updateGL()156 void updateGL()
157 {
158 if (ZBufferLoeschen) {glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);}
159
160 Kamera.male(); // Kamera-Postion und -Parameter setzen
161
162 Beleuchtung.male();
163
164 Tisch.maleFlaeche(); // Tischflaeche zeichen
165
166 glDisable(GL_DEPTH_TEST);
167
168 Tisch.maleLinien();
169
170 for (int Kugelnr=0;Kugelnr<16;Kugelnr++) {
171 Kugel[Kugelnr].maleSchatten(); // Schatten zeichen
172 }
173
174 glEnable(GL_DEPTH_TEST);
175
176 Tisch.maleBanden();
177
178 GLfloat Abstand=0;
179 GLint Aufloesung=1;
180
181 for (int Kugelnr2=0;Kugelnr2<16;Kugelnr2++) {
182 GLfloat x=Kugel[Kugelnr2].Pos_xCM()-Kamera.Pos_x;
183 GLfloat y=Kugel[Kugelnr2].Pos_yCM()-Kamera.Pos_y;
184 GLfloat z=Kamera.Pos_z;
185 Abstand=sqrt(x*x+y*y+z*z);
186 Aufloesung=(GLint(400/Abstand));//300
187 if (Aufloesung<3) Aufloesung=3;
188 Aufloesung=(Aufloesung/2)*2+1;
189 if (Aufloesung>KugelAufloesung) Aufloesung=KugelAufloesung;
190 Kugel[Kugelnr2].male(Aufloesung); // Kugeln zeichen
191 }
192
193 glDisable(GL_DEPTH_TEST);
194 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
195 glDisable(GL_LIGHTING);
196
197 Menu.male();
198
199 if (StateMaschin!=START) {
200 Anzeige.male(); // Anzeige zeichnen
201 }
202 glEnable(GL_DEPTH_TEST);
203
204 glutSwapBuffers();
205 }
206
207 /* -------------------- timerEvent -------------------- */
timerEvent()208 void timerEvent() {
209
210 //egal+=egal;
211
212 //glutTimerFunc(20,timerEvent,0);
213
214 FrameZeitpunkt=Zeit(); // Framezeit bestimmen
215
216 // Faktor= Zeit seit letztem Frame
217 Faktor=FrameZeitpunkt-LetztesFrameZeitpunkt;
218
219
220 if (DelayAusgleich) {
221 Faktor=1;
222 DelayAusgleich=0;
223 }
224
225 if (Faktor) {
226
227 if (ZeigeFPS) {
228 if ((FrameZeitpunkt%200)<(LetztesFrameZeitpunkt%200)) {
229 Menu.SetzeFPS(Frames/2);
230 Frames=0;
231 } else Frames++;
232 }
233
234 Menu.Update(Faktor);
235
236 switch (StateMaschin) {
237
238 case START: StartHandling();break;
239
240 case BETRACHTEN: BetrachtenHandling();break;
241
242 case ZIELEN: ZielenHandling();break;
243
244 case AUSHOLEN: AusholenHandling();break;
245
246 case STOSS: StossHandling();break;
247
248 case WEISSNEU: WeissneuHandling();break;
249
250 case SCHIEDSRICHTER: SchiedsrichterHandling();break;
251
252 }
253
254 Kamera.Fahrt(Faktor);
255
256 LetztesFrameZeitpunkt=FrameZeitpunkt;
257
258 glutPostWindowRedisplay(AktuellesFenster);
259 }
260 }
261
262
main(int argc,char ** argv)263 int main(int argc, char **argv)
264 {
265 //char string[10];
266
267 KommandoZeilenParameter(argc,argv);
268
269 for (int i=0;i<16;i++) {
270 KugelnImSpiel[i]=1;
271 KugelnVersenkt[i]=0;
272 }
273 KugelnImSpiel[0]=0;
274
275 //GLUT initialisieren, Fenster setzen
276 glutInit(&argc, argv);
277 glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
278 if (FullScreen) {
279 char temp[20];
280 sprintf(temp,"%ix%i:%i",BildschirmAufloesung,(BildschirmAufloesung*3)/4,Farbtiefe);
281 glutGameModeString(temp);
282 if (!glutGameModeGet(GLUT_GAME_MODE_POSSIBLE))
283 printf (" No Game Mode possible!\n\n");
284 glutEnterGameMode();
285 glutFullScreen();
286 } else {
287 glutInitWindowSize (BildschirmAufloesung,(BildschirmAufloesung*3)/4);
288 glutInitWindowPosition (0, 0);
289 glutCreateWindow ("BillardGL 1.7");
290 }
291
292 glClearColor(0,0,0,0);
293
294
295 glutIdleFunc(LSidle);
296
297 //Callback zum Zeichnen der GL-Funktion
298 glutDisplayFunc(LSupdateGL);
299
300 AktuellesFenster=glutGetWindow();
301
302 // CreateMenu();
303
304 // timerEvent(0);
305
306 glutMainLoop();
307
308 return EXIT_SUCCESS;
309 }
310
311 /* -------------------- Stoss -------------------- */
Stoss(GLfloat Stoss_x,GLfloat Stoss_y)312 void Stoss(GLfloat Stoss_x, GLfloat Stoss_y) {
313
314 Schiedsrichter.NeuerStoss();
315 SchiedsrichterEntscheidung=-1;
316
317 Physik(Stoss_x, Stoss_y); // Physik-Simulation
318
319 Startzeit=Zeit(); // Startzeit bestimmen
320
321 }
322
Sichtbar(int vis)323 void Sichtbar (int vis) {
324 if (vis == GLUT_VISIBLE) {
325 glutIdleFunc(timerEvent);
326 }
327 }
328
329