Forum FunLabyrinthe

Le jeu de labyrinthe fun et gratuit - Retour au site

  • Vous n'êtes pas connecté.

#1 mars 14, 2011 20:49:39

intello
De : Yvelines
Enregistré : 2010-07-25
Messages : 167
Réputation: +  9  -
Profil  

La boucle

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.


========================================
Pas, Flèches rapides, Flèches masquées, Impossible par Maxime, Elévateurs & Terrains vides,
Jeu de boutons

Admirez mes jeux de flèches, de téléporteurs , d'escaliers , de pas ou de boutons !


Notez ces labyrinthes

Hors-ligne

#2 mars 15, 2011 00:15:28

sjrd
De : Belgique
Enregistré : 2010-04-11
Messages : 481
Réputation: +  14  -
Profil   Envoyer un courriel  

La boucle

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.


---
Sébastien Doeraene
Auteur de FunLabyrinthe

Hors-ligne

#3 mars 15, 2011 16:13:17

intello
De : Yvelines
Enregistré : 2010-07-25
Messages : 167
Réputation: +  9  -
Profil  

La boucle

C'est exactement ça , merci.


========================================
Pas, Flèches rapides, Flèches masquées, Impossible par Maxime, Elévateurs & Terrains vides,
Jeu de boutons

Admirez mes jeux de flèches, de téléporteurs , d'escaliers , de pas ou de boutons !


Notez ces labyrinthes

Hors-ligne

#4 mars 16, 2011 17:37:02

intello
De : Yvelines
Enregistré : 2010-07-25
Messages : 167
Réputation: +  9  -
Profil  

La boucle

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 .


========================================
Pas, Flèches rapides, Flèches masquées, Impossible par Maxime, Elévateurs & Terrains vides,
Jeu de boutons

Admirez mes jeux de flèches, de téléporteurs , d'escaliers , de pas ou de boutons !


Notez ces labyrinthes

Hors-ligne

#5 mars 16, 2011 17:37:35

intello
De : Yvelines
Enregistré : 2010-07-25
Messages : 167
Réputation: +  9  -
Profil  

La boucle

En étant séparé par des intervalle de temps .


========================================
Pas, Flèches rapides, Flèches masquées, Impossible par Maxime, Elévateurs & Terrains vides,
Jeu de boutons

Admirez mes jeux de flèches, de téléporteurs , d'escaliers , de pas ou de boutons !


Notez ces labyrinthes

Hors-ligne

#6 mars 17, 2011 00:13:39

sjrd
De : Belgique
Enregistré : 2010-04-11
Messages : 481
Réputation: +  14  -
Profil   Envoyer un courriel  

La boucle

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).


---
Sébastien Doeraene
Auteur de FunLabyrinthe

Hors-ligne

#7 mars 17, 2011 17:59:35

intello
De : Yvelines
Enregistré : 2010-07-25
Messages : 167
Réputation: +  9  -
Profil  

La boucle

Merci , tout marche super bien ! Mais j'ai du remplacer les Notification Message par des Dispatch Message.


========================================
Pas, Flèches rapides, Flèches masquées, Impossible par Maxime, Elévateurs & Terrains vides,
Jeu de boutons

Admirez mes jeux de flèches, de téléporteurs , d'escaliers , de pas ou de boutons !


Notez ces labyrinthes

Hors-ligne

#8 mars 18, 2011 09:03:29

intello
De : Yvelines
Enregistré : 2010-07-25
Messages : 167
Réputation: +  9  -
Profil  

La boucle

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 ?


========================================
Pas, Flèches rapides, Flèches masquées, Impossible par Maxime, Elévateurs & Terrains vides,
Jeu de boutons

Admirez mes jeux de flèches, de téléporteurs , d'escaliers , de pas ou de boutons !


Notez ces labyrinthes

Hors-ligne

#9 mars 18, 2011 12:48:13

sjrd
De : Belgique
Enregistré : 2010-04-11
Messages : 481
Réputation: +  14  -
Profil   Envoyer un courriel  

La boucle

Il n'est pas possible de retirer une seule image du Painter.

Par contre, tu peux l'effacer entièrement :
Painter.Clear;


---
Sébastien Doeraene
Auteur de FunLabyrinthe

Hors-ligne

#10 mars 18, 2011 12:58:08

sjrd
De : Belgique
Enregistré : 2010-04-11
Messages : 481
Réputation: +  14  -
Profil   Envoyer un courriel  

La boucle

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;


---
Sébastien Doeraene
Auteur de FunLabyrinthe

Hors-ligne

Pied de page

Modération

Powered by DjangoBB

Lo-Fi Version