#include "Ball.h" Ball::Ball(short x, short y, int d, Racket* r1, Racket* r2, PongView* p) { symbol = 'o'; xPos = x; yPos = y; //Zufallsgenerator initialisieren srand( (unsigned)time( NULL ) ); //Anfangsrichtung auswürfeln do { //Werte zwischen 1 bis 16 switch ( (rand() % 16) + 1 ) { case 1: dir = N; break; case 2: dir = NNO; break; case 3: dir = NO; break; case 4: dir = NOO; break; case 5: dir = O; break; case 6: dir = SOO; break; case 7: dir = SO; break; case 8: dir = SSO; break; case 9: dir = S; break; case 10: dir = SSW; break; case 11: dir = SW; break; case 12: dir = SWW; break; case 13: dir = W; break; case 14: dir = NWW; break; case 15: dir = NW; break; case 16: dir = NNW; break; } } //Nur wenn die Richtung schräg verlaufend ist while ( dir == N || dir == S || dir == W || dir == O); delay = d; racket1 = r1; racket2 = r2; pv = p; } void Ball::move(void) { //Aktuelle Position überschreiben pv->eraseBall(this); pv->drawRacket(racket1); pv->drawRacket(racket2); checkHitBorder(); //16 Himmelsrichtungen //{N=1,NNO,NO,NOO,O,OSO,SO,SSO,S,SSW,SW,WSW,W,WNW,NW,NNW} //Bewegung ist abhängig von der Richtung switch (dir) { case N: yPos--; break; case NNO: yPos--; //Damit nicht auf den Rand geschrieben wird if ( yPos > PongController::ga->yMin ) yPos--; xPos++; break; case NO: xPos++; yPos--; break; case NOO: xPos++; //Damit nicht auf den Rand geschrieben wird if ( xPos < PongController::ga->xMax ) xPos++; yPos--; break; case O: xPos++; break; case SOO: xPos++; //Damit nicht auf den Rand geschrieben wird if ( xPos < PongController::ga->xMax ) xPos++; yPos++; break; case SO: xPos++; yPos++; break; case SSO: xPos++; yPos++; //Damit nicht auf den Rand geschrieben wird if ( yPos < PongController::ga->yMax ) yPos++; break; case S: yPos++; break; case SSW: xPos--; yPos++; //Damit nicht auf den Rand geschrieben wird if ( yPos < PongController::ga->yMax ) yPos++; break; case SW: xPos--; yPos++; break; case SWW: xPos--; //Damit nicht auf den Rand geschrieben wird if ( xPos > PongController::ga->xMin ) xPos--; yPos++; break; case W: xPos--; break; case NWW: xPos--; //Damit nicht auf den Rand geschrieben wird if ( xPos > PongController::ga->xMin ) xPos--; yPos--; break; case NW: xPos--; yPos--; break; case NNW: xPos--; yPos--; //Damit nicht auf den Rand geschrieben wird if ( yPos > PongController::ga->yMin ) yPos--; break; } //Nur neu zeichnen, wenn Schläger nicht getroffen if ( !checkHitRacket() ) { //Neue Position zeichnen pv->drawBall(this); } //Büschen warten Sleep(delay); } short Ball::getXPos(void) { return xPos; } short Ball::getYPos(void) { return yPos; } unsigned char Ball::getSymbol(void) { return symbol; } void Ball::checkHitBorder() { //Richtungsumkehr, wenn oberer Rand erreicht if ( yPos < PongController::ga->yMin + 1 ) { switch (dir) { case NWW: dir = SWW; break; case NW: dir = SW; break; case NNW: dir = SSW; break; case N: dir = S; break; case NNO: dir = SSO; break; case NO: dir = SO; break; case NOO: dir = SOO; break; } } //Richtungsumkehr, wenn unterer Rand erreicht if ( yPos > PongController::ga->yMax - 1 ) { switch (dir) { case SWW: dir = NWW; break; case SW: dir = NW; break; case SSW: dir = NNW; break; case S: dir = N; break; case SSO: dir = NNO; break; case SO: dir = NO; break; case SOO: dir = NOO; break; } } //Richtungsumkehr, wenn linker Rand erreicht if ( xPos < PongController::ga->xMin + 1 ) { switch (dir) { case NNW: dir = NNO; break; case NW: dir = NO; break; case NWW: dir = NOO; break; case W: dir = O; break; case SWW: dir = SOO; break; case SW: dir = SO; break; case SSW: dir = SSO; break; } } //Richtungsumkehr, wenn rechter Rand erreicht if ( xPos > PongController::ga->xMax - 1 ) { switch (dir) { case NNO: dir = NNW; break; case NO: dir = NW; break; case NOO: dir = NWW; break; case O: dir = W; break; case SOO: dir = SWW; break; case SO: dir = SW; break; case SSO: dir = SSW; break; } } } bool Ball::checkHitRacket() { bool rc = false; //Stimmt die X-Position von Ball und Schläger überein? if ( xPos == racket1->getXPos() ) { //Stimmt auch die Y-Position von Ball und Schläger überein? for (int i=0; igetSize(); i++) { if ( yPos == racket1->getYPos() + i ) { rc = true; break; } } if ( rc ) { switch (dir) { //Von links kommend case NNW: dir = NO; break; case NW: dir = NNO; break; case NWW: dir = O; break; case W: dir = SOO; break; case SWW: dir = SO; break; case SW: dir = SSO; break; case SSW: dir = SO; break; //Von rechts kommend case NNO: dir = NW; break; case NO: dir = NNW; break; case NOO: dir = W; break; case O: dir = SWW; break; case SOO: dir = SW; break; case SO: dir = SSW; break; case SSO: dir = SW; break; } return rc; } } //Stimmt die X-Position von Ball und Schläger überein? if ( xPos == racket2->getXPos() ) { //Stimmt auch die Y-Position von Ball und Schläger überein? for (int i=0; igetSize(); i++) { if ( yPos == racket2->getYPos() + i ) { rc = true; break; } } if ( rc ) { switch (dir) { //Von links kommend case NNO: dir = NW; break; case NO: dir = NNW; break; case NOO: dir = W; break; case O: dir = SWW; break; case SOO: dir = SW; break; case SO: dir = SSW; break; case SSO: dir = SW; break; //Von rechts kommend case NNW: dir = NO; break; case NW: dir = NNO; break; case NWW: dir = O; break; case W: dir = SOO; break; case SWW: dir = SO; break; case SW: dir = SSO; break; case SSW: dir = SO; break; } return rc; } } return rc; }