#include "PongController.h" CRITICAL_SECTION* PongController::Section = new CRITICAL_SECTION; PongView* PongController::pv = new PongView; GAMEAREA* PongController::ga = new GAMEAREA; PongController::PongController(GAMEAREA g) { InitializeCriticalSection( PongController::Section ); PongController::ga->xMin = g.xMin; PongController::ga->xMax = g.xMax; PongController::ga->yMin = g.yMin; PongController::ga->yMax = g.yMax; r1 = new Racket(PongController::ga->xMin+7, PongController::ga->yMin+9, 7); r2 = new Racket(PongController::ga->xMax-7, PongController::ga->yMin+9, 7); b = new Ball(40, 11, 100, r1, r2, PongController::pv); pv->drawGameScreen(); } PongController::~PongController(void) { //Section zerstören DeleteCriticalSection( PongController::Section ); //Reservierten Speicher zurück geben delete ( PongController::Section ); delete (pv); delete (r1); delete (r2); delete (b); } void PongController::startGame() { pv->drawGameScreen(); short r1OldXPos = r1->getXPos(); short r1OldYPos = r1->getYPos(); short r1Size = r1->getSize(); short r2OldXPos = r2->getXPos(); short r2OldYPos = r2->getYPos(); short r2Size = r2->getSize(); //Schläger anzeigen pv->drawRacket(r1); pv->drawRacket(r2); //Variable für Tastendrücke int taste=0; //Variable für Rückgabewerte bool rc = false; //Bereits erzeugten Ball als Thread laufen lassen _beginthread( PongController::animateBall, 0, b ); do { //Ausgabe der Ballposition //Nur wenn gerade keine andere Ausgabe statt findet EnterCriticalSection( PongController::Section ); pv->showBallPosition(b); LeaveCriticalSection( PongController::Section ); if ( _kbhit() ) { taste = _getch(); switch (taste) { case 'w': //Aktuelle Position merken r1OldXPos = r1->getXPos(); r1OldYPos = r1->getYPos(); rc = r1->moveUp(); if ( rc ) { EnterCriticalSection( PongController::Section ); //alte Position überschreiben pv->eraseRacket(r1OldXPos, r1OldYPos + r1Size -1); //Neuen Position zeichnen pv->drawRacket(r1); LeaveCriticalSection( PongController::Section ); } break; case 's': //Aktuelle Position merken r1OldXPos = r1->getXPos(); r1OldYPos = r1->getYPos(); rc = r1->moveDown(); if ( rc ) { EnterCriticalSection( PongController::Section ); //alte Position überschreiben pv->eraseRacket(r1OldXPos, r1OldYPos); //Neuen Position zeichnen pv->drawRacket(r1); LeaveCriticalSection( PongController::Section ); } break; case 'o': //Aktuelle Position merken r2OldXPos = r2->getXPos(); r2OldYPos = r2->getYPos(); rc = r2->moveUp(); if ( rc ) { EnterCriticalSection( PongController::Section ); //alte Position überschreiben pv->eraseRacket(r2OldXPos, r2OldYPos + r2Size -1); //Neuen Position zeichnen pv->drawRacket(r2); LeaveCriticalSection( PongController::Section ); } break; case 'k': //Aktuelle Position merken r2OldXPos = r2->getXPos(); r2OldYPos = r2->getYPos(); rc = r2->moveDown(); if ( rc ) { EnterCriticalSection( PongController::Section ); //alte Position überschreiben pv->eraseRacket(r2OldXPos, r2OldYPos); //Neuen Position zeichnen pv->drawRacket(r2); LeaveCriticalSection( PongController::Section ); } break; } } } while ( taste != 'q' ); EnterCriticalSection( PongController::Section ); pv->showBallPosition(b); LeaveCriticalSection( PongController::Section ); } void PongController::animateBall( void* p ) { //Ball ist bereits erzeugt und wird //als p übergeben. Ball* b = (Ball*)p; //Kritischer Abschnitt ist der bereits in Pong definierte CRITICAL_SECTION* s = PongController::Section; //Nur Zeichnen, wenn gerade nicht gezeichnet wird EnterCriticalSection( s ); pv->drawBall(b); LeaveCriticalSection( s ); while (true) { //Und hier den Ball bewegen und zeichnen, wenn //nicht gerade gezeichnet wird EnterCriticalSection( s ); b->move(); pv->eraseBall(b); pv->drawBall(b); LeaveCriticalSection( s ); } }