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

 
Vista:
sin imagen de perfil

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
sin imagen de perfil

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
Val: 2.239
Plata
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

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

Publicado por xve (1646 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