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

cocodu67... Messages postés 3153 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 4 avril 2024 - 13 juin 2014 à 14:13
cocodu67... Messages postés 3153 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 4 avril 2024 - 15 juin 2014 à 15:10
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

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
13 juin 2014 à 14:15
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


.
0
cocodu67... Messages postés 3153 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 4 avril 2024 1
14 juin 2014 à 18:55
        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();
}
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
15 juin 2014 à 13:21
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...
0
cocodu67... Messages postés 3153 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 4 avril 2024 1
15 juin 2014 à 15:10
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.
0
Rejoignez-nous