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

Programmation multimédia/Jeux Python Discussion :

collision entre groupe de sprites (pygame)


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 91
    Points : 65
    Points
    65
    Par défaut collision entre groupe de sprites (pygame)
    Bonjour,

    Dans mon script j'ai deux groupes de sprites. Le premier contient des sprites qui peuvent etre déplacés à la souris, le deuxième contient des sprites immobiles matérialisés par des carrés rouges[ame="http://www.youtube.com/watch?v=zc6kLqH4pjU"]video[/ame].
    Je souhaite détecter la collision d'un sprite du premier groupe avec un de ceux du deuxième. Le but est de classer les chromosomes selon le carré dans lequel on les place.
    Comme il peut y en avoir beaucoup (des chromosomes ou des carrés) j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    collision=pygame.sprite.groupcollide(allcategories,allsprites,False,False)
    Mais il y a un bug:
    Traceback (most recent call last):
    File "/home/claire/Applications/ProjetPython/sprite/Chimp Modif/DragDropTwoChrom-Classif.py", line 161, in <module>
    if __name__ == '__main__': main()
    File "/home/claire/Applications/ProjetPython/sprite/Chimp Modif/DragDropTwoChrom-Classif.py", line 155, in main
    collision=pygame.sprite.groupcollide(allcategories,allsprites,False,False)
    File "/usr/lib/python2.6/dist-packages/pygame/sprite.py", line 1388, in groupcollide
    c = SC(s, groupb, dokillb, collided)
    File "/usr/lib/python2.6/dist-packages/pygame/sprite.py", line 1337, in spritecollide
    spritecollide = sprite.rect.colliderect
    AttributeError: 'tuple' object has no attribute 'colliderect'
    mon script est le suivant:
    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
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    # -*- coding: utf-8 -*-
    """
    Created on Mon Sep  5 15:44:42 2011
     
    @author: jean-pat
    """
    #!/usr/bin/env python
    #
    import os, pygame
    from pygame.locals import*
     
    def load_image(name, colorkey=None):
        fullname=os.path.join("data", name)
        try:
            image=pygame.image.load(fullname)
        except pygame.error, message:
            print "Impossible de charger l'image:",name
            raise SystemExit, message
        image = image.convert()
        if colorkey is not None:
            if colorkey is -1:
                colorkey = image.get_at((0, 0))
            image.set_colorkey(colorkey, RLEACCEL)
        return image, image.get_rect()
     
    class Ichrom(pygame.sprite.Sprite):
        def __init__(self,image,initpos):
            pygame.sprite.Sprite.__init__(self)
            self.pos = initpos
            self.image,self.rect=image
            #self.rect=self.image.get_rect()
            print "self.rect",self.rect,"-self.image:",self.image
     
            self.button=(0,0,0)#mouse buttons not pressed
            #self.selected = 0
            self.mouseover=False
            self.focused=False
            #self.rect=initpos
            print "init chrom at ",self.pos
        def rollover(self):
            """Test if the mouse fly over the chromosome 
            self.mouseover==True if mouse flying over the chrom,
            False if not"""
            mpos=pygame.mouse.get_pos()#mouseposition
            #test if mouse roll over the sprite
            if self.rect.collidepoint(mpos):
                self.mouseover=True
            else:
                self.mouseover=False
        def update(self):
            self.button=pygame.mouse.get_pressed()
            mpos = pygame.mouse.get_pos()
            self.selected=self.rect.collidepoint(mpos)
            #the mouse flies over a chromosome
            if (self.mouseover):
                #print "mouse pos:",mpos
                if self.button==(1,0,0):     # )  
                    pos = pygame.mouse.get_pos()
                    self.rect.center = pos
     
    class Classifier(pygame.sprite.Sprite):
        '''When a chrom is moved is moved into a category '''
        def __init__(self,initpos,category):
            pygame.sprite.Sprite.__init__(self)
            self.category=category
            self.image = pygame.Surface((100,100))
            self.image.set_colorkey((0,0,0))
            self.image = self.image.convert_alpha()
            #pygame.draw.rect(screen, color, (x,y,width,height), thickness)
            pygame.draw.rect(self.image, (255,0,0,255), (0,0,100,100),1)
            self.rect= initpos
            #self.rect= self.image.get_rect()
        def update(self): 
            pass        
            #self.pos = (10,10)
            #pygame.draw.rect(self.image, (255,0,0,255), (10,50,100,100),2)
        def trainClassifier(self):
            """the particles moved inside the square are set into one
            category"""
            pass
     
    def main():
        pygame.init()
        screen = pygame.display.set_mode((320,300))
        pygame.display.set_caption("Karyotyper")
        pygame.mouse.set_visible(True)
     
        background = pygame.Surface(screen.get_size())
        background = background.convert()
        background.fill((0, 0, 0))
     
        screen.blit(background,(0, 0))
        pygame.display.flip()
     
        i1=load_image("/home/claire/Applications/ImagesTest/jp/Jpp48/13/DAPI/particules/part15.png", -1)
        i2=load_image("/home/claire/Applications/ImagesTest/jp/Jpp48/13/DAPI/particules/part12.png", -1)
        chr1 = Ichrom(i1,(0,0))
        #chr1 = Krom(i1,(0,0))
        chr2=Ichrom(i2,(30,30))
        #chr2=Krom(i2,(30,30))
        categ1=Classifier((5,150),"single")
        categ2=Classifier((110,150),"overlapping")
        categ3=Classifier((215,150),"other stuff")
     
        allsprites = pygame.sprite.RenderPlain((chr1,chr2))
        allcategories=pygame.sprite.RenderPlain((categ1,categ2,categ3))
        clock = pygame.time.Clock()
     
        while 1:
            clock.tick(60)
            for event in pygame.event.get():
                if event.type == QUIT:
                    return
                elif event.type == KEYDOWN and event.key == K_ESCAPE:
                    return
                if event.type ==pygame.MOUSEBUTTONDOWN:
                    #need to be modified to handle a list of chromosomes
                    chr1.rollover()
                    chr2.rollover()
     
            allsprites.update()
            allcategories.update()
            ##
            ##Search which chromosome is moved
            ##into which category and classify  
            ##that chromosome in that category
            collision=pygame.sprite.groupcollide(allcategories,allsprites,False,False)
            screen.blit(background,(0,0))
            allsprites.draw(screen)
            allcategories.draw(screen)
            pygame.display.flip()
     
    if __name__ == '__main__': main()
    Au passage, il y a un petit problème de position initiale des chromosomes.

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 046
    Points : 1 376
    Points
    1 376
    Par défaut
    Je ne connias pas la class Sprite, mais ...

    essayes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    collision=pygame.sprite.groupcollide(allcategories,allsprites,False,None)
    ou enlèves carrement le dernier argument.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 91
    Points : 65
    Points
    65
    Par défaut
    même message ...

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 046
    Points : 1 376
    Points
    1 376
    Par défaut
    RenderPlain n'est pas documenté :s

  5. #5
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Je ne connais pas pygame mais votre problème viens de la classe Classifier et plus précisément de self.rect = initpos*.
    Comme je ne connais pas pygame j'aurais utiliser votre code (#self.image.get_rect()) et écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            self.rect = self.image.get_rect()
            self.rect.topleft = initpos
    Je ne doute pas que vous trouverez mieux.
    Pour ce qui est de la position initiale des chromosomes c'est le même souci : self.rect.
    En utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            self.rect.topleft = initpos
    Cela fonctionne.

    @+

    Edit: *Comprendre que vous écrasez l'objet pygame.Rect self.rect par le tuple initpos.
    Merci d'utiliser le forum pour les questions techniques.

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 046
    Points : 1 376
    Points
    1 376
    Par défaut
    Bien vu !

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 91
    Points : 65
    Points
    65
    Par défaut
    Impec,
    merci bien PauseKawa.

    Pour quelqu'un qui ne connait pas pygame ...

    Il y a quelque chose de bizarre avec pygame ou avec ipython (sous spyder 2):

    Quand je tape :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pygame.surface.Surface.
    Il y a une fenetre qui s'ouvre et qui indique toute les méthodes dont get_rect().

    Mais si je tape:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pygame.surface.Surface.get_rect.
    La fenêtre ne s'ouvre plus pour me montrer les méthodes/variables dispo pour cet objet. Dans le cas présent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pygame.surface.Surface.get_rect.topleft
    Qu'est-ce que j'ai loupé?

  8. #8
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Vous m'en demandez beaucoup
    Et bien si je m'en réfère à votre code get_rect est une méthodes et topleft un attribut de l'objet retourné par cette méthode (qui existe sans aucun doute avant mais dont get_rect() permet d'avoir une référence).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    objrect = obj.get_rect()
    objrect.topleft = untruc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> dir(pygame.surface.Surface.get_rect)
    ['__call__', '__class__', '__delattr__', '__doc__', '__format__', '__get__', '__getattribute__', '__hash__', '__init__', '__name__', '__new__', '__objclass__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
    >>> # Pas de topleft
    J'espère ne pas trop me planter...

    @+
    Merci d'utiliser le forum pour les questions techniques.

  9. #9
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Re,

    Citation Envoyé par jean-pat Voir le message
    Pour quelqu'un qui ne connait pas pygame ...
    Normal, ce n'était pas une erreur de pygame mais de Python
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    spritecollide = sprite.rect.colliderect
    AttributeError: 'tuple' object has no attribute 'colliderect'
    Il suffisait de trouver l'objet sprite.rect remplacé par un tuple
    Merci d'utiliser le forum pour les questions techniques.

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

Discussions similaires

  1. [Phaser] Soucis de collision entre 2 sprites
    Par counteraccro dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 21/01/2015, 17h54
  2. Implémenter une collision entre sprites
    Par HelpIsNeeded dans le forum Android
    Réponses: 0
    Dernier message: 16/01/2015, 16h16
  3. collision entre un sprite d'une classe et un vector2d liste
    Par kate59 dans le forum Développement 2D, 3D et Jeux
    Réponses: 7
    Dernier message: 22/04/2008, 00h10
  4. Réponses: 4
    Dernier message: 25/09/2004, 10h58

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