Bonjour à tous
je suis en tr1 de faire un jeu ou il faut amené la souris sur un point situé sur l'écran (j'utilise actuellement la souris mais ce programme évoluera pour utiliser une plate-forme de force). Et chaque partie dure un temps déterminé, d'où l'utilisation d'un timer.
Ma partie a deux facon de se terminer :
- lorsque le timer est terminé
- lorsque l'utilisateur a amené le point de ca souris sur le point.
Mon problème est que lorsque je lance plusieurs partie de suite, il y a un problème avec le timer à partir de la deuxième partie (impossible a jouer car la partie ne dure pas).
Or, en mettant une pause (un showMessage), il n'y a plus de problème. Quelqu'un aurait-il une solution
voici mon code :
// Méthode déclancher lorsque le timer est terminé
void __fastcall TGameForm::OnTimer(TObject *Sender)
{
FinDePartie();
}
// Méthode qui lance une partie
void TGameForm::DbtDePartie(void)
{
// On détermine les coordonnées du point
Point(p->LesParties[NumPartie].Position);
// On configure l'objet timer
Timer1 = new TTimer(NULL);
// On fixe l'intervalle du timer
Timer1->Interval = (p->LesParties[NumPartie].Temps) * 1000;
// On affecte la méthode OnTimer
Timer1->OnTimer = OnTimer;
// On active Le timer
Timer1->Enabled = true;
// On Dessine l'écran
OnPaint(this);
}
// Méthode qui termine une partie
void TGameForm::FinDePartie(void)
{
//ShowMessage("Fin de partie");
// On désactive l'objet timer
Timer1->Enabled = false;
// On détruit l'objet Timer
delete Timer1;
// On efface l'écran
Canvas->Pen->Color = clWhite;
Canvas->Brush->Color = clWhite;
Canvas->Rectangle(0, 0, ClientWidth, ClientHeight);
// On incrémente le numéro de la partie
NumPartie++;
// On vide la liste des points
pts.ViderPoints();
// On lance la partie suivante
if(NumPartie < 4)
{
DbtDePartie();
}
else
{
ShowMessage("Fin du Jeu !");
// On met NumPartie à -1
NumPartie = -1;
// On désactive le mode Jeu
ModeJeu = false;
OnPaint(this);
}
}
void __fastcall TGameForm::OnMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
// Si l'on est en mode Jeu
if(ModeJeu == true)
{
// Si c'est le premier point
if(pts.NbPoints == 0)
{
Canvas->MoveTo(X, Y);
}
else
{
Canvas->LineTo(X, Y);
}
// On ajoute le point
pts.AjouterPoint(X, Y);
if(Gagner(X, Y))
{
// Pause qui permet au programme de fonctionner
//ShowMessage("Gagné");
FinDePartie();
}
}
}
// Méthode qui teste si l'on a gagné
bool TGameForm::Gagner(int x, int y)
{
int xc, yc; // Coordonnées du centre du cercle
double Distance; // Distance
double Rayon = Diametre / 2; // Rayon
double opx, opy;
xc = ((float)(x1) + (float)(x2)) / 2;
yc = ((float)(y1) + (float)(y2)) / 2;
opx = (x - xc) * (x - xc);
opy = (y - yc) * (y - yc);
Distance = sqrt(opx + opy);
// SI la distance est inférieur au diamètre du cercle
if(Distance < Rayon)
{
// C'est gagné
return true;
}
else
{
return false;
}
}