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


0