Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > Programmation multimédia/Jeux
Programmation multimédia/Jeux Forum d'entraide sur la 2D, 3D, video, son, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 16/09/2011, 21h06   #1
jean-pat
Nouveau Membre du Club
 
Inscription : mars 2009
Messages : 89
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 89
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
.
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:
Citation:
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.
jean-pat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 22h43   #2
josmiley
Membre chevronné
 
Homme
Inscription : avril 2004
Messages : 677
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 677
Points : 730
Points : 730
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.
josmiley est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 23h11   #3
jean-pat
Nouveau Membre du Club
 
Inscription : mars 2009
Messages : 89
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 89
Points : 33
Points : 33
même message ...
jean-pat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2011, 00h31   #4
josmiley
Membre chevronné
 
Homme
Inscription : avril 2004
Messages : 677
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 677
Points : 730
Points : 730
RenderPlain n'est pas documenté :s
josmiley est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2011, 08h04   #5
PauseKawa
Expert Confirmé
 
Avatar de PauseKawa
 
Homme Patrice BLANGARIN
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 650
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 650
Points : 3 776
Points : 3 776
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.
PauseKawa est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/09/2011, 11h25   #6
josmiley
Membre chevronné
 
Homme
Inscription : avril 2004
Messages : 677
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 677
Points : 730
Points : 730
Bien vu !
josmiley est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2011, 15h37   #7
jean-pat
Nouveau Membre du Club
 
Inscription : mars 2009
Messages : 89
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 89
Points : 33
Points : 33
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é?
jean-pat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2011, 15h59   #8
PauseKawa
Expert Confirmé
 
Avatar de PauseKawa
 
Homme Patrice BLANGARIN
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 650
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 650
Points : 3 776
Points : 3 776
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.
PauseKawa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2011, 16h22   #9
PauseKawa
Expert Confirmé
 
Avatar de PauseKawa
 
Homme Patrice BLANGARIN
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 650
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 650
Points : 3 776
Points : 3 776
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.
PauseKawa est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 10h06.


 
 
 
 
Partenaires

Hébergement Web