Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Nouveau Membre du Club
    Inscrit en
    mars 2009
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : mars 2009
    Messages : 91
    Points : 33
    Points
    33

    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 :
    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 :
    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 chevronné
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 750
    Points : 785
    Points
    785

    Par défaut

    Je ne connias pas la class Sprite, mais ...

    essayes:

    Code :
    collision=pygame.sprite.groupcollide(allcategories,allsprites,False,None)
    ou enlèves carrement le dernier argument.

  3. #3
    Nouveau Membre du Club
    Inscrit en
    mars 2009
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : mars 2009
    Messages : 91
    Points : 33
    Points
    33

    Par défaut

    même message ...

  4. #4
    Membre chevronné
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 750
    Points : 785
    Points
    785

    Par défaut

    RenderPlain n'est pas documenté :s

  5. #5
    Expert Confirmé Avatar de PauseKawa
    Homme Profil pro Patrice BLANGARIN
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    juin 2006
    Messages
    2 720
    Détails du profil
    Informations personnelles :
    Nom : Homme Patrice BLANGARIN
    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 720
    Points : 3 599
    Points
    3 599

    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 :
    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 :
            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 chevronné
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 750
    Points : 785
    Points
    785

    Par défaut

    Bien vu !

  7. #7
    Nouveau Membre du Club
    Inscrit en
    mars 2009
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : mars 2009
    Messages : 91
    Points : 33
    Points
    33

    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 :
    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 :
    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 :
    pygame.surface.Surface.get_rect.topleft
    Qu'est-ce que j'ai loupé?

  8. #8
    Expert Confirmé Avatar de PauseKawa
    Homme Profil pro Patrice BLANGARIN
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    juin 2006
    Messages
    2 720
    Détails du profil
    Informations personnelles :
    Nom : Homme Patrice BLANGARIN
    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 720
    Points : 3 599
    Points
    3 599

    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 :
    1
    2
    objrect = obj.get_rect()
    objrect.topleft = untruc
    Code :
    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 Patrice BLANGARIN
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    juin 2006
    Messages
    2 720
    Détails du profil
    Informations personnelles :
    Nom : Homme Patrice BLANGARIN
    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 720
    Points : 3 599
    Points
    3 599

    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 :
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •