Exemple #1
0
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;
}