IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Bug progress bar


Sujet :

Windows Forms

  1. #1
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 958
    Points : 937
    Points
    937
    Par défaut Bug progress bar
    Bonjour, je viens de terminer un jeu en VB.NET (Mastermind) dans lequel j'ai inclus un option "Jouer en temps limité".
    J'utilise pour cela une progress bar qui, quand elle arrive à son terme, affiche au joueur qu'il n'a pas trouvé la bonne combinaison dans le temps et déclenche le "reset" du jeu.
    Or, j'ai remarqué une "faille" (que j'avais déjà remarqué en VBA Access).
    Quand on clique sur un des trois boutons : réduire, agrandir, ou fermer la fenêtre, sans relâcher le clic, tant qu'on ne relâche pas le clic, la progress bar ne progresse pas
    Elle reste bloquée.
    Donc dans mon cas, le joueur a tout son temps pour réfléchir à la bonne combinaison !
    J'ai demandé comment résoudre se problème à mon prof de dev' et il m'a montré comment enlever les boutons réduire, agrandir et fermer ><
    Ça me rappelle le médecin de ma petite sœur qui, se plaignant de son poignet lorsqu'elle faisait la roue, lui avait conseillé de ne plus faire la roue ...
    Bref, des astuces, des conseils ? Car j'aimerais si possible laisser les trois boutons

    Merci d'avance à ceux qui me liront.
    Si ma réponse vous a été utile pensez à voter Pour

    Avant de poster sur le forum Access :
    FAQ > SOURCES > COURS > FORUM > GOOGLE
    Pas de question par MP ou je mords


  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    C'est marrant, parce que ça le fait avec n'importe quelle application (tient je suis sous Chrome, je fais la manip et l'animation flash du haut se bloque ...).

    Peut être que tu pourrai essayer quelque chose ceci dit : mettre une variable globale "GameOver" de type booléen et la laisser à true, et mettre ton chronomètre dans un autre thread (System.Threading.Thread) et au moment où le chrono se termine passer GameOver à true. Et dans la fenêtre principale tu vérifie la valeur de GameOver avant de poursuivre chaque action et tu la vérifies de temps en temps avec un Timer.
    Et donc même si l'affichage est bloqué, une fois qu'il lâchera la croix l'affichage détectera le GameOver et l'expulsera violemment du jeu

  3. #3
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 958
    Points : 937
    Points
    937
    Par défaut
    Ouais, je vois le truc.
    Vu que le gars va devoir lâcher la souris à un moment donné pour cliquer sur un bouton de couleur, on peut l'éjecter violemment à ce moment là.
    Si ma réponse vous a été utile pensez à voter Pour

    Avant de poster sur le forum Access :
    FAQ > SOURCES > COURS > FORUM > GOOGLE
    Pas de question par MP ou je mords


  4. #4
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 958
    Points : 937
    Points
    937
    Par défaut
    Après vérification le souci est que quand on clique sur la croix, ce n'est pas seulement la progress bar qui est figée mais aussi le compte à rebours
    Mais je ne crois pas avoir compris ce que tu veux dire avec le Thread, tu pourrais me donner un exemple de déclaration et d'utilisation ?
    Je débute en .net

    Merci d'avance
    Si ma réponse vous a été utile pensez à voter Pour

    Avant de poster sur le forum Access :
    FAQ > SOURCES > COURS > FORUM > GOOGLE
    Pas de question par MP ou je mords


  5. #5
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    En fait j'ai plus simple.
    Il te faut, une fenêtre, un label, un bouton et un timer et tu complètes comme suit :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    private void timer1_Tick(object sender, EventArgs e)
            {
                TimeSpan timeLeft = (endDate - DateTime.Now);
                if (timeLeft.TotalSeconds <= 0)
                {
                    timer1.Stop();
                    MessageBox.Show("Temps impartit écoulé !");
                }
                else
                {
                    label1.Text = String.Format("Temps restant : {0} secondes", ((int)timeLeft.TotalSeconds));
                }                
            }
     
            DateTime startDate = DateTime.MinValue;
            DateTime endDate = DateTime.MaxValue;
     
            private void button1_Click(object sender, EventArgs e)
            {
                startDate = DateTime.Now;
                endDate = startDate.Add(new TimeSpan(0, 0, 10)); /* 10 secondes de chrono */
                timer1.Start();
            }
    button1_Click correspond à l'évènement Click du bouton, timer1_Tick à l'évènement Tick du timer.
    Avec ça, on peut encore maintenir enfoncé le bouton de la fenêtre et le temps se bloque, mais dès qu'on lâche il vérifie quand même le temps et si 10 sont passés (même pendant le maintient du bouton de fenêtre enfoncé) il s'arrête à l'instant même où le bouton est relâché ... et c'est ce que tu veux il me semble

  6. #6
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 958
    Points : 937
    Points
    937
    Par défaut
    Bonsoir
    Alors j'ai créé un petit projet pour tester et ça fonctionne correctement.
    C'était pas tout à fait du vb.net mais je l'ai adapté sans trop de difficultés
    Voilà le code en vb.net pour ceux que ça intéresse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Public Class Form1
        Dim startDate As DateTime = DateTime.MinValue
        Dim endDate As DateTime = DateTime.MaxValue
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            startDate = DateTime.Now
            endDate = startDate.Add(New TimeSpan(0, 0, 10)) '10 secondes de chrono
            Timer1.Start()
        End Sub
     
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Dim timeLeft As TimeSpan = (endDate - DateTime.Now)
            If (timeLeft.TotalSeconds <= 0) Then
                Timer1.Stop()
                MessageBox.Show("Temps imparti écoulé !")
            Else
                Label1.Text = String.Format("Temps restant : {0} secondes", ((Int(timeLeft.TotalSeconds))))
            End If
        End Sub
    End Class
    Je vais maintenant essayer de l'adapter à mon jeu. Je te dis si j'ai un souci

    A bientôt !

    P.S : Quand tu fais String.Format, j'ai vu que tu mettais le 0 entre accolades. Ça incrémente sa valeur automatiquement ? Si j'ai bien compris ça évite d'avoir à concaténer une variable supplémentaire ?
    Si ma réponse vous a été utile pensez à voter Pour

    Avant de poster sur le forum Access :
    FAQ > SOURCES > COURS > FORUM > GOOGLE
    Pas de question par MP ou je mords


  7. #7
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par azertix Voir le message
    P.S : Quand tu fais String.Format, j'ai vu que tu mettais le 0 entre accolades. Ça incrémente sa valeur automatiquement ? Si j'ai bien compris ça évite d'avoir à concaténer une variable supplémentaire ?
    Non c'est pas ça. String.Format remplace les {nb} par le nb-ième argument passé en paramètre (en comptant à partir de zéro).

    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String.Format("{0} {1} machin","truc","bidule")
    est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "truc" & "bidule" & "machin"
    , etc.
    Donc mon String.Format remplace le {0} par la valeur de ((Int(timeLeft.TotalSeconds))).

  8. #8
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 958
    Points : 937
    Points
    937
    Par défaut
    Ok, c'est noté. Merci pour la précision.
    Si ma réponse vous a été utile pensez à voter Pour

    Avant de poster sur le forum Access :
    FAQ > SOURCES > COURS > FORUM > GOOGLE
    Pas de question par MP ou je mords


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Bug des Progress bar sous Vista
    Par titoine1978 dans le forum MFC
    Réponses: 5
    Dernier message: 16/02/2008, 15h58
  2. [ATL] Petite question sur les progress bar
    Par MrMaze dans le forum MFC
    Réponses: 1
    Dernier message: 06/05/2005, 09h40
  3. [MFC]Changer la couleur d'un progress bar
    Par Deedier dans le forum MFC
    Réponses: 1
    Dernier message: 21/04/2005, 18h39
  4. [VB.NET] Mise en place d'une progress bar
    Par Hoegaarden dans le forum Windows Forms
    Réponses: 14
    Dernier message: 19/10/2004, 09h23
  5. Progress bar au boot
    Par saibe dans le forum Administration système
    Réponses: 2
    Dernier message: 18/08/2003, 10h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo