Bonjour,
le probleme que j'ai est que je veux afficher mon sprite en mode transparence (couleur noire de mon sprite doit être transparente).
j'ai repris du code trouvé sur internet que j'ai simplifié pour une question de comprehension. je voulais comprendre le principe utilisé pour afficher un srpite. Le programme affiche une image de fond et un bmp en guise de sprite qui suit la souris quand on actionne le bouton de la souris.
je l'ai quelque peu modifié pour afficher un BMP en tant que sprite. Tout cela fonctionne très bien sauf la transaprence !
Où est-ce que je fais une erreur ?

Merci d'avance pour les explications.

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
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
unit Udraw;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls;
type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure PaintBox1Paint(Sender: TObject);
  private
    procedure dessinecurseur;
  end;

  Tcurseur = record
     drawing : boolean; // en cours de déplacement
     rr  : trect;            // rectangle position courante
     rro : trect;           // rectangle ancienne position
     RECsprite : Trect;  // le rectangle correspondant a BMPSprite
  end;

var
  Form1: TForm1;
  H, W : integer;             // hauteur et largeur de la paintbox
  BmpFond : Tbitmap;      // bitmap de fond
  BmpMemoire : Tbitmap;  // bitmap memoire pour preparation dessin a afficher
  BMPsprite : Tbitmap;    // le bitmap que je veux deplacer avec la souris
                                 // et qui comporte dans son milieu de la couleur noire
                                 // que je voudrais rendre transparente
  cc : Tcurseur;            // pour la gestion du bitmap BMPSprite

implementation
{$R *.DFM}

//------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
  H := paintbox1.height;
  W := paintbox1.width;
  cc.drawing := false;
  cc.rr := rect(50, 50, 150, 150); // definition d'un premier emplacement
                                             // pour le nouveau rectangle
  cc.rro := cc.rr;                       // position courante du spprite devient
                                             // l'ancienne position

  BmpFond := Tbitmap.create;     // bitmap de fond
  BmpFond.width  := W;
  BmpFond.height := H;
  BmpFond.LoadFromFile('fond.bmp');// fond.bmp=500x333 16 millions couleurs

  BmpMemoire := tbitmap.create;
  BmpMemoire.assign(BmpFond);      // copie de BmpFond sur BmpMemoire

  BMPsprite := Tbitmap.Create;
  BMPsprite.LoadFromFile('bitmap.bmp'); // chargement de l'image du sprite
  BMPsprite.PixelFormat := pf32bit;
  // c'est là que je determine la transparence mais cela ne marche pas.
  // je voudrais que tout le noir de mon sprite devienne transparent
  // j'ai fabriqué ce sprite avec image éditeur de delphi :
  // bitmap.bmp = 100x100 256 couleurs  
  BMPsprite.Transparent := true;
  BMPsprite.TransparentColor := rgb(0,0,0); // couleur noire

  cc.RECsprite.Left := 0;
  cc.RECsprite.Top := 0;
  cc.RECsprite.Right := BMPsprite.Width;
  cc.RECsprite.Bottom := BMPsprite.Height;

  dessinecurseur;  // affichage du premier sprite à la position de départ
end;
//------------------------------------------------------------
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
form1.paintbox1.Canvas.Draw(0,0,BmpMemoire);
end;
//------------------------------------------------------------
Procedure Tform1.dessinecurseur;
var
  Runion: Trect;
begin
  BmpMemoire.canvas.copyrect(cc.rro, BmpFond.canvas,cc.rro);
  BmpMemoire.Canvas.CopyRect(cc.rr,BMPsprite.canvas,cc.RECsprite);
  Unionrect(Runion, cc.rro, cc.rr);
  form1.paintbox1.canvas.copyrect(Runion, BmpMemoire.canvas, Runion);
  cc.rro := cc.rr;
end;
//------------------------------------------------------------
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Var
  p : tpoint;
begin
  p.x := X;  p.y := Y;
  if ptinrect(cc.rr, p) then
  begin
    cc.drawing := true;
    cc.rr := rect(x, y, x+100, y+100); //100 = largeur et hauteur de BMPSprite
  end;
  dessinecurseur;
end;
//------------------------------------------------------------
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  IF cc.drawing then
  begin
     cc.rr := rect(x, y, x+100, y+100);
     dessinecurseur;
  end;
end;
//------------------------------------------------------------
procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  IF cc.drawing then
  begin
    cc.rr := rect(x, y, x+100, y+100);
    dessinecurseur;
    cc.drawing := false;
  end;
end;
//------------------------------------------------------------
procedure TForm1.FormDestroy(Sender: TObject);
begin
  BmpFond.free;
  BmpMemoire.free;
  BMPSprite.Free;
end;
end.