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 :

Deux images superposées dans une grande image


Sujet :

Delphi

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Deux images superposées dans une grande image
    Bonjour, je souhaite faire une pièce avec une porte, qui cette porte sera animé plus tard (D'où l'utilisation de deux images..)

    Pour cela j'ai crée deux images

    Timage1 = La porte
    Timage2 = Le background ( C'est la pièce avec tout les éléments de déco etc.)

    Je voudrais que l'image 1 sois superposée à l'image 2 mais qu'on puisse quand même voir l'image 2.

    >> Le problème c'est que j'ai rendu l'image 1 en premier plan et l'image 2 en arrière plan, mais quand je lance l'appli bah, j'ai bien l'image 1 en premier plan, donc la porte, mais avec le fond d'écran blanc...

    Ici : J'ai mis l'image 1 en premier plan, la porte est bien la mais y'a t'il un moyen de mettre la couleur du background en transparent afin de voir l'appart ?
    Nom : Porte.png
Affichages : 278
Taille : 9,7 Ko

    Image 2 sans la porte..
    Nom : Sans titre.png
Affichages : 308
Taille : 28,8 Ko



    Le code pour la porte :


    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
     uses unit1;
      procedure Tform2.Timer2Timer(Sender: Tobject);
     
     begin
        WindowState := wsMaximized;
     
        with form2.Image1.Canvas do
        begin
     
     
     
    brush.color:=clLtgray;
                                       // Porte gauche
     
     
    polygon ( [Point(1224,501), Point(1224,300), Point(1312,354) ,Point(1312,555) ]);
     
                                       // Porte droite  
     
    polygon ( [ Point(1400,405), Point(1400,609), Point(1312,555), Point(1312,354) ]);
     
     
        end;

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 705
    Points : 25 575
    Points
    25 575
    Par défaut
    Il te suffit de mettre un Transparent à True dans le TImage

    Sinon, au lieu de la faire Ainsi
    Tu mets ton Background dans un TBitmap
    Dans le OnPaint d'un TPaintBox tu dessine ce TBitmap (ou dans un bitmap temporaire, comme le fait DirectDraw avec le switch surface, c'est le principe de double ou triple bufferred)
    Tu dessine tes portes directement dans le PaintBox ensuite (ou dans un Second Bitmap avec une copy BitBlt avec une couleur de transparence)

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Il te suffit de mettre un Transparent à True dans le TImage

    > Les deux images sont dans un timer qui s'actualise toutes les X secondes.

    J'ai mis l'image 1 en transparent via l'inspecteur d'objet mais ça ne change rien à part le faite que l'image 2 apparaît tout les 1 secondes pour disparaître ensuite.
    Du coup on à bien la fusion mais pendant X Ms et toutes les 1 secondes.. :/

    Je vais voir pour la deuxième méthode néanmoins j'ai jamais fais cette méthode :/


    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
    unit Unit2;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls, Buttons, jpeg;
     
    type
      TForm2 = class(TForm)
        Image2: TImage;
        Timer2: TTimer;
        BitBtn1: TBitBtn;
        Image1: TImage;
        procedure Timer2Timer(Sender: Tobject);
        procedure BitBtn1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form2: TForm2;
     
    implementation
     
      uses unit1;
      procedure Tform2.Timer2Timer(Sender: Tobject);
     
     
      begin
        WindowState := wsMaximized;
     
        with form2.Image1.Canvas do
        begin
     
                   //Porte Centrale
     
    brush.color:=clLtgray;
                                       // Porte gauche Centrale
     
     
    polygon ( [Point(1224,501), Point(1224,300), Point(1312,354) ,Point(1312,555) ]);
     
                                       // Porte droite  Centrale
     
    polygon ( [ Point(1400,405), Point(1400,609), Point(1312,555), Point(1312,354) ]);
     
     
        end;
     
     
    with form2.Image2.Canvas do
        begin
      {$R *.dfm}
     
     
                                 ETC ETC (Reste du code sans importance)

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 444
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 444
    Points : 5 864
    Points
    5 864
    Par défaut
    salut

    la succession d'images va vite te limiter car très gourmand en ressource
    par définition les affichage se font dans les méthodes "paint" tu peut très bien
    prédéfinir tes éléments selon diverses actions mais essai au maximum de regrouper tes actions d'affichage au même endroit
    rien que pour la maintenance de ton code tu nous remerciera

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Re bonjour,

    J'ai retravaillé mon code est tout "fonctionne"

    Mais j'ai une autre question :

    Sur ma porte centrale, j'ai crée deux bitmap : Un bitmap de la porte gauche et un autre bitmap de la porte droite.
    Avec un timer que j'ai réglé à deux secondes et à false j'aimerai que tout les 2 seconde la porte gauche, ce décale de -1 en Width/Heigh/top/left etc afin qu'elle puissent s'ouvrir

    Comment faire ?


    Code de la porte :
    Je me suis inspiré de quelque exemple d'internet afin de faire mon code, donc il y'a sans doute des fonctions inutiles. :/
    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
    with portedroite do
                begin
                      Width := 1936;
                      Height := 1001;
                      Transparent := TRUE;
                      TransparentColor := clWhite;
                end;
    with portedroite.Canvas do
                begin
                      Brush.Color := clWhite;
                      FillRect(Rect(0, 0, portedroite.Width, portedroite.Height));
    //***********************************************
     brush.color:=clLtgray;
     // Porte droite  Centrale
     
                         polygon ( [ Point(1400,405), Point(1400,609), Point(1312,555), Point(1312,354) ]);
                 end;
    end;
     
    Canvas.Draw(0, 0, portedroite);
     
              portedroite.Free;
    Code du timer..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    procedure TForm1.PorteTimer(Sender: TObject);
    begin
     
    for i:=1 to 10 do
    Begin
    Inc (i);
    portedroite.Width := portedroite.Width-1; // Une idée pour cette ligne?
    end;
    En faite j'aimerai corriger la ligne portedroite.width ( donc on récupère la valeur en width ) puis on la remplace par cette valeur et on fait le -1

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    si tes images sont aussi basiques, laisse tomber les bitmap et travaille directement avec le canvas

    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
     
    unit Unit1;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;
     
    type
      TForm1 = class(TForm)
        Timer1: TTimer;
        procedure FormCreate(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure FormPaint(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    type
      TCanvasHelper = class helper for TCanvas
        procedure Wall(x, y, w, h, delta: Integer);
        procedure Ground(x, y, w, h: Integer);
      end;
     
    procedure TCanvasHelper.Wall(x: Integer; y: Integer; w: Integer; h: Integer; delta: Integer);
    var
      p: array[0..3] of TPoint;
    begin
      p[0].X := x;
      p[0].Y := y - h;
      p[1].X := x + w;
      p[1].Y := y - h + delta * w div 2;
      p[2].X := x + w;
      p[2].Y := y + delta * w div 2;
      p[3].X := x;
      p[3].Y := y;
      Polygon(p);
    end;
     
    procedure TCanvasHelper.Ground(x: Integer; y: Integer; w: Integer; h: Integer);
    var
      p: array[0..3] of TPoint;
    begin
      p[0].X := x;
      p[0].Y := y;
      p[1].X := x + w;
      p[1].Y := y - w div 2;
      p[2].X := x + w + h;
      p[2].Y := y + (h - w) div 2;
      p[3].X := x + h;
      p[3].Y := y + h div 2;
      Polygon(p);
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      DoubleBuffered := True;
      Timer1.Interval := 40;
    end;
     
    procedure TForm1.FormPaint(Sender: TObject);
    var
      t: Int64;
      w: Integer;
    begin
      with Canvas do
      begin
        // Fond d'écran
        Brush.Color := clSkyBlue;
        FillRect(ClientRect);
     
        // Sol
        Brush.Color := clMoneyGreen;
        Ground(200, 400, 320, 200);
     
        // Murs du fond
        Brush.Color := clMaroon;
        Wall(200, 400, 320, 100, -1);
        Wall(200 + 320, 400 - 160, 200, 100, +1);
     
        // Porte
        Brush.Color := clSkyBlue;
        Wall(200 + 320 + 50, 400 - 160 + 25, 50, 80, +1);
     
        Brush.Color := clSilver;
        t := GetTickCount;
        w := Round(25 * Abs(Sin(t * PI/1800)));
        Wall(200 + 320 + 50, 400 - 160 + 25, w, 80, +1);
        Wall(200 + 320 + 50 + 50 - w, 400 - 160 + 25 + ( 50 - w ) div 2, w, 80, +1);
     
        // Murs devant
        Brush.Style := bsClear;
        Wall(200 + 200, 400 + 100, 320, 100, -1);
        Wall(200, 400, 200, 100, +1);
      end;
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      Invalidate;
    end;
     
    end.

Discussions similaires

  1. [FPDF] PDF avec une grande image de fond
    Par Gyl59 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 19/11/2007, 20h00
  2. Affichage d'une grande image dans un composite SWT
    Par Jibouze70 dans le forum SWT/JFace
    Réponses: 3
    Dernier message: 09/07/2007, 12h51
  3. Affichage d'une grande image découpée
    Par cyril_sy dans le forum SDL
    Réponses: 6
    Dernier message: 03/11/2006, 23h03
  4. [IHM]afficher une grande image
    Par hansaplast dans le forum wxWidgets
    Réponses: 5
    Dernier message: 02/06/2006, 15h59
  5. Découpage d'une grande image vers des textures
    Par djar dans le forum OpenGL
    Réponses: 14
    Dernier message: 26/02/2005, 19h46

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