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.