1 /****************************************************************************
2 **
3 **  Benutzerschnittstelle.cpp   Stefan Disch, Tobias Nopper, Martina Welte 2001
4 **
5 *****************************************************************************/
6 
7 #include <GL/glut.h>
8 #include <math.h>
9 #include <stdlib.h>
10 #include <stdio.h>
11 #include "BillardGL.h"
12 
13 #include "Kugel.h"
14 #include "Kamera.h"
15 #include "Anzeige.h"
16 #include "Schild.h"
17 #include "Textfeld.h"
18 #include "Menu.h"
19 #include "Schiedsrichter.h"
20 
21 #include "Namen.h"
22 #include "Zeit.h"
23 #include "SpielfeldAufbau.h"
24 #include "Handling.h"
25 #include "Einsetzen.h"
26 
27 #include "Benutzerschnittstelle.h"
28 
29 GLint Maustaste=0;
30 
31 //Callback Funktion: Reaktion auf Mausclicks
Maus(int button,int state,int x,int y)32 void Maus(int button, int state, int x, int y)
33 {
34 
35   if (Menu.Maustaste(button,state,x,y)!=0) {
36     MausTasteAbgefangen=1;
37     //printf("Abgefangen\n");
38   } else {
39     MausTasteAbgefangen=0;
40     //printf("AbgefangenAus\n");
41     MouseLookLast_x=x;
42     MouseLookLast_y=y;
43 
44     //  Kamera.FahrtAus();
45 
46     /*
47       if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN) {
48       switch (StateMaschin) {
49       case START:
50       StateMaschin=BETRACHTEN;
51       Menu.NeuerMenuZustand();
52       break;
53       case BETRACHTEN: {
54       if (LageVerbesserungKopffeld|LageVerbesserung) {
55       StateMaschin=WEISSNEU;
56       Menu.NeuerMenuZustand();
57       }
58       } break;
59       case ZIELEN:
60       StateMaschin=BETRACHTEN;
61       Menu.NeuerMenuZustand();
62       break;
63       case AUSHOLEN:
64       StateMaschin=ZIELEN;
65       Menu.NeuerMenuZustand();
66       Anzeige.setzeStossStaerke(0);
67       break;
68       case STOSS: {
69       if (xnor) {
70       StateMaschin=BETRACHTEN;
71       Menu.NeuerMenuZustand();
72       for (int i=1;i<16;i++) {
73       if (KugelnImSpiel[i] && !KugelnVersenkt[i] && (Kugel[i].Pos_x()==3000)) {
74       KugelnVersenkt[i]=1;
75       }
76       }
77       Menu.NeuerMenuZustand();
78       Anzeige.setzeStossStaerke(0);
79       }
80       } break;
81       }
82       }
83     */
84 
85     if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) Maustaste=GLUT_LEFT_BUTTON;
86     if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN) Maustaste=GLUT_RIGHT_BUTTON;
87 
88     if (button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) {
89       Maustaste=GLUT_LEFT_BUTTON;
90       switch (StateMaschin) {
91       case BETRACHTEN: {
92 	StateMaschin=ZIELEN;
93 	Menu.NeuerMenuZustand();
94 	Kamera.BlickeAuf(Kugel[0].Pos_xCM(),Kugel[0].Pos_yCM());
95       } break;
96       case ZIELEN: {
97 	AusholStartzeit=Zeit();
98 	StateMaschin=AUSHOLEN;
99 	Menu.NeuerMenuZustand();
100       } break;
101       case STOSS: {
102 	if (xnor) {
103 	  for (int Kugelnr=0;Kugelnr<16;Kugelnr++) { // Alle Kugeln ans Ziel
104 	    Kugel[Kugelnr].neuePositionD(Bewegungstabelle[Stossdauer][Kugelnr]);
105 	    if (KugelnImSpiel[Kugelnr] && !KugelnVersenkt[Kugelnr] && (Kugel[Kugelnr].Pos_x()==3000)) {
106 	      KugelnVersenkt[Kugelnr]=1;
107 	    }
108 	    Menu.NeuerMenuZustand();
109 	  }
110 	  if (Kugel[0].Pos_x()==3000) {
111 	    StateMaschin=WEISSNEU;
112 	    WeisseEinsetzen();
113 	  } else {
114 	    StateMaschin=BETRACHTEN;
115 	    Menu.NeuerMenuZustand();
116 	  }
117 	  Anzeige.setzeStossStaerke(0);
118 	}
119       } break;
120       case WEISSNEU: {
121 	StateMaschin=BETRACHTEN;
122 	Menu.NeuerMenuZustand();
123       } break;
124       case SCHIEDSRICHTER: {
125 	if (LageVerbesserungKopffeld|LageVerbesserung) {
126 	  WeisseEinsetzen();
127 	  StateMaschin=WEISSNEU;
128 	  Menu.NeuerMenuZustand();
129 	} else {
130 	  StateMaschin=BETRACHTEN;
131 	  Menu.NeuerMenuZustand();
132 	}
133       } break;
134       }
135     }
136 
137     if (button == GLUT_MIDDLE_BUTTON && state == GLUT_UP && StateMaschin==AUSHOLEN) {
138       GLfloat dx=Kugel[0].Pos_xCM()-Kamera.Pos_xCM();
139       GLfloat dy=Kugel[0].Pos_yCM()-Kamera.Pos_yCM();
140       GLfloat Abstand=sqrt(dx*dx+dy*dy);
141       Stoss(dx*AusholStaerke/Abstand,dy*AusholStaerke/Abstand);
142       StateMaschin=STOSS;
143       Menu.NeuerMenuZustand();
144       //Kamera.Verfolge(0);
145       Kamera.BlickeAuf2(Kugel[0].Pos_xCM(),Kugel[0].Pos_yCM());
146       //    Kamera.FahrtEin();
147       DelayAusgleich=1;
148     }
149 
150   }
151 }
152 //Callback Funktion: Reaktion auf Mausbewegung
Bewegung(int x,int y)153 void Bewegung(int x, int y) {
154   if (MausTasteAbgefangen) return;
155   if (StateMaschin==START) return;
156   if (Maustaste==GLUT_LEFT_BUTTON) {
157     if ((StateMaschin==ZIELEN)||(StateMaschin==AUSHOLEN)) {
158       if (InvertX) {
159 	Kamera.Schwenk_Rechts(MouseSpeed*(x-MouseLookLast_x),Kugel[0].Pos_xCM(),Kugel[0].Pos_yCM());
160       } else {
161 	Kamera.Schwenk_Links(MouseSpeed*(x-MouseLookLast_x),Kugel[0].Pos_xCM(),Kugel[0].Pos_yCM());
162       }
163       if (InvertY) {
164 	Kamera.Schwenk_Hoch(MouseSpeed*(y-MouseLookLast_y),Kugel[0].Pos_xCM(),Kugel[0].Pos_yCM());
165       } else {
166 	Kamera.Schwenk_Runter(MouseSpeed*(y-MouseLookLast_y),Kugel[0].Pos_xCM(),Kugel[0].Pos_yCM());
167       }
168     } else {
169       if (InvertX) {
170 	Kamera.Dreh_Links(MouseSpeed*(x-MouseLookLast_x));
171       } else {
172 	Kamera.Dreh_Rechts(MouseSpeed*(x-MouseLookLast_x));
173       }
174       if (InvertY) {
175 	Kamera.Dreh_Hoch(MouseSpeed*(y-MouseLookLast_y));
176       } else {
177 	Kamera.Dreh_Runter(MouseSpeed*(y-MouseLookLast_y));
178       }
179     }
180   } else if (Maustaste==GLUT_RIGHT_BUTTON) {
181     if ((StateMaschin==ZIELEN)||(StateMaschin==AUSHOLEN)) {
182       if (InvertX) {
183 	Kamera.Schwenk_Rechts(MouseSpeed*(x-MouseLookLast_x),Kugel[0].Pos_xCM(),Kugel[0].Pos_yCM());
184       } else {
185 	Kamera.Schwenk_Links(MouseSpeed*(x-MouseLookLast_x),Kugel[0].Pos_xCM(),Kugel[0].Pos_yCM());
186       }
187       if (InvertY) {
188 	Kamera.Beweg_Rein(MouseSpeed*(y-MouseLookLast_y));
189       } else {
190 	Kamera.Beweg_Raus(MouseSpeed*(y-MouseLookLast_y));
191       }
192     } else {
193       if (InvertX) {
194 	Kamera.Beweg_Links(MouseSpeed*(x-MouseLookLast_x));
195       } else {
196 	Kamera.Beweg_Rechts(MouseSpeed*(x-MouseLookLast_x));
197       }
198       if (InvertY) {
199 	Kamera.Beweg_Rein(MouseSpeed*(y-MouseLookLast_y));
200       } else {
201 	Kamera.Beweg_Raus(MouseSpeed*(y-MouseLookLast_y));
202       }
203     }
204   }
205 
206   MouseLookLast_x=x;
207   MouseLookLast_y=y;
208 }
209 
210 //Callback Funktion: Reaktion auf Tastendruck
Taste(unsigned char keyPressed,int x,int y)211 void Taste( unsigned char keyPressed, int x, int y )
212 {
213   //printf("%c: %i\n",keyPressed,keyPressed);
214 
215   if (!Menu.KeyboardTaste(keyPressed,x,y)) {
216     switch( keyPressed ) {
217     case 'h': {
218       if (xnor==4) {
219 	Hintergrundfarbe=1-Hintergrundfarbe;
220 	glClearColor(Hintergrundfarbe,Hintergrundfarbe,Hintergrundfarbe,0);
221       }
222     } break;                           //h: Hintergrundfarbe invertieren
223     case 'v': {
224       if (xnor==4) {
225 	switch (PolygonMode_view) {      //v: Vorne/Hinten/Beides
226 	case GL_FRONT:
227 	  PolygonMode_view=GL_BACK;
228 	  break;
229 	case GL_BACK:
230 	  PolygonMode_view=GL_FRONT_AND_BACK;
231 	  break;
232 	case GL_FRONT_AND_BACK:
233 	  PolygonMode_view=GL_FRONT;
234 	  break;
235 	}
236 	glPolygonMode(PolygonMode_view,PolygonMode_mode);
237       }
238     } break;
239     case 'w': {
240       if (xnor==4) {
241 	switch (PolygonMode_mode) {     //w: Punkte/Linien/Fl"achen
242 	case GL_FILL: PolygonMode_mode=GL_POINT;break;
243 	case GL_POINT: PolygonMode_mode=GL_LINE;break;
244 	case GL_LINE: PolygonMode_mode=GL_FILL;break;
245 	}
246 	glPolygonMode(PolygonMode_view,PolygonMode_mode);
247       }
248     } break;
249 
250     case '1': Kamera.speicherePosition(0);break; //1
251     case '2': Kamera.speicherePosition(1);break; //2
252     case '3': Kamera.speicherePosition(2);break; //3
253     case '4': Kamera.speicherePosition(3);break; //4
254     case '5': Kamera.speicherePosition(4);break; //5
255     case '6': Kamera.speicherePosition(5);break; //6
256     case '7': Kamera.speicherePosition(6);break; //7
257     case '8': Kamera.speicherePosition(7);break; //8
258 
259     case '\b': {
260       switch (StateMaschin) {
261       case START:
262 	StateMaschin=BETRACHTEN;
263 	Menu.NeuerMenuZustand();
264 	break;
265       case BETRACHTEN: {
266 	if (LageVerbesserungKopffeld|LageVerbesserung) {
267 	  StateMaschin=WEISSNEU;
268 	  Menu.NeuerMenuZustand();
269 	}
270       } break;
271       case ZIELEN:
272 	StateMaschin=BETRACHTEN;
273 	Menu.NeuerMenuZustand();
274 	break;
275       case AUSHOLEN:
276 	StateMaschin=ZIELEN;
277 	Menu.NeuerMenuZustand();
278 	Anzeige.setzeStossStaerke(0);
279 	break;
280       case STOSS: {
281 	if (xnor) {
282 	  StateMaschin=BETRACHTEN;
283 	  Menu.NeuerMenuZustand();
284 	  for (int i=1;i<16;i++) {
285 	    if (KugelnImSpiel[i] && !KugelnVersenkt[i] && (Kugel[i].Pos_x()==3000)) {
286 	      KugelnVersenkt[i]=1;
287 	    }
288 	  }
289 	  Menu.NeuerMenuZustand();
290 	  Anzeige.setzeStossStaerke(0);
291 	}
292       } break;
293       }
294     } break;
295 
296     case 'r': {
297       if (xnor==3) {
298 	xnor=4;
299       } else if (!AllerersterStoss) {
300 	Startzeit=Zeit();
301 	//Frames=0;
302 	StateMaschin=STOSS;
303 	Menu.NeuerMenuZustand();
304 	for (int Kugelnr=0;Kugelnr<16;Kugelnr++) {
305 	  Kugel[Kugelnr].neuePositionD(Bewegungstabelle[0][Kugelnr]);
306 	}
307 	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
308       }
309     } break;           //r
310 
311 
312     case 'c': {
313       if (xnor==4) {
314 	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
315 	}
316     } break; //c
317 
318     case 27 : {
319       Menu.SetzeMenuZustand(AUSSPIEL);
320     } break;
321 
322     case 'q': {
323       if (xnor==4) {
324 	StateMaschin=START;
325 	Menu.SetzeMenuZustand(STARTBILDSCHIRM);
326       }
327     } break;
328 
329     case 'f': {
330       /*
331 	(FullScreen=1-FullScreen);
332 	if (FullScreen) {
333 	glutFullScreen();
334 	} else {
335 	glutReshapeWindow(800, 600);
336 	}
337       */
338     } break;
339     /*
340     //      if (xnor==4) {
341     (FullScreen=1-FullScreen);
342     if (FullScreen) {
343     glutFullScreen();
344     //glutGameModeString("640x480:16@60");
345     //glutEnterGameMode();
346     //AktuellesFenster=glutGetWindow();
347     //glutIgnoreKeyRepeat(1);
348     //glutMouseFunc(Maus);
349     //glutMotionFunc(Bewegung);
350     //glutKeyboardFunc(Taste);
351     //glutKeyboardUpFunc(TasteLos);
352     //glutSpecialFunc(Sondertaste);
353     //glutSpecialUpFunc(SondertasteLos);
354     //glutIdleFunc(timerEvent);
355     //glutDisplayFunc(updateGL);
356     //glutVisibilityFunc(Sichtbar);
357     //      CreateMenu();
358     } else {
359     glutReshapeWindow(800, 600);
360     if (OriginalFenster != 0 && AktuellesFenster != OriginalFenster) {
361     glutLeaveGameMode();
362     AktuellesFenster=OriginalFenster;
363     }
364     }
365     }
366     } break;
367     */
368     case 127: {
369       Taste_Strg=1;
370     } break;
371     case 'x': {
372       if (xnor==0) {
373 	xnor=1;
374       }
375     } break;
376     case 'o': {
377       if (xnor==2) {
378 	xnor=3;
379       }
380     } break;
381     case 'z': {
382       if (xnor==4) {
383 	Spiel=ZUFALL;
384 	SpielfeldAufbau();
385       }
386     } break;//z
387     case 'a': {
388       if (xnor==4) {
389 	Spiel=ACHTBALL;
390 	SpielfeldAufbau();
391 	Schiedsrichter.NeuesSpiel(Spiel);
392       }
393     } break;//a
394     case 'n': {
395       if (xnor==1) {
396 	xnor=2;
397       }
398       if (xnor==4) {
399 	Spiel=NEUNBALL;
400 	SpielfeldAufbau();
401 	Schiedsrichter.NeuesSpiel(Spiel);
402       }
403     } break;//n
404     case '9': {
405       if (xnor==4) {
406 	Spiel=NEUNBALL;
407 	SpielfeldAufbau();
408 	Schiedsrichter.NeuesSpiel(Spiel);
409       }
410     } break;//9
411     case 's': {
412       if (xnor==4) {
413 	Spiel=ZWEIBAELLE;
414 	SpielfeldAufbau();
415       }
416     } break;//s
417     case 'l': {
418       if (xnor==4) {
419 	Spiel=LEER;
420 	SpielfeldAufbau();
421       }
422     } break;//l
423     case 'd': {
424       if (xnor==4) {
425 	GLfloat dx=Kugel[0].Pos_xCM()-Kamera.Pos_xCM();
426 	GLfloat dy=Kugel[0].Pos_yCM()-Kamera.Pos_yCM();
427 	GLfloat Abstand=sqrt(dx*dx+dy*dy);
428 	Stoss(dx*80.0/Abstand,dy*80.0/Abstand);
429       }
430     } break;//d
431     case 'e': {
432       if (xnor==4) {
433 	GLfloat dx=Kugel[0].Pos_xCM()-Kamera.Pos_xCM();
434 	GLfloat dy=Kugel[0].Pos_yCM()-Kamera.Pos_yCM();
435 	GLfloat Abstand=sqrt(dx*dx+dy*dy);
436 	Stoss(dx*80.0/Abstand,dy*80.0/Abstand);
437 	StateMaschin=STOSS;
438 	Menu.NeuerMenuZustand();
439 	Kamera.BlickeAuf2(Kugel[0].Pos_xCM(),Kugel[0].Pos_yCM());
440 	//Kamera.Verfolge(0);
441 	DelayAusgleich=1;
442       }
443     } break;//e
444     case ' ': {
445       switch (StateMaschin) {
446       case BETRACHTEN:
447 	StateMaschin=ZIELEN;
448 	Menu.NeuerMenuZustand();
449 	Kamera.BlickeAuf(Kugel[0].Pos_xCM(),Kugel[0].Pos_yCM());
450 	break;
451       case ZIELEN:
452 	AusholStartzeit=Zeit();
453 	StateMaschin=AUSHOLEN;
454 	Menu.NeuerMenuZustand();
455 	break;
456       case STOSS: {
457 	if (xnor) {
458 	  for (int Kugelnr=0;Kugelnr<16;Kugelnr++) { // Alle Kugeln ans Ziel
459 	    Kugel[Kugelnr].neuePositionD(Bewegungstabelle[Stossdauer][Kugelnr]);
460 	  }
461 	  if (Kugel[0].Pos_x()==3000) {
462 	    StateMaschin=WEISSNEU;
463 	    WeisseEinsetzen();
464 	    Menu.NeuerMenuZustand();
465 	  } else {
466 	    StateMaschin=BETRACHTEN;
467 	    Menu.NeuerMenuZustand();
468 	  }
469 	}
470       } break;
471       case WEISSNEU: {
472 	StateMaschin=BETRACHTEN;
473 	Menu.NeuerMenuZustand();
474       } break;
475       case SCHIEDSRICHTER: {
476 	if (LageVerbesserungKopffeld|LageVerbesserung) {
477 	  WeisseEinsetzen();
478 	  StateMaschin=WEISSNEU;
479 	  Menu.NeuerMenuZustand();
480 	} else {
481 	  StateMaschin=BETRACHTEN;
482 	  Menu.NeuerMenuZustand();
483 	}
484       } break;
485       }
486     }
487     }
488   }
489 }
490 
491 
TasteLos(unsigned char keyPressed,int,int)492 void TasteLos( unsigned char keyPressed, int,int) {
493 
494   if ((keyPressed==' ')&&
495       (StateMaschin==AUSHOLEN)) {
496     GLfloat dx=Kugel[0].Pos_xCM()-Kamera.Pos_xCM();
497     GLfloat dy=Kugel[0].Pos_yCM()-Kamera.Pos_yCM();
498     GLfloat Abstand=sqrt(dx*dx+dy*dy);
499     Stoss(dx*AusholStaerke/Abstand,dy*AusholStaerke/Abstand);
500     StateMaschin=STOSS;
501     Menu.NeuerMenuZustand();
502     Kamera.BlickeAuf2(Kugel[0].Pos_xCM(),Kugel[0].Pos_yCM());
503     //Kamera.Verfolge(0);
504     DelayAusgleich=1;
505   }
506   if (keyPressed==127) {
507     Taste_Strg=0;
508   }
509 
510 }
511 
512 
Sondertaste(int Taste,int x,int y)513 void Sondertaste(int Taste,int x, int y) {
514 
515   x=y;
516 
517   //printf("%i\n",Taste);
518 
519   //  Kamera.FahrtAus();
520 
521   if (StateMaschin!=START) {
522 
523     switch (Taste) {
524     case GLUT_KEY_F1:
525       if (StateMaschin!=AUSHOLEN) {
526 	if (StateMaschin!=STOSS && StateMaschin!=WEISSNEU && StateMaschin!=SCHIEDSRICHTER) {
527 	  StateMaschin=BETRACHTEN;
528 	  Menu.NeuerMenuZustand();
529 	}
530 	Kamera.ladePosition(0);
531       }
532       break;
533     case GLUT_KEY_F2:
534       if (StateMaschin!=AUSHOLEN) {
535 	if (StateMaschin!=STOSS && StateMaschin!=WEISSNEU && StateMaschin!=SCHIEDSRICHTER) {
536 	  StateMaschin=BETRACHTEN;
537 	  Menu.NeuerMenuZustand();
538 	}
539 	Kamera.ladePosition(1);
540       }
541       break;
542     case GLUT_KEY_F3:
543       if (StateMaschin!=AUSHOLEN) {
544 	if (StateMaschin!=STOSS && StateMaschin!=WEISSNEU && StateMaschin!=SCHIEDSRICHTER) {
545 	  StateMaschin=BETRACHTEN;
546 	  Menu.NeuerMenuZustand();
547 	}
548 	Kamera.ladePosition(2);
549       }
550       break;
551     case GLUT_KEY_F4:
552       if (StateMaschin!=AUSHOLEN) {
553 	if (StateMaschin!=STOSS && StateMaschin!=WEISSNEU && StateMaschin!=SCHIEDSRICHTER) {
554 	  StateMaschin=BETRACHTEN;
555 	  Menu.NeuerMenuZustand();
556 	}
557 	Kamera.ladePosition(3);
558       }
559       break;
560     case GLUT_KEY_F5:
561       if (StateMaschin!=AUSHOLEN) {
562 	if (StateMaschin!=STOSS && StateMaschin!=WEISSNEU && StateMaschin!=SCHIEDSRICHTER) {
563 	  StateMaschin=BETRACHTEN;
564 	  Menu.NeuerMenuZustand();
565 	}
566 	Kamera.ladePosition(4);
567       }
568       break;
569     case GLUT_KEY_F6:
570       if (StateMaschin!=AUSHOLEN) {
571 	if (StateMaschin!=STOSS && StateMaschin!=WEISSNEU && StateMaschin!=SCHIEDSRICHTER) {
572 	  StateMaschin=BETRACHTEN;
573 	  Menu.NeuerMenuZustand();
574 	}
575 	Kamera.ladePosition(5);
576       }
577       break;
578     case GLUT_KEY_F7:
579       if (StateMaschin!=AUSHOLEN) {
580 	if (StateMaschin!=STOSS && StateMaschin!=WEISSNEU && StateMaschin!=SCHIEDSRICHTER) {
581 	  StateMaschin=BETRACHTEN;
582 	  Menu.NeuerMenuZustand();
583 	}
584 	Kamera.ladePosition(6);
585       }
586       break;
587     case GLUT_KEY_F8:
588       if (StateMaschin!=AUSHOLEN) {
589 	if (StateMaschin!=STOSS && StateMaschin!=WEISSNEU && StateMaschin!=SCHIEDSRICHTER) {
590 	  StateMaschin=BETRACHTEN;
591 	  Menu.NeuerMenuZustand();
592 	}
593 	Kamera.ladePosition(7);
594       }
595       break;
596 
597     case 108: {
598       Taste_Shift=1;
599     } break;
600     case GLUT_KEY_UP:
601       Taste_Pfeil_Oben=1;
602       break;
603     case GLUT_KEY_DOWN:
604       Taste_Pfeil_Unten=1;
605       break;
606     case GLUT_KEY_RIGHT:
607       Taste_Pfeil_Rechts=1;
608       break;
609     case GLUT_KEY_LEFT:
610       Taste_Pfeil_Links=1;
611       break;
612     case GLUT_KEY_PAGE_UP:
613       Taste_Bild_Auf=1;
614       break;
615     case GLUT_KEY_PAGE_DOWN:
616       Taste_Bild_Ab=1;
617       break;
618     case GLUT_KEY_HOME:
619       if (xnor) Taste_Pos1=1;
620       break;
621     case GLUT_KEY_END:
622       if (xnor) Taste_Ende=1;
623       break;
624     }
625   }
626 }
627 
628 
SondertasteLos(int Taste,int x,int y)629 void SondertasteLos(int Taste,int x, int y) {
630 
631   x=y;
632 
633   if (StateMaschin!=START) {
634 
635     switch (Taste) {
636     case 108: {
637       Taste_Shift=0;
638     } break;
639     case GLUT_KEY_UP:
640       Taste_Pfeil_Oben=0;
641       break;
642     case GLUT_KEY_DOWN:
643       Taste_Pfeil_Unten=0;
644       break;
645     case GLUT_KEY_RIGHT:
646       Taste_Pfeil_Rechts=0;
647       break;
648     case GLUT_KEY_LEFT:
649       Taste_Pfeil_Links=0;
650       break;
651     case GLUT_KEY_PAGE_UP:
652       Taste_Bild_Auf=0;
653       break;
654     case GLUT_KEY_PAGE_DOWN:
655       Taste_Bild_Ab=0;
656       break;
657     case GLUT_KEY_HOME:
658       Taste_Pos1=0;
659       break;
660     case GLUT_KEY_END:
661       Taste_Ende=0;
662       break;
663     }
664   }
665 }
666