bool SideCollision::isCollision ( ) { Side* s = (Side*) o; Ball* b = (Ball*) p; // pallina vera Ball* d; // pallina fittizzia per gestire il bordo stondato bool ret; #if DEBUG > 1 cout << "Guardo se c'e' veramente scontro fra la pallina "; b->print(); cout << "e il bordo "; s->print(); #endif // posizione nuova della pallina bb.pos = b->pos + dt * b->vel; bb.vel = b->vel; // gestione scontro col bordo if ( s->isInside( bb.pos ) ) { #if DEBUG > 1 cout << "Controllo eventuale collisione EASY.\n"; #endif if ( ( ( s->type == VERTICAL ) && ( fabs( b->vel.x ) >= EPSILON ) ) || ( ( s->type == ORIZONTAL ) && ( fabs( b->vel.y ) >= EPSILON ) ) ) { type = EASY; ret = true; } else ret = false; } else { #if DEBUG > 1 cout << "Controllo eventuale collisione HARD.\n"; #endif if ( s->type == VERTICAL ) { //s->a.print(); if ( bb.pos.y < s->beg.y ) d = &(s->a); else d = &(s->b); } else { //s->a.print(); if ( bb.pos.x < s->beg.x ) d = &(s->a); else d = &(s->b); } //d->print(); //b->print(); // TODO c.set( d, b, dt ); ret = c.isCollision(); if ( ret ) type = HARD; } #if DEBUG > 1 if ( ret ) cout << "Ci sara' collisione.\n"; else cout << "Non ci sara' collisione.\n"; #endif return ret; }