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

Bibliothèques tierces Python Discussion :

Glissé déposé avec Pygame


Sujet :

Bibliothèques tierces Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Glissé déposé avec Pygame
    Bonjour,

    Je tente de créer une petite interface graphique à l'aide de la bibliothèque Pygame.
    Je débute un peu en programmation et j'attaque un truc un peu costaud ... Je souhaiterai pouvoir déplacer une petite image sur mon interface à l'aide de la souris. J'ai tenté de programmer ça à part dans une autre fenêtre et avec un peu d'aide sur le net et sur le site de Pygame j'y suis parvenu. Mais avec mon programme, il faut croire que ce doit être plus subtile que ça. Si vous maitrisez Pygame et si vous pouviez me venir en aide quand à l'utilisation de telle ou telle fonction supplémentaire ce serait super !

    En vous remerciant

    Voici le programme en question.

    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
     
    import pygame
    from pygame.import*
     
    pygame.init()
     
    fenetre=pygame.display.set_mode((900,900))
     
    fond = pygame.image.load("interface.jpg").convert()
    fenetre.blit(fond, (0,0))
     
    feu = pygame.image.load("fire-icon.jpg").convert_alpha()
    pos_feu = fenetre.blit(feu, (750,600,20,20))
     
    display.update(feu)
    continuer=1
    selected=0
     
    while True:
        e= event.wait()
        if e.type == QUIT : break
        elif e.type == MOUSEMOTION and e.buttons [0]:
            ancien_pos =(e.pos[0]-e.rel[0],e.pos[1]-e.rel[1])
     
            if feu.collidepoint(ancien_pos):
                   ancien_feu = feu.copy()
                   screen.fill(0,feu)
                   feu.move_ip(e.rel)
                   screen.fill(0xff0000,feu)
                   display.update((feu))
     
    while 1:
          for event in pygame.event.get():
                if (event.type == QUIT):
                  pygame.quit()

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    feu étant une image et non un rectangle, je doute que ce code fonctionne.

    j'ai codé ça, peut-être ça peut t'aider; n'hésites pas si tu as des questions.

    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
    from pygame import *
     
     
    class Dragable(Rect,object):
     
        def __init__(self,img,**args):
            self.img = img
            Rect.__init__(self,img.get_rect(**args))
            self.selected = False
     
        def update(self,ev):
            if ev.type == MOUSEBUTTONDOWN and ev.button == 1 and self.collidepoint(ev.pos):
                self.selected = True
            elif ev.type == MOUSEBUTTONUP and ev.button == 1:
                self.selected = False
            elif ev.type == MOUSEMOTION and self.selected:
                relx,rely = ev.rel
                self.x += relx
                self.y += rely
                return True # retourne True si la position change
     
        @property
        def pos(self):
            return self.topleft
     
     
    scr   = display.set_mode((500,500))
    time.wait(200) # la faute a mon WM
     
    img = Surface((50,50)) # cree une image pour test
    img.fill(0xff0000)     # en rouge
     
    carre = Dragable(img,center=(250,250)) # # cree l'objet et le positionne
     
    scr.blit(carre.img,carre.pos) # affiche l'objet
    display.flip()
     
    while True:
        ev = event.wait()
        if carre.update(ev): # si l'objet bouge on actualise l'affichage
            scr.fill(0)
            scr.blit(carre.img,carre.pos)
            display.flip()
        if ev.type == QUIT: break

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup, mais en lançant ce programme j'obtiens le mouvement d'un cube sur l'interface par la souris comme prévu. Simplement j'ai essayé de le remanié avec difficulté et perplexité étant débutant j'ai du mal à déchiffrer toutes les actions de ce programme. Comment puis-je faire pour justement remplacer le cube par un image ?

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    via l'attribut img de l'objet Dragable.

    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
    from pygame import *
     
    class Dragable(Rect,object):
     
        def __init__(self,img,**args):
            self.img = img
            Rect.__init__(self,img.get_rect(**args))
            self.selected = False
     
        def update(self,ev):
            if ev.type == MOUSEBUTTONDOWN and ev.button == 1 and self.collidepoint(ev.pos):
                self.selected = True
            elif ev.type == MOUSEBUTTONUP and ev.button == 1:
                self.selected = False
            elif ev.type == MOUSEMOTION and self.selected:
                relx,rely = ev.rel
                self.x += relx
                self.y += rely
                return True # retourne True si la position change
     
        @property
        def pos(self):
            return self.topleft
     
     
    scr   = display.set_mode((500,500))
    time.wait(200) # la faute a mon WM
     
    feu = Dragable(image.load("fire-icon.jpg"),center=(250,250)) # # cree l'objet et le positionne
     
    scr.blit(feu.img,feu.pos) # affiche l'objet
    display.flip()
     
    while True:
        ev = event.wait()
        if feu.update(ev): # si l'objet bouge on actualise l'affichage
            scr.fill(0)
            scr.blit(feu.img,feu.pos)
            display.flip()
        if ev.type == QUIT: break

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci c'est super ! Juste une dernière question. J'ai ajouté le fond de mon interface, j'ai un peu de difficulté à le faire rester sur la fenetre quand je bouge l'image. Comment faire pour le faire rester sur la fenetre et faire bouger n'importe quelle autre image par dessus avec ton programme ?

    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
     
    from pygame import *
     
    class Dragable(Rect,object):
     
        def __init__(self,img,**args):
            self.img = img
            Rect.__init__(self,img.get_rect(**args))
            self.selected = False
     
        def update(self,ev):
            if ev.type == MOUSEBUTTONDOWN and ev.button == 1 and self.collidepoint(ev.pos):
                self.selected = True
            elif ev.type == MOUSEBUTTONUP and ev.button == 1:
                self.selected = False
            elif ev.type == MOUSEMOTION and self.selected:
                relx,rely = ev.rel
                self.x += relx
                self.y += rely
                return True # retourne True si la position change
     
        @property
        def pos(self):
            return self.topleft
     
     
    fenetre = display.set_mode((850,850))
    fond = image.load("interface.jpg").convert()
    fenetre.blit(fond, (0,0))
    feu = Dragable(image.load("fire-icon.jpg"),center=(400,400)) # cree l'objet et le positionne
    fenetre.blit(feu.img,feu.pos) # affiche l'objet
    display.flip()
     
    while True:
        ev = event.wait()
        if feu.update(ev): # si l'objet bouge on actualise l'affichage
            fenetre.fill(0)
            fond.fill(0)
            fenetre.blit(feu.img,feu.pos)
            display.flip()

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while True:
        ev = event.wait()
        if feu.update(ev): # si l'objet bouge on actualise l'affichage
            fenetre.blit(fond,(0,0))
            fenetre.blit(feu.img,feu.pos)
            display.flip()

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    un exemple avec plusieurs objets Dragables():

    http://joel-murielle.perso.sfr.fr/exemple_dragable.zip

  8. #8
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci énormément tout fonctionne à merveille !

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

Discussions similaires

  1. portabilité du code avec pygame
    Par stefff285 dans le forum Programmation multimédia/Jeux
    Réponses: 0
    Dernier message: 05/04/2009, 19h33
  2. Rafraichissement de l'image avec pygame + opengl
    Par bourriquet_42 dans le forum OpenGL
    Réponses: 1
    Dernier message: 23/03/2009, 18h22
  3. [c#][TabControl] faire un glissé-déposé
    Par Husqvarna dans le forum Windows Forms
    Réponses: 5
    Dernier message: 24/11/2006, 17h08
  4. Glissé-déposé sur .exe via l'explorateur
    Par VincentL dans le forum Delphi
    Réponses: 2
    Dernier message: 24/08/2006, 12h16

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