IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Blog de Gilles Vasseur - Pascal et compagnie

Les transitions entre images sous Lazarus avec BGRABitmap (V) - Introduction de la vitesse

Noter ce billet
par , 22/03/2018 à 08h56 (821 Affichages)
L'application de test est opérationnelle, mais nous manquons de maîtrise des paramètres d'affichage. Dans ce court billet, nous nous attacherons à la régulation de la vitesse d'affichage des transitions.

Introduction de la vitesse

En matière de vitesse, deux cas sont à examiner suivant la rapidité de traitement et d'affichage des outils graphiques utilisés : utilisation de la LCL standard ou mise en œuvre de la bibliothèque BGRABitmap.

Avec la LCL, il est fort à parier que l'accélération sera nécessaire : on pourra par exemple supprimer l'instruction d'attente (sleep) et diminuer le nombre d'étapes d'affichage en incrémentant le pas fStep d'un nombre supérieur à 1. Toutefois, il faudra prendre garde à la limite fixée à 100. En effet, seuls les diviseurs de 100 conviendront comme pas : 1, 2, 4, 5, 10, 20, 25, 50. D'autres valeurs sont possibles, mais au prix d'une vérification de la limite et de l'achèvement de la transition. Il va sans dire que les pas supérieurs à 20 ne seront pas pertinents pour l'affichage, car plus le pas sera élevé plus l'affichage sera saccadé.

Avec BGRABitmap, le problème est au contraire une trop grande rapidité d'exécution ! Pour s'en convaincre, il suffit de reprendre l'exemple précédent avec notre première transition et de retirer la procédure sleep. Heureusement, la maîtrise de la vitesse en est grandement simplifiée puisque nous n'aurons qu'à jouer sur le paramètre fourni à sleep pour ralentir ou accélérer l'affichage.

Dans notre fiche principale, nous allons introduire une nouvelle propriété nommée Speed qui renverra vers un champ privé fSpeed :

Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 private
    fBGRAFrom, fBGRATo: TBGRABitmap;
    fStep: Byte;
    fSpeed: Byte; // vitesse
    procedure SetSpeed(AValue: Byte);
  public
    property Speed: Byte read fSpeed write SetSpeed default C_DefaultSpeed;
  end;

La constante C_DefaultSpeed vaudra 80 : elle fixe la valeur par défaut de la vitesse. Elle sera déclarée au début de l'unité, avant la fiche :

Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
const
  C_DefaultSpeed = 80; // vitesse par défaut
 
type
 
  { TMainForm }
 
  TMainForm = class(TForm)

En général, il est préférable d'éviter les constantes numériques codées en dur dans le code. En effet, le changement d'une valeur grâce à une constante nommée sera immédiatement propagé dans tout le code qui sera par ailleurs bien plus lisible.

La méthode SetSpeed pourra ressembler à ceci :

Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
procedure TMainForm.SetSpeed(AValue: Byte);
// *** détermination de la vitesse ***
begin
  if fSpeed = AValue then
    Exit;
  fSpeed := AValue;
end;

Notons que cette méthode est inutile dans l'état puisqu'elle n'effectue pas de traitements spécifiques sur le champ interne fSpeed. Cependant, l'éventuelle introduction de tests comme le déclenchement d'un gestionnaire (OnSpeedChange, par exemple) se fera par ce biais sans effort particulier.

À présent que la vitesse est accessible en tant que propriété, il reste à l'utiliser à la place de la constante fournie à la procédure sleep :

Code pascal : 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
25
26
27
procedure TMainForm.btnGoClick(Sender: TObject);
// *** dessin ***
var
  LBGRATemp: TBGRABitmap;
  LY, LX: Integer;
begin
  btnGo.Enabled := False;
  LBGRATemp := TBGRABitmap.Create(imgResult.ClientWidth, imgResult.ClientHeight, BGRABlack);
  try
    LX := 0;
    LY := 0;
    fStep := 0;
    repeat
      Inc(fStep);
      LBGRATemp.FillRect(ClientRect, BGRABlack);
      LBGRATemp.PutImage(0, 0, fBGRAFrom, dmSet);
      // traitement ici...
      LBGRATemp.PutImage(LX, LY, fBGRATo, dmDrawWithTransparency);
      LBGRATemp.Draw(imgResult.Canvas, 0, 0);
      imgResult.Repaint;
      sleep(100 - fSpeed); // changement ici
    until fStep = 100;
  finally
    LBGRATemp.Free;
    btnGo.Enabled := True;
  end;
end;

Plus la vitesse augmente moins le paramètre fourni à sleep doit être élevé, d'où la soustraction.
Il ne faut pas oublier de mentionner la valeur par défaut de cette vitesse dans le gestionnaire de création de la fiche et d'adapter la propriété Position par défaut du composant tbarSpeed :

Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
procedure TMainForm.FormCreate(Sender: TObject);
// *** construction des objets de travail ***
begin
  Caption := rsTestName;
  fBGRAFrom := TBGRABitmap.Create(imgFrom.Picture.Bitmap);
  fBGRAFrom := fBGRAFrom.Resample(imgResult.ClientWidth, imgResult.ClientHeight) as TBGRABitmap;
  fBGRATo := TBGRABitmap.Create(imgTo.Picture.Bitmap);
  fBGRATo := fBGRATo.Resample(imgResult.ClientWidth, imgResult.ClientHeight) as TBGRABitmap;
  fSpeed := C_DefaultSpeed; // vitesse
  tbarSpeed.Position:= Speed;
end;

Dans notre exemple, il nous faut aussi gérer le changement de vitesse via le composant tbarSpeed, ce qui est très facile si nous considérons le gestionnaire OnChange qui lui est associé. Nous double-cliquons dans l'inspecteur d'objets sur l'événement correspondant du composant et nous fournissons le code suivant pour le traitement :

Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
procedure TMainForm.tbarSpeedChange(Sender: TObject);
// *** changement de vitesse ***
begin
  Speed := tbarSpeed.Position;
end;

Il ne reste qu'à réintroduire notre transition de test dans le gestionnaire OnClick de notre unique bouton*:

Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
// traitement ici...
      LY := - imgResult.ClientHeight + imgResult.ClientHeight * fStep div 100; // OVERDOWN

Nous pouvons désormais régler la vitesse de transition en jouant avec le curseur du composant tbarSpeed.

La prochaine étape consistera à la prise en charge de la transparence !

Envoyer le billet « Les transitions entre images sous Lazarus avec BGRABitmap (V) - Introduction de la vitesse » dans le blog Viadeo Envoyer le billet « Les transitions entre images sous Lazarus avec BGRABitmap (V) - Introduction de la vitesse » dans le blog Twitter Envoyer le billet « Les transitions entre images sous Lazarus avec BGRABitmap (V) - Introduction de la vitesse » dans le blog Google Envoyer le billet « Les transitions entre images sous Lazarus avec BGRABitmap (V) - Introduction de la vitesse » dans le blog Facebook Envoyer le billet « Les transitions entre images sous Lazarus avec BGRABitmap (V) - Introduction de la vitesse » dans le blog Digg Envoyer le billet « Les transitions entre images sous Lazarus avec BGRABitmap (V) - Introduction de la vitesse » dans le blog Delicious Envoyer le billet « Les transitions entre images sous Lazarus avec BGRABitmap (V) - Introduction de la vitesse » dans le blog MySpace Envoyer le billet « Les transitions entre images sous Lazarus avec BGRABitmap (V) - Introduction de la vitesse » dans le blog Yahoo

Mis à jour 22/03/2018 à 22h47 par gvasseur58

Catégories
Programmation , Free Pascal , Lazarus , Graphisme

Commentaires