Ciao a tutti!
Intanto, se servisse, per programmare uso c++ builder dell'Embarcadero (una versione successiva a borland c++ builder ma con lo stesso funzionamento).
Il mio progetto era quello di fare una specie di ping pong in cui due rettangoli (le racchette) posti ai lati dello schermo e comandati da due giocatori colpissero un quadratino (la pallina) che rimbalza ogni volta che incontra le sponde o le racchette.
Il problema è che se la pallina colpisce la racchetta in alto, spesso entra letteralmente dentro la racchetta e inizia a rimbalzarci dentro finché non esce. Come posso fare a risolvere questo problema?
Tutti i movimenti della pallina sono comandati da un timer che ogni 50 millisecondi sfrutta questo codice:
(Considerate che panel2 e 3 sono le racchette, panel5 è la pallina e panel1 lo sfondo verde.
Se aiuta nell'immagine in fondo sono segnati i vari Panel e qui potete scaricare l'eseguibile per rendervi un'idea di cosa succede)
codice:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
// movimento
Panel5->Left=floor(Panel5->Left+x);
Panel5->Top=floor(Panel5->Top+y);
// sponde
if(Panel5->Top < 0){y=-y;}
if(Panel5->Top > Panel1->Height-18){y=-y;}
// racchette
if(fabs(Panel5->Left-Panel2->Left) < Panel2->Width+2){
if((Panel5->Top > Panel2->Top)&&(Panel5->Top < Panel2->Top+Panel2->Height)){ x=-x;}
}
if(fabs(Panel5->Left-Panel3->Left) < Panel3->Width-2){
if((Panel5->Top > Panel3->Top)&&(Panel5->Top < Panel3->Top+Panel3->Height))){ x=-x;}
}
// goal
if(Panel5->Left < 8){ punteggio2++;
Label2->Caption=IntToStr(punteggio2); //calcolo del punteggio
Panel5->Top=rand()%Panel1->Height; //calcolo del punteggio
Panel5->Left=Panel4->Left; //calcolo del punteggio
srand(time(NULL)); //rimessa in campo della palla
if(rand()&2!=0){x=5;} //rimessa in campo della palla
else {x=-5;} //rimessa in campo della palla
srand(time(NULL)); //rimessa in campo della palla
if(rand()&2!=0){y=5;} //rimessa in campo della palla
else {y=-5;} //rimessa in campo della palla
}
else{ if(Panel5->Left > Panel1->Width-8){
punteggio1++;
Label1->Caption=IntToStr(punteggio1);
Panel5->Top=rand()%Panel1->Height;
Panel5->Left=Panel4->Left;
srand(time(NULL));
if(rand()&2!=0){x=5;}
else {x=-5;}
srand(time(NULL));
if(rand()&2!=0){y=5;}
else {y=-5;}
}
}
}