-
Notifications
You must be signed in to change notification settings - Fork 0
/
utiles.py
167 lines (91 loc) · 4.54 KB
/
utiles.py
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
import sys
import pygame
# Módulo de útilidades para el programa en general.
# Aquí hay funciones que pueden ser importadas desde cualquier otro modulo
def cargar_imagenes(lista_nombres):
# Carga las imagenes entregadas en lista_nombres
# Devuelve un diccionario con cada imagen cargada
imagenes = {}
for nombre_archivo in lista_nombres:
# |= <- union
# .rsplit(".", 1) <- separa un string en el primer punto que encuentre, empezando por la derecha
imagenes |= {nombre_archivo.rsplit(".", 1)[0]: pygame.image.load("imagenes/" + nombre_archivo)}
return imagenes
def cargar_sonido(nombres):
# nombres -> string - lista
# Carga los sonidos entregados en nombres
# Devuelve una lista/objeto con cada sonido cargado
if isinstance(nombres, list): # si se entrego una lista
sonidos = []
for nombre_archivo in nombres:
sonidos.append(pygame.mixer.Sound("sonidos/" + nombre_archivo))
return sonidos
else: # si es un string
return pygame.mixer.Sound("sonidos/" + nombres)
def coordenadas(posicion):
#Devuelve la posición en coordenadas para la pantalla del juego (en px)
x, y = posicion
return x*65, y*65
def centro_topleft(surf, x, y):
# Recibe las coordenadas centrales de algún objeto Surface de pygame
# Devuelve las coordenadas de la esquina superior-izquierda
w, h = surf.get_size()
return (x - w//2, y - h//2)
def aparecer(pantalla, clock, tiempo=1, sonido=None, delay=0):
# realiza una transicion de pantalla: circulo expandiendose
surf = pygame.Surface((1083, 650), flags=pygame.SRCALPHA) # mascara oscura
imagen_congelada = pantalla.copy() # imagen inmediatamente anterior a la transicion
radio = 0
cambio = 632/(60*tiempo) # cambio necesario para que la transicion dure el tiempo dado
espera = delay*60 # espera antes de comenzar la animacion
# Efecto de sonido
if (not sonido is None) and delay == 0:
sonido.play()
# Bucle que dura el tiempo dado
for i in range(int((tiempo + delay)*60)):
espera = max(espera - 1, 0) # descuento de la espera
if (not sonido is None) and espera == 1:
sonido.play()
for event in pygame.event.get():
if event.type == pygame.QUIT: # Boton de salida presionado
pygame.quit()
sys.exit()
# DIBUJO
# Relleno de la mascara, fondo negro sin transparencia mas un círculo transparente
surf.fill((0, 0, 0, 255))
pygame.draw.circle(surf, (0,0,0,0), (1083//2, 650//2), int(radio))
# dibujado de pantallas con la máscara encima
pantalla.blit(imagen_congelada, (0, 0))
pantalla.blit(surf, (0, 0))
# Refrezco de pantalla
pygame.display.flip()
clock.tick(60)
# si la espera es 0, comienza la animacion
if espera == 0:
radio = min(radio + cambio, 632) # actualizacion del radio
def desaparecer(pantalla, clock, tiempo=1, sonido=None, delay=0):
# realiza una transicion de pantalla: circulo contrayendose
surf = pygame.Surface((1083, 650), flags=pygame.SRCALPHA)
imagen_congelada = pantalla.copy()
radio = 632 # Radio mas pequeño fuera de pantalla
cambio = 632/(60*tiempo) # cambio necesario para que la transicion dure el tiempo dado
# Efecto de sonido
if not sonido is None:
sonido.play()
# Bucle que dura el tiempo dado
for i in range(int((tiempo+delay)*60)):
for event in pygame.event.get():
if event.type == pygame.QUIT: # Boton de salida presionado
pygame.quit()
sys.exit()
# DIBUJO
# Relleno de la mascara, fondo negro sin transparencia mas un círculo transparente
surf.fill((0, 0, 0, 255))
pygame.draw.circle(surf, (0,0,0,0), (541, 325), int(radio))
# dibujado de pantallas con la máscara encima
pantalla.blit(imagen_congelada, (0, 0))
pantalla.blit(surf, (0, 0))
# Refrezco de pantalla
pygame.display.flip()
clock.tick(60)
radio = max(radio - cambio, 0) # actualizacion del radio