C# une action se répète plusieurs fois

Signaler
Messages postés
3089
Date d'inscription
jeudi 28 janvier 2010
Statut
Membre
Dernière intervention
21 novembre 2020
-
Messages postés
3089
Date d'inscription
jeudi 28 janvier 2010
Statut
Membre
Dernière intervention
21 novembre 2020
-
Bonjour

Je suis en train de programmer un petit jeu et j'en suis encore au tout début.
Voici l'interface :


J'aimerais maintenant mettre en place un compteur qui indique le nombre de fois où la balle aura touché la barre. A priori rien de compliqué sauf qu'à chaque fois que ça touche, cela incrémente le compteur 1 à 5 fois, comme si ça toucherait 5 fois de suite.

Voici le code : http://pastebin.com/JKRiTT6M

Dans private void pictureBoxBalle_LocationChanged(object sender, EventArgs e) il y a beaucoup de commentaires mais le code de l'événement se trouve vers le bas. J'ai fais un tas d'essais mais à chaque fois le compteur est incrémenté plusieurs fois.

Le compteur est incrémenté plusieurs fois alors que je fais une vérification pour voir si 2 secondes minimum se sont écoulées avant la dernière incrémentation et en plus la variable bControle devrait empêcher une incrémentation supplémentaire tant qu'un rebond n'a pas eus lieu.

Donc il y a deux choses qui devraient empêcher plus d'une incrémentation par rebond mais visiblement ça ne fonctionne pas.

Pouvez vous m'aider ?

Merci d'avance

3 réponses

Messages postés
31044
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 janvier 2021
342
Bonjour,

Voici le code : http://pastebin.com/JKRiTT6M

Merci de poster le code directment SUR LE FORUM...

Merci de bien vouloir utiliser la coloration syntaxique (les balises de code) lorsque tu postes du code sur le forum.
Explications disponibles ici :
http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code


.
Messages postés
3089
Date d'inscription
jeudi 28 janvier 2010
Statut
Membre
Dernière intervention
21 novembre 2020
1
        DateTime sSecondes, sSecondesAncien;
int i = 0;
public int NbrePxDeplacementPositif = 1;
public int NbrePxDeplacementNegatif = -1;
public int X = 1, Y = 1;
Point locationPic1 = Point.Empty;
Point locationPic2 = Point.Empty;
bool bControle = false;

public Form1()
{
InitializeComponent();
}

private void timer1_Tick(object sender, EventArgs e)
{
Point p = this.PointToClient(new Point(Cursor.Position.X, Cursor.Position.Y));
Point point = this.pictureBoxBarre.Location;
// Place la pictureBox sur le curseur
if ((p.X < 539 - 30) && (p.X > 0 + 45))
{
point.X = p.X - 45;
point.Y = 366;
this.pictureBoxBarre.Location = point;
}
// Permet de régler le rebond
if (pictureBoxBalle.Location.X > 538)
{
X = NbrePxDeplacementNegatif;
bControle = true;
}
if (pictureBoxBalle.Location.Y > 366)
{
Y = NbrePxDeplacementNegatif;
bControle = true;
}
if (pictureBoxBalle.Location.X < 0)
{
X = NbrePxDeplacementPositif;
bControle = true;
}
if (pictureBoxBalle.Location.Y < 0)
{
Y = NbrePxDeplacementPositif;
bControle = true;
}
// Déplace la balle
Point newlocationPic1 = this.pictureBoxBalle.Location;
newlocationPic1.X = newlocationPic1.X + X - locationPic1.X;
newlocationPic1.Y = newlocationPic1.Y + Y - locationPic1.Y;
this.pictureBoxBalle.Location = newlocationPic1;

}

private void pictureBoxBalle_LocationChanged(object sender, EventArgs e)
{
/* // if (pictureBoxBalle.Location.Y == 366)
// MessageBox.Show(Convert.ToString(pictureBoxBalle.Location.X + "," + pictureBoxBarre.Location.X +","+ (pictureBoxBarre.Location.X+88)+","+pictureBoxBalle.Location.Y));
sSecondes = DateTime.Now;
TimeSpan ts = sSecondes - sSecondesAncien;
if (ts.Seconds > 1)
{
sSecondesAncien = sSecondes;
if ((pictureBoxBalle.Location.X >= pictureBoxBarre.Location.X) && (pictureBoxBalle.Location.X <= pictureBoxBarre.Location.X + 88) && (pictureBoxBalle.Location.Y > 362)) // valeur normale = 366
MessageBox.Show("oo");
//i++;
label1.Text = Convert.ToString(i);
}*/

// if (pictureBoxBalle.Location.Y == 366)
// MessageBox.Show(Convert.ToString(pictureBoxBalle.Location.X + "," + pictureBoxBarre.Location.X +","+ (pictureBoxBarre.Location.X+88)+","+pictureBoxBalle.Location.Y));



/*sSecondes = DateTime.Now;
TimeSpan ts = sSecondes - sSecondesAncien;
if (ts.Seconds > 2)
{
if ((pictureBoxBalle.Location.X >= pictureBoxBarre.Location.X) && (pictureBoxBalle.Location.X <= pictureBoxBarre.Location.X + 88) && (pictureBoxBalle.Location.Y > 364)) // valeur normale = 366
{
i++;
sSecondesAncien = sSecondes;
}
label1.Text = Convert.ToString(i);
}*/




sSecondes = DateTime.Now;
TimeSpan ts = sSecondes - sSecondesAncien;
if ((bControle == true) && (ts.Seconds > 2))
{
if ((pictureBoxBalle.Location.X >= pictureBoxBarre.Location.X) && (pictureBoxBalle.Location.X <= pictureBoxBarre.Location.X + 88) && (pictureBoxBalle.Location.Y > 364)) // valeur normale = 366
{
i++;
sSecondesAncien = sSecondes;
bControle = false;
}
label1.Text = Convert.ToString(i);
}
}

// Permet de déplacer la barre du bas ainsi que la balle selon l'interval du timer
private void pictureBoxBarre_Click(object sender, EventArgs e)
{
timer1.Start();
}
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
20
Salut,

je ne comprends pas pourquoi tu démarres plusieurs instances du Timer, mais si c'est vraiment utile, essayes ceci :

private void pictureBoxBarre_Click(object sender, EventArgs e)
{
    if(bControle == false)
        timer1.Start();
}


bye...
Messages postés
3089
Date d'inscription
jeudi 28 janvier 2010
Statut
Membre
Dernière intervention
21 novembre 2020
1
Lu'

En faite le timer sert à déplacer la balle selon l'intervalle de temps choisit et en fonction de la valeur de

public int NbrePxDeplacementPositif = 1;
public int NbrePxDeplacementNegatif = -1;
public int X = 1, Y = 1;

bControle devait empêcher l'incrémentation du compteur tant qu'un rebond n'a pas été fait. En faite une incrémentation est faite, bControle est passé à false et avec le if que j'ai marqué, l'incrémentation ne devrait se faire que lorsqu'il repasse à true, malgré cela elle se fait plusieurs fois de suite. C'est cela que je n'arrive pas à faire. L'incrémentation compte le nombre de rebond et avec 1 à 5 incrémentations par rebond, c'est impossible d'afficher le bon nombre.

Etant donné qu'une fois lancé, le timer n'est jamais arrêté je ne comprend pas vraiment l'utilité de ce que tu me proposes, surtout qu'on ne clique qu'une fois sur la barre.