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

  1. #1
    Membre du Club
    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
    Points : 46
    Points
    46
    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 chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    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 chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    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 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 300
    Points
    11 300
    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 chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    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 du Club
    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
    Points : 46
    Points
    46
    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?

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    non, ça marche mais le temps de réaction de la souris est long.
    toi, c'est le déplacement de ton bonhomme... à voir
    code ci-joint :
    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
     
    type
      TForm1 = class(TForm)
        carte: TImage;
        cache: TImage;
        procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      procedure deplace(x,y:integer);
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    color:=clblack;
    windowstate:=wsmaximized;
     
     
    with carte do begin
    Align:=alclient;
    picture.Bitmap.LoadFromFile('Chemin\carte.bmp');
    stretch:=true;
    visible:=false;
    end;
     
    with cache do begin
    width:=100;
    height:=100;
    end;
     
    end;
     
    procedure Tform1.deplace(x,y:integer);
    begin
    cache.Canvas.CopyRect(cache.ClientRect,carte.Canvas,rect(x-50,y-50,x+50,y+50));
    end;
     
    procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
    deplace(x,y);
    cache.Left:=x-50;
    cache.Top:=y-50;
    end;
     
    end.
    le onmousemove sur carte (Timage) ne fonctionne pas.

    sinon, j'avais essayé aussi, un cache, en dessinant dans un bitmap un rectangle noir centré sur x et y et j'utilise copymode (cmsrcErase)
    je copie la carte avec le complémentaire du rectangle noir...
    si bien que j'obtiens un masque qui s'ajoute à l'image.
    mais,c'est encore lent comme réaction lors d'un déplacement souris par exemple.

    voilà

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 300
    Points
    11 300
    Billets dans le blog
    6
    Par défaut
    la technique à utiliser dépend aussi du rythme et de l'ampleur des déplacements

    si Nord/Sud/Est/Ouest avec un pas fixé, il doit falloir préparer 4 bitmaps correspondant aux déplacements possibles, et afficher la bonne carte quand elle est prête

    si déplacement libre, pê avoir un Bitmap plus grand (150*150 pe) et afficher le 100*100 qui va bien, tout en rechargeant le 150*150 correspondant afin d'avoir une demi-longueur d'avance ?

    il y a un forum jeux, sur developpez.com : fais-y un tour
    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 !

  9. #9
    Membre du Club
    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
    Points : 46
    Points
    46
    Par défaut
    J'ai renoncé à ce procédé pour afficher la carte, je n'arrive pas à trouver de solution...
    En attendant qu'une éventuelle solution se profile, j'ai prédécoupé la carte originale en 4 sous cartes avec paint shop pro, puis j'appelle ces images par un bête loading selon la zone de la carte dans lequel se trouve le joueur. Par l'appui sur une touche, le joueur peut passer de la carte générale à une des 4 cartes locales.
    Le problème n'est donc pas résolu, mais contourné... Si quelqu'un trouve quelque chose, merci de le poster

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    la première solution que je t'ai proposée avec les bitmaps marche nickel.
    elle est un peu plus lourde, c'est tout.
    tu as testé ?

  11. #11
    Membre du Club
    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
    Points : 46
    Points
    46
    Par défaut
    Archimède : En fait, je n'aime pas utiliser un code que je ne comprends pas. Il me faut du temps pour digérer (et je dois dire que j'ai du mal) ce que tu as posté, d'abord parce que je débute en delphi, ensuite parce que je n'ai jamais fait d'application graphique de ma vie...

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    Citation Envoyé par sys1 Voir le message
    Archimède : En fait, je n'aime pas utiliser un code que je ne comprends pas...
    Ok, en fait, il n'y a rien de compliqué, tout est dans le copyrect.

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