Rechercher - Liste des utilisateurs
Version complète : La boucle
Accueil » FunDelphi » La boucle
1
intello
Je connais le principe d'une boucle : elle fait quelque chose en illimité ou alors jusqu'à ce que ... .

Et justement j'avais besoin d'une boucle qui faisait quelque chose dès qu'on commence le labyrinthe jusqu'à ce qu'il se finisse.

J'ai déja vu dans tes codes le mot while ; peux tu m'expliquer comment la boucle s'utilisent en fundelphi .

Si possible m'illustrer cela avec un code fnd.
sjrd
La boucle while permet de répéter un portion de code (fnd) plusieurs fois de suite (sans interruption), tant qu'une condition est vraie. Sa forme générale est la suivante :
while Condition do
begin
  Instructions;
end;

On peut, en quelque sorte, la traduire avec des if comme ceci :
// DébutWhile
if not Condition do
  // Saute à FinWhile

Instructions;

// Saute à DébutWhile
// FinWhile

Généralement, on veut que la boucle s'arrête au bout d'un moment. Par exemple, cette boucle fait clignoter le joueur 5 fois :
var
  I: Integer;
begin
  I := 0;
  while I < 5 do
  begin
    Player.Hide;
    Sleep(100);
    Player.Show;
    Sleep(100);
    Inc(I);
  end;
end;

Note l'utilisation de Inc(I), qui va augmenter I de 1 à chaque tour de boucle. Ceci finira donc par rendre fausse la condition I < 5, ce qui arrêtera la boucle.

Maintenant, je ne pense pas qu'une boucle while soit adaptée à ton problème. En effet, une boucle while doit rester dans le cadre d'une méthode (un on..do).

Ce que tu veux, il me semble, c'est un événement récurrent, qui se produit par exemple toutes les 500 ms. Pour ça il faut utiliser les timers, avec des ScheduleNotificationMsg comme dans les MovingMonsters.
intello
C'est exactement ça , merci.
intello
Je ne suis finalement pas sûr que cela convienne ; en effet il me faudrait un ScheduleNotificationMsg qui permettrait de faire un coup un truc et un coup un autre .
intello
En étant séparé par des intervalle de temps .
sjrd
Oui, je me disais aussi. Alors il faut faire quelque chose de ce style-ci :
messages // à remplacer par des noms explicites
  DoSomething1: TNotificationMsg = $61;
  DoSomething2: TNotificationMsg = $62;

components // pareil
  MonTrucAFaire: TMonTrucAFaire;

component TMonTrucAFaire
  hint 'Gestion du truc à faire';

  on message DoSomething1 do
  begin
    FaireQuelqueChose1;

    Master.Timers.ScheduleNotificationMsg(1000, Self, msgDoSomething2);
  end;

  on message DoSomething2 do
  begin
    FaireQuelqueChose2;

    Master.Timers.ScheduleNotificationMsg(2000, Self, msgDoSomething1);
  end;
end;

procedure GameStarted(Master: TMaster) private;
begin
  Master.Timers.ScheduleNotificationMsg(500, MonTrucAFaire, msgDoSomething1);
end;

end.

Non testé. Mais il y a des exemples de ça dans Trains, dans le source Railways.fnd, avec les feux de signalisation (TRailsLight).
intello
Merci , tout marche super bien ! Mais j'ai du remplacer les Notification Message par des Dispatch Message.
intello
Est -il possible d'effacer une image du painter avec une commande fundelphi?
Si oui peux-tu me donner toutes les commandes du Painter (Painter.truc) stp ?
sjrd
Il n'est pas possible de retirer une seule image du Painter.

Par contre, tu peux l'effacer entièrement :
Painter.Clear;
sjrd
En fait, le Painter n'a que 3 commandes qui permettent de le modifier : Clear et AddImage, que tu connais. Ainsi qu'une commande AddImageRect qui permet d'ajouter un sous-rectangle d'une image :
Painter.AddImageRect('HRef/De/l-image', Rect(30, 60, 60, 90));

va ajouter le rectangle de coordonnées 30,60 jusque 60,90 comme image au Painter. C'est quasiment jamais utilisé. À la base j'ai dû inventer ça pour gérer le fichier Cases.bmp des versions < 5.0.

Il existe d'autres commandes dans le Painter, mais qui permettent seulement de lire son état. Il y a par exemple :
- Painter.StaticDraw vaut True ssi l'image est non animée (c'est False pour l'eau, par exemple)
- Painter.Size est un Point qui représente la taille du Painter. Donc Painter.Size.X et Painter.Size.Y sont respectivement la largeur et la hauteur du peintre en pixels (souvent c'est 30x30)
- Painter.IsEmpty vaut True ssi le peintre est vide (il n'y a aucune image)

Il y a finalement un truc qui peut servir dans certains cas :
var
  Bitmap: TBitmap32;
begin
  Bitmap := Painter.GetBitmap;
  // Bitmap vaut soit nil, soit un bitmap qui représente la composition de toutes les images du peintre.
end;
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB