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

 Delphi Discussion :

Demande de test (rapide) sur le scintillement graphique


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Simicro
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Mai 2012
    Messages : 136
    Par défaut Demande de test (rapide) sur le scintillement graphique
    Bonjour,

    En vue à terme d'une petite simulation j'ai un programme (fourni en pièce jointe) qui affiche une grille, un pion bleu fixe et un pion rouge qui se déplace aléatoirement.

    A la création de la fiche, avant même d'appuyer sur "Start Simulation", lorsque que les cases vertes sont dessinées, je vois le balayage de la grille par la boucle de la procédure Ondraw (fournie ci-après) : une case blanche se déplace très rapidement (cf. capture écran). Même phénomène lorsque le programme est réduit puis restauré.

    Deux questions :

    (1) Est-ce que vous observez également ce phénomène ?

    (2) Est-ce que c'est ce qu'on appelle le "flickering" (scintillement ?) et qui peut se résoudre notamment avec la technique du DoubleBuffered à ce que j'ai pu lire ?

    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
    21
    procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
     
    var
      CaseAColorier : TRect;
      i             : integer;
      j             : integer;
     
    begin
      for i := 0 to 19 do
        begin
          for j := 0 to 19 do
            begin
              CaseAColorier:=DrawGrid1.CellRect(i,j);
              DrawGrid1.Canvas.Brush.Color := ClGreen;
              if (i = PosXJoueurA) and (j = PosYJoueurA) then DrawGrid1.Canvas.Brush.Color := ClRed;
              if (i = PosXJoueurB) and (j = PosYJoueurB) then DrawGrid1.Canvas.Brush.Color := ClBlue;
              DrawGrid1.Canvas.FillRect(CaseAColorier);
            end;
        end;
    end;
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    409
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 409
    Par défaut
    tu n'as pas tout à fait compris l'événement OnDrawCell, il ne faut pas pas redessiner toute les cases mais seulement celle de coordonnées ACol, ARow

    donc tu dois supprimer tes boucles for i := 0 to 19 do et for j := 0 to 19 do et remplacer i et j par ACol et ARow et CaseAColorier par Rect qui est également transmis en paramètre à OnDrawCell

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 33
    Par défaut gestion de l'évenement OnDrawCell
    consulte le site suivant : http://hmsdk.voila.net/
    Les étapes du développement du jeu MasterMind sous DELPHI

    les sources te montrent l'utilisation du gestionnaire de l'évenement OnDrawCell d'une stringgrid qui est le même que celui d'une drawgrid.

  4. #4
    Membre confirmé Avatar de Simicro
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Mai 2012
    Messages : 136
    Par défaut
    @exoseven : merci.

    C'est exact, je n'ai pas encore tout compris du OnDrawCell

    Et oui ça marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
     
    begin
      Rect:=DrawGrid1.CellRect(ACol,ARow);
      DrawGrid1.Canvas.Brush.Color := ClGreen;
      if (ACol = PosXJoueurA) and (ARow = PosYJoueurA) then DrawGrid1.Canvas.Brush.Color := ClRed;
      if (ACol = PosXJoueurB) and (ARow = PosYJoueurB) then DrawGrid1.Canvas.Brush.Color := ClBlue;
      DrawGrid1.Canvas.FillRect(Rect);
    end;
    Par contre, comment je peux m'en sortir avec cette autre procédure non méthode d'objet ? J'ai essayé de supprimer les boucles et de remplacer i et j par ACol et ARow et CaseAColorier par Rect; mais ACol et ARow ne sont pas connus de la procédure.

    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
    procedure AfficheMvt;
     
    var
      CaseAColorier : TRect;
      i             : integer;
      j             : integer;
     
    begin
      for i := 0 to 19 do
        begin
          for j := 0 to 19 do
            begin
              CaseAColorier:=Form1.DrawGrid1.CellRect(i,j);
              Form1.DrawGrid1.Canvas.Brush.Color := ClGreen; { Importance du Form1 car procédure simple, non méthode d'objet }
              if (i = PosXJoueurA) and (j = PosYJoueurA) then Form1.DrawGrid1.Canvas.Brush.Color := ClRed;
              if (i = PosXJoueurB) and (j = PosYJoueurB) then Form1.DrawGrid1.Canvas.Brush.Color := ClBlue;
              Form1.DrawGrid1.Canvas.FillRect(CaseAColorier);
            end;
        end;
    end;
    @jovanovic.radoslav : oui, oui, j'avais déjà noté ton lien dans l'autre topic de même que j'ai déjà lu
    http://www.asiplease.net/computing/d..._component.htm
    http://docs.embarcadero.com/products...nDrawCell.html
    http://delphi.about.com/library/bluc/text/uc052102a.htm
    http://www.delphi-central.com/tutori...mory_game.aspx
    + Le supplément pdf gratuit de Mastering Delphi 5 sur les graphiques...

    Mais bon, à chaque fois les explications sur le sujet ne sont que partielles et me laissent toujours avec des questions...

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 932
    Billets dans le blog
    6
    Par défaut
    Il suffit à chaque tour de conserver l'ancienne position du joueur pour la repeindre en blanc, et de repeindre sa case destination dans sa couleur.
    Toutes les autres restent blanches.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Membre confirmé Avatar de Simicro
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Mai 2012
    Messages : 136
    Par défaut
    Entendu Yves, je vais essayer cette approche.

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

Discussions similaires

  1. Demande de test bénévole sur algorithme de cryptage
    Par Marlan dans le forum Sécurité
    Réponses: 2
    Dernier message: 02/11/2011, 12h01
  2. [JUnit] Les tests sur des interfaces graphiques
    Par adilo dans le forum Tests et Performance
    Réponses: 5
    Dernier message: 01/02/2006, 14h27
  3. Demandes d'informations divers sur SGBD
    Par AlexB59 dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 26/05/2005, 12h41
  4. Test if sur des float
    Par Minuit dans le forum Linux
    Réponses: 2
    Dernier message: 26/03/2005, 13h08
  5. Réponses: 7
    Dernier message: 18/08/2004, 15h08

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