PDA

Visualizza la versione completa : [C++]Ping Pong in c++


marandavide
02-03-2012, 18:29
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 (http://db.tt/jcgWLJQT) potete scaricare l'eseguibile per rendervi un'idea di cosa succede)


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;}
}
}

}

http://img14.imageshack.us/img14/628/nomipanel.png

marandavide
03-03-2012, 14:36
nessuno?

linoma
03-03-2012, 14:42
Sinceramente il codice nn è leggibile, ma quando avviene la collisione dovresti cambiare la direzione della pallina e portarla poco dopo la racchetta.

Loading