Python - error al detectar colisión con máscara en pygame

   
Vista:

error al detectar colisión con máscara en pygame

Publicado por 12-trunks-12 (37 intervenciones) el 27/06/2015 00:23:16
Buenas, el error es que al utilizar la función pygame.sprite.collide_mask no consigo lo que necesito.
Tengo dos sprites (que serían los jugadores) y pueden lanzar proyectiles que serían frutas. El problema es que nada más lanzar el proyectil aparece y desaparece, pues al parecer hay un choque cuando no debería haberlo.
Os enseño lo que tengo a ver si alguien sabe que estoy haciendo mal (tengo el programa dividido en módulos, os paso los que incumben el problema)


Estas son las 2 clases que uso, una la del jugador y la otra la del disparo, ambas son sprites. En jugador os podeis saltar todo y leer solo el método de atacar
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
class Jugador(pygame.sprite.Sprite):
    def __init__(self, imagen, posicion):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("imagenes/" + imagen + ".png")
        self.mask = pygame.mask.from_surface(self.image)
        self.images = []
        self.life = 500
 
        self.rect = self.image.get_rect()
        self.direccion = None
        self.salto = None
        self.moverse = None
        self.pos = posicion
 
        self.disparar = False
        self.contador_frecuencia_disparos = 10
        self.tipos_disparos = ["manzana", "platano", "melon"]
        self.tipo_disparo = self.tipos_disparos[0]
 
    def actualizar_movimiento(self):
        if self.moverse == True:
            #------------------Hacia los lados
            if self.direccion == 'izquierda':
                self.pos[0] -= 5
                if self.pos[0] <= 0:
                    self.moverse = False
                    self.pos[0] = 0
 
            elif self.direccion == 'derecha':
                self.pos[0] += 5
                if self.pos[0]+self.image.get_rect()[2] >= ANCHO_SCREEN:
                    self.moverse = False
                    self.pos[0] = ANCHO_SCREEN-self.image.get_rect()[2]
 
        #------------------Salto y gravedad
        if self.salto != None:
            self.pos[1] -= self.salto  # Salto (puede ser positivo al dar el salto o negativo cuando no le queda fuerza)
            self.salto -= 1  # Gravedad, cada vez el salto será mas pequeño y pasará a ser negativo (cuando baja)
            if self.pos[1]+self.image.get_rect()[3] >= ALTO_SCREEN:
                self.pos[1] = ALTO_SCREEN-self.image.get_rect()[3]
                self.salto = None
 
    def actualizar_frecuencia_disparos(self):
        self.contador_frecuencia_disparos += 1
        if self.contador_frecuencia_disparos >= 10:
            self.contador_frecuencia_disparos = 10
 
    def atacar(self, lista_disparos):
        if self.contador_frecuencia_disparos == 10:
            self.contador_frecuencia_disparos = 0
            if self.tipo_disparo == "manzana":
                lista_disparos.add(Disparo("manzana", self.pos, self.direccion, 5))
            elif self.tipo_disparo == "platano":
                lista_disparos.add(Disparo("platano", self.pos, self.direccion, 5))
            elif self.tipo_disparo == "melon":
                lista_disparos.add(Disparo("melon", self.pos, self.direccion, 5))
 
 
class Disparo(pygame.sprite.Sprite):
    def __init__(self, imagen, posicion, direccion_disparo, daño):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("imagenes/" + imagen + ".png").convert_alpha()
        self.mask = pygame.mask.from_surface(self.image)
        self.rect = self.image.get_rect()
 
        self.pos = [posicion[0], posicion[1]]  # No pongo directamente posicion porque sino la posición del jugador y del disparo serán SIEMPRE iguales
        self.direccion = direccion_disparo
        self.daño = daño
 
    def actualizar_movimiento(self):
        if self.direccion == 'izquierda':
            self.pos[0] -= 15
            if self.pos[0] <= 0:
                self.kill()
        elif self.direccion == 'derecha':
            self.pos[0] += 15
            if self.pos[0]+self.image.get_rect()[2] >= ANCHO_SCREEN:
                self.kill()


El módulo del juego en sí, os pongo lo que hago para disparar (me ahorro enseñaros como hago para que al pulsar la tecla correcta disparar sea True), actualizar los disparos y ver si chocan:
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
jugador1.actualizar_frecuencia_disparos()
if jugador1.disparar == True:
    jugador1.atacar(lista_disparos_j1)  # lista_disparos_j1 es un pygame.sprite.Group
 
jugador2.actualizar_frecuencia_disparos()
if jugador2.disparar == True:
    jugador2.atacar(lista_disparos_j2)  # lista_disparos_j2 es un pygame.sprite.Group
 
#--Jugador 1
for disparo in lista_disparos_j1:
    disparo.actualizar_movimiento()
     if pygame.sprite.collide_mask(disparo, jugador2) != None:
         jugador2.life -= disparo.daño
         disparo.kill()
     else:
            surface.blit(disparo.image, disparo.pos)
 
#--Jugador 2
for disparo in lista_disparos_j2:
    disparo.actualizar_movimiento()
     if pygame.sprite.collide_mask(disparo, jugador1) != None:
         jugador1.life -= disparo.daño
         disparo.kill()
     else:
            surface.blit(disparo.image, disparo.pos)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

error al detectar colisión con máscara en pygame

Publicado por 12-trunks-12 (37 intervenciones) el 27/06/2015 22:36:43
Duda terminada, todavía no se porque me funcionaba mal pero cambié el atributo self.pos de jugador por self.rect.x y self.rect.y y funcionó bien.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de xve

error al detectar colisión con máscara en pygame

Publicado por xve (1235 intervenciones) el 28/06/2015 09:35:37
Gracias por comentarlo!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar