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 :

Afficher un morceau d'image


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 130
    Par défaut Afficher un morceau d'image
    Je suis toujours en train de créer mon petit jeu d'aventure...
    Bon, alors voilà, dans le jeu, il y a une carte au format jpg de dimension
    1000X1000, et comme il n'est bien sûr pas question de l'afficher entière, il me faudrait un moyen de n'en afficher qu'une partie en définissant par exemple le coin en haut à gauche depuis lequel elle est dessinée dans une Timage de dimension 100X100 :

    En gros, il me faudrait une fonction ressemblant à ça, même si les coordonnées ne sont pas acceptées ici :
    Form1.Image2.Picture.LoadFromFile(x,y, 'C:\SW TEST\Images\Carte.jpg');

    Si tout se passait comme je le voudrais, il y aurait dans ma Timage la partie de la carte correspondant à x,y pour le coin en haut à gauche, et x+100, y+100 pour le coin en bas à droite (puisque la Timage dans laquelle est affichée l'image fait 100X100)

  2. #2
    Membre Expert
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Par défaut
    Pourquoi ne pas charger ta carte dans un bitmap au format bmp que tu n'afficheras pas. Créer un second bitmap et utiliser copyrect avec un rect destination de 100x100 paramétrer en fonction de x et y qui permettra de n'afficher qu'une partie de l'image.
    je n'ai pas essayé mais c'est une idée...
    à toi de voir

  3. #3
    Membre Expert
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Par défaut
    excuse, c'est sur le rect source autant pour moi ... lol

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 934
    Billets dans le blog
    6
    Par défaut
    chaque carré de terrain doit-il suivre le déplacement du joueur, comme un masque à déplacer sur l'image, ou affiches-tu carré par carré ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre Expert
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Par défaut
    je te propose une solution qui n'est pas bien écrite mais qui a le mérite de fonctionner : à toi d'optimiser...
    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
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;
     
    type
      TForm1 = class(TForm)
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormPaint(Sender: TObject);
        procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      largeur,hauteur:integer;
      bmp,buff,diaphragme:Tbitmap;
      procedure creebmp(w,h:integer;out bitmap:Tbitmap);
      procedure deplace(x,y:integer);
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    width:=screen.Width;
    height:=screen.Height;
    position:=poscreencenter;
    largeur:=form1.ClientWidth;
    hauteur:=form1.ClientHeight;
     
     
    bmp:=Tbitmap.Create;
    with bmp do begin
    width:=largeur;
    height:=hauteur;
    end;
     
    buff:=Tbitmap.create;
    buff.Assign(bmp);
     
    bmp.LoadFromFile('Chemin carte.bmp');
     
    diaphragme:=Tbitmap.create;
    with diaphragme do begin
    width:=100;
    height:=100;
    end;
     
    end;
     
    procedure Tform1.deplace(x,y:integer);
    begin
    diaphragme.Canvas.CopyRect(rect(0,0,100,100),bmp.Canvas,rect(x-50,y-50,50+x,50+y));
    end;
     
    procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
    deplace(x,y);
    with buff.Canvas do begin
    brush.Color:=clblack;
    fillrect(form1.clientrect);
    Draw(x-50,y-50,diaphragme);
    end;
    canvas.draw(0,0,buff);
    end;
     
    procedure Tform1.creebmp(w,h:integer;out bitmap:Tbitmap); //ne sert à rien; j'ai essayé mais ça ne marche pas à voir...
    begin
    bitmap:=Tbitmap.Create;
    width:=w;
    height:=h;
    end;
     
     
     
    procedure TForm1.FormPaint(Sender: TObject);
    begin
    canvas.draw(0,0,buff);
    end;
     
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    bmp.Free;
    buff.Free;
    diaphragme.Free;
    end;
     
    end.
    j'ai tenté le coup avec un Timage qui contient la carte au format bmp.
    stretch à true
    je mets image1.visible à false.
    je fais un copyrect dans un second timage (à 100x100)
    même méthode que précédente pour le copyrect.
    et dans le onmousemove, je déplace mon image2 en faisant left:=x-50 et
    top:=y-50 mais ça ne marche pas...
    pourtant la solution était plus simple

    voilà, à toi de voir...

    un conseil, fais un cache plus grand que 100x100 et fais un zoom dessus.
    avec copyrect c'est simple.

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 130
    Par défaut
    Merci pour vos réponses, je vais tenter de voir si ça marche ce soir...

    Tourlourou : C'est le premier cas : chaque carré de terrain doit suivre le déplacement du joueur, comme un masque à déplacer sur l'image.

    Archimère : "j'ai tenté le coup avec un Timage qui contient la carte au format bmp.
    stretch à true
    je mets image1.visible à false.
    je fais un copyrect dans un second timage (à 100x100)
    même méthode que précédente pour le copyrect.
    et dans le onmousemove, je déplace mon image2 en faisant left:=x-50 et
    top:=y-50 mais ça ne marche pas...
    pourtant la solution était plus simple"

    Peut-être que quand le curseur de la souris est sur les bords de l'image, les coordonnées left et top sont négatives?

Discussions similaires

  1. Afficher un morceau d'image
    Par Wendy-Kelly dans le forum Débuter
    Réponses: 6
    Dernier message: 28/06/2012, 13h16
  2. Afficher tout type d'image (gif ,png, jpg...)
    Par jfb53 dans le forum C++Builder
    Réponses: 22
    Dernier message: 20/07/2005, 14h52
  3. [MF] : Afficher control par dessus image
    Par DarkWiken dans le forum MFC
    Réponses: 2
    Dernier message: 01/04/2005, 22h06
  4. MFC + Afficher et modifier une image
    Par os dans le forum MFC
    Réponses: 4
    Dernier message: 07/03/2005, 19h20
  5. Afficher et comparer 2 images bitmap
    Par leplusnul dans le forum MFC
    Réponses: 2
    Dernier message: 12/01/2004, 16h54

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