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 :

Déplacer image dans jeu de plateau


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Points : 16
    Points
    16
    Par défaut Déplacer image dans jeu de plateau
    Bonjour à tous,

    Je commence à développer un jeu de plateau, dans lequel, le joueur devra déplacer ses pions en le glissant avec la souris, de la même manière que pour les jeux de dames ou d'échecs.

    J'ai placé mes images (plateau et pions) dans des TImages regroupées dans un TPanel, pour calculer mes coordonnées par rapport à 0 et non par rapport au bord de la fenête. J'avais entendu parler d'une méthode plus élégante, mais j'ai oublié de quoi il s'agit. Si vous avez d'autres manières de faire, je suis intéressé.

    Mon problème et que lorsque je déplace un pion avec la méthode:
    procedure TForm1.PionDragDrop(Sender, Source: TObject; X, Y: Integer);
    les coordonnées X et Y référencent l'endroit sur le pion où j'ai cliqué. Ce qui ne m'avance pas à grand chose. Je voudrais connaitre la position du click sur le plateau de jeu, c'est-à-dire, sur mon panel qui coincide avec le plateau, pour savoir sur quel pion j'ai clické, et gérer le déplacement.

    Merci de m'aider pour cette question qui , je l'avoue, n'est pas d'un niveau bien élevé.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Lors d'un évènement DragDrop (puisque ça a l'air d'être comme ça) l'évènement te fournis deux objets en paramètres : Sender qui est l'objet sur lequel on a cliqué mais aussi Source qui est l'objet initiateur du DragDrop (soit l'objet sur lequel tu as cliqué initialement). A partir de là tu devrais être capable de faire ce que tu veux en castant l'objet Source.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  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
    si ce sont les coord par rapport à la form, tu déduis :
    x-panel1.clientorigin.x
    y-panel1.clientorigin.y
    regarde du côté de clientorigin...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    J'ai essayé vos solutions, mais je n'y arrive toujours pas.

    J'ai compris que Sender est mon pion, et que Source est un TObject parent du pion. Vous m'arrêtez si je me trompe.

    Mais toujours est-il que je n'ai pas les coordonées de l'endroit ou le pion a été relâché sur le plateau (TImage) ou le panel.

    Désolé, je ne fais pas exprès, j'ai cherché en plus.

  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
    tu peux toujours essayer quelque chose comme ça :
    (tu l'adaptes pour tous tes timages....)

    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
     
      private
        { Déclarations privées }
        xs,ys,imleft,imtop:integer;
        autorisation:boolean;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
     
    procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
    xs:=x;
    ys:=y;
    imleft:=image1.Left;
    imtop:=image1.Top;
    autorisation:=true;
    end;
     
    procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
    if autorisation then
                     begin
                     panel1.DoubleBuffered:=true;
                     image1.Left:=imleft+x-xs;
                     image1.top:=imtop+y-ys;
                     caption:='('+inttostr(x)+','+inttostr(y)+')';
    end;
    end;
     
    procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
    autorisation:=false;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    image1.Enabled:=false;//sinon tu ne déplaces pas.
    end;
     
    end.
    avec draganddrop, je n'ai pas regardé...
    sinon mon code fonctionne.

  6. #6
    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
    rq: il faut évident rajouter une condition ...
    En effet, il faut que ta souris survole un timage spécifique pour autoriser le déplacement.
    Avec cette méthode, à toi de voir, because je n'ai pas le temps...
    désolé.

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kawasaki Voir le message
    J'ai compris que Sender est mon pion, et que Source est un TObject parent du pion. Vous m'arrêtez si je me trompe.
    Non, lors d'un drag & drop tu commences par cliquer sur ton pion puis tu déplace ta souris et tu relâche. A partir du moment où tu relâche ton évènement DragDrop se produit. A ce moment là Sender est le composant tu lequel tu as lâché la souris et le Source est par contre le composant sur lequel tu avais cliqué à l'origine et débuté le Drag&Drop. Par contre pour les coordonnées je ne me rappelle plus par rapport à quoi elles sont (la fiche, le composant cible, etc...) faudrait regarder l'aide ou tester.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    Merci pour tes éclaircissements Guymelef.

    Je crois avoir trouver mon erreur grâce à ton exemple, Archimède. J'ai écrit ma méthode DragAndDrop qui se déclenche sur un évènement de mes pions. C'est pour ça que je ne peut pas récupérer lles coordonnées du clic sur le plateau. Je dois écrire cette méhode, ou une semblable, sur un évènement de mon image plateau ou mieux, de mon panel.

    Après, pour gérer le déplacement des pions il y a plusieurs solutions:
    - intercepter MouseDown puis MouseUp,
    - gérer un DragAndDrop,
    - ...
    J'imagine qu'il y en a encore d'autres. Pouvez vous me dire quelle solution est la plus élégante, ou la plus courament utilisée dans ce genre de programme (jeu de plateau).

    Encore merci pour votre aide.

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Moi je dirais que le Drag&Drop reste le plus logique dans cette situation puisque tu prends un pion sur une case pour le déplacer vers une autre.

    Pour tes pions tu dois positionner la propriété DragMode à dmAutomatic pour indiquer qu'une action de Drag&Drop doit effectivement démarrer lorsque l'utilisateur tente cette action. Ne définir cette propriété que pour les pions afin d'éviter que l'utilisateur puisse drager tout et n'importe quoi.

    Sur tes éléments pouvant recevoir le "drop" d'un pion tu dois positionner ton évènement OnDragDrop et faire le nécessaire pour transférer un pion d'une case vers une autre.

    Note qu'en plus du OnDragDrop les composants possèdent également un évènement OnDragOver, cet évènement permet d'indiquer au système si l'élément qui est en train d'être droppé peut l'être effectivement ou pas (dans ce cas le curseur change en un rond barré). Cet évènement est également à définir sur les cibles et doivent positionner le paramètre retour Accept de l'évènement à True (si tant est que ça doive être le cas).

    Voila j'espère t'avoir un peu plus éclairé.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    Merci beaucoup pour toutes ces explications Guymelef, c'est limpide. Tout marche bien maintenant.
    L'erreur venait du fait que je faisais un DragDrop sur mes pion au lieu du plateau.

  11. #11
    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
    sinon, si tu veux pour compléter ma méthode qui est une autre approche...
    avec le nombre de Timage que tu veux :

    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
     
    type
      TForm1 = class(TForm)
        Panel1: TPanel;
        Image1: TImage;
        Image2: TImage;
        procedure FormCreate(Sender: TObject);
        procedure Panel1MouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Déclarations privées }
        autorisation:boolean;
        xs,ys,imleft,imtop,nbimage,indice:integer;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var i:integer;
    begin
    xs:=x;
    ys:=y;
    for i:=1 to 2 do   //pour 2 Timages par exemple( tu en mets autant que tu veux)
    if ptinrect(rect(Timage(Findcomponent('image'+inttostr(i))).left,Timage(Findcomponent('image'+inttostr(i))).top,Timage(Findcomponent('image'+inttostr(i))).left+Timage(Findcomponent('image'+inttostr(i))).width,Timage(Findcomponent('image'+inttostr(i))).top+Timage(Findcomponent('image'+inttostr(i))).height),point(x,y)) then
       begin
       imleft:=Timage(Findcomponent('image'+inttostr(i))).Left;
       imtop:=Timage(Findcomponent('image'+inttostr(i))).Top;
       indice:=i;
       autorisation:=true;
       end;
    end;
     
    procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
    if autorisation then
                     begin
                     panel1.DoubleBuffered:=true;
                     Timage(Findcomponent('image'+inttostr(indice))).Left:=imleft+x-xs;
                     Timage(Findcomponent('image'+inttostr(indice))).top:=imtop+y-ys;
                     caption:='('+inttostr(x)+','+inttostr(y)+')';
    end;
    end;
     
    procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
    autorisation:=false;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    image1.Enabled:=false;
    image2.Enabled:=false;
    end;
     
     
    end.
    je l'avais complété...
    plutôt que ça tombe aux oubliettes..
    si ça peut servir éventuellement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Choix de résolution d'image dans un jeu
    Par Khrono dans le forum Création de jeux vidéo
    Réponses: 2
    Dernier message: 03/10/2011, 09h15
  2. Déplacer image dans un répertoire
    Par Santcho dans le forum Linux
    Réponses: 2
    Dernier message: 08/06/2010, 20h59
  3. Déplacer une image dans un panel
    Par Night_Wolf1619 dans le forum Débuter
    Réponses: 1
    Dernier message: 09/05/2010, 17h43
  4. déplacer Image dans un JPanel
    Par Tyver dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 09/12/2007, 22h32
  5. Déplacer une image dans un formulaire
    Par WITER dans le forum IHM
    Réponses: 2
    Dernier message: 01/11/2007, 03h47

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