-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
269 lines (206 loc) · 7.3 KB
/
main.py
File metadata and controls
269 lines (206 loc) · 7.3 KB
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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
"""
Main de "invasión espacial" - Programa día 10
"""
import pygame
import random
import math
from pygame import mixer
# Inicializar pygame
pygame.init()
# VARIABLES PYGAME - Ajustes del juego
# Crear pantalla
pantalla = pygame.display.set_mode(size=(1200, 900))
# Título
pygame.display.set_caption("Invasion espacial")
# Icono
icono = pygame.image.load("img/ovni.png")
pygame.display.set_icon(icono)
# Imagen de fondo
img_fondo = pygame.image.load("img/Penasolana_ajustada.jpg")
# Agregar música
mixer.music.load('sound/MusicaFondo.mp3')
mixer.music.set_volume(0.2)
mixer.music.play(-1)
# VARIABLES DEL JUGADOR
# # Cargar imagen del cohete
img_jugador = pygame.image.load("img/cohete.png")
# # Ajustar posición inicial
JUGADOR_X = 568
JUGADOR_Y = 800
# # Ajustar posición con cambios
JUGADOR_X_CAMBIO = 0
JUGADOR_Y_CAMBIO = 0
# VARIABLES DE UNA LISTA DE ENEMIGOS
# # Cargar imagen del enemigo
img_enemigo = []
# # Ajustar posición inicial random
ENEMIGO_X = []
ENEMIGO_Y = []
# # Ajustar posición con cambios
ENEMIGO_X_CAMBIO = []
ENEMIGO_Y_CAMBIO = []
CANTIDAD_ENEMIGOS = 8
for e in range(CANTIDAD_ENEMIGOS):
# VARIABLES DE UN ENEMIGO
# # Cargar imagen del enemigo
img_enemigo.append(pygame.image.load("img/enemigo.png"))
# # Ajustar posición inicial random
ENEMIGO_X.append(random.randint(0, 1136))
ENEMIGO_Y.append(random.randint(0, 300))
# # Ajustar posición con cambios
ENEMIGO_X_CAMBIO.append(0.6)
ENEMIGO_Y_CAMBIO.append(50)
# VARIABLES DE LA BALA
# # Cargar imagen del bala
img_bala = pygame.image.load("img/bala.png")
# # Ajustar posición inicial random
BALA_X = 0
BALA_Y = 810
# # Ajustar posición con cambios
BALA_X_CAMBIO = 0
BALA_Y_CAMBIO = 2
# # Ajustar visibilidad de la bala
BALA_VISIBLE = False
# VARIABLES PUNTUACIÓN, DECORACIÓN Y TEXTOS
PUNTAJE = 0
TEXTO_X = 10
TEXTO_Y = 10
FUENTE = pygame.font.Font('fonts/invaders.from.space.ttf', 32)
FUENTE2 = pygame.font.Font('fonts/game_over.ttf', 64)
# FUENTE2 = pygame.font.Font('freesansbold.ttf', 32) # Fuente que se incluye en pygame
FUENTE3 = pygame.font.Font('fonts/game_over.ttf', 256)
# FUNCIONES
def jugador(eje_x, eje_y):
""" Función para el jugador """
# blit es para arrojar a la pantalla
pantalla.blit(img_jugador, (eje_x, eje_y))
def enemigo(eje_x, eje_y, ene):
""" Función para el enemigo """
# blit es para arrojar a la pantalla
pantalla.blit(img_enemigo[ene], (eje_x, eje_y))
def disparar_bala(eje_x, eje_y):
""" Función para el enemigo """
# Necesitamos acceder a la función global de visibilidad
global BALA_VISIBLE
BALA_VISIBLE = True
# blit es para arrojar a la pantalla
# # Se le suma a los ejes el valor para que
# # la bala quede en medio de la nave
pantalla.blit(img_bala, (eje_x + 16, eje_y + 10))
def hay_colision(eje_x_objeto1, eje_y_objeto1, eje_x_objeto2, eje_y_objeto2):
""" Calculo de la distancia entre dos objectos
en un plano de coordenadas
mediante la mítica fórmula de los videojuegos
D = sqrt[(x2 - x1)*2 + (y2 - y1)*2 ]
"""
distancia = math.sqrt(math.pow(eje_x_objeto2 - eje_x_objeto1, 2) +
math.pow(eje_y_objeto2 - eje_y_objeto1, 2))
if distancia < 27:
return True
else:
return False
def mostrar_puntuación(eje_x, eje_y):
""" Mostrar puntuación """
texto = FUENTE.render(f'R B D J T', True, (
0, 0, 0))
pantalla.blit(texto, (eje_x + 1000, eje_y))
texto_2 = FUENTE2.render(f'Puntos: {PUNTAJE}', True, (0, 0, 0))
pantalla.blit(texto_2, (eje_x, eje_y))
def texto_final():
texto_3 = FUENTE3.render(f'GAME OVER', True, (0, 0, 0))
pantalla.blit(texto_3, (300, 250))
# LOOP DEL JUEGO
# Es la columna vertebral del juego
# que está constantemente ejecutandose.
SE_EJECUTA = True
while SE_EJECUTA:
# Ponemos un color al fondo de la pantalla
pantalla.fill((205, 144, 220))
pantalla.blit(img_fondo, (0, 0))
# Introduccimos los eventos a iterar
# Un evento será cualquier acción o interacción con el juego
for evento in pygame.event.get():
# Evento clicar al aspa para cerrar
if evento.type == pygame.QUIT:
SE_EJECUTA = False
# EVENTO DE UNA TECLA PRESIONADA
if evento.type == pygame.KEYDOWN:
# Evento si la tecla presionada es flecha izquierda
if evento.key == pygame.K_LEFT:
JUGADOR_X_CAMBIO = -1
# Evento si la tecla presionada es flecha derecha
if evento.key == pygame.K_RIGHT:
JUGADOR_X_CAMBIO = 1
# Evento si la tecla presionada es espacio
if evento.key == pygame.K_SPACE:
sonido_disparo = mixer.Sound('sound/disparo.mp3')
sonido_disparo.set_volume(0.3)
sonido_disparo.play()
if not BALA_VISIBLE:
BALA_X = JUGADOR_X
disparar_bala(BALA_X, BALA_Y)
# Evento si la tecla presionada es Escape
if evento.key == pygame.K_ESCAPE:
SE_EJECUTA = False
# EVENTO SOLTAR UNA TECLA PRESIONADA
if evento.type == pygame.KEYUP:
if evento.key == pygame.K_LEFT or evento.key == pygame.K_RIGHT:
JUGADOR_X_CAMBIO = 0
# APLICAR EL CAMBIO DE COORDENADAS QUE PROVOCA LAS TECLAS
# Y CONTROL DEL MOVIMIENTO
# JUGADOR
JUGADOR_X += JUGADOR_X_CAMBIO
# Controlar que el jugador no salga de la pantalla
if JUGADOR_X <= 0:
JUGADOR_X = 0
if JUGADOR_X >= 1136:
JUGADOR_X = 1136
# ENEMIGO
# Vamos a aplicar el cambio de coordenadas automática
# al enemigo antes de aplicar las coordenadas del enemigo
for e in range(CANTIDAD_ENEMIGOS):
# Fin del juego
if ENEMIGO_Y[e] > 745:
for k in range(CANTIDAD_ENEMIGOS):
ENEMIGO_Y[k] = 1500
texto_final()
mixer.music.stop()
break
ENEMIGO_X[e] += ENEMIGO_X_CAMBIO[e]
# Controlar que el enemigo no salga de la pantalla
if ENEMIGO_X[e] <= 0:
ENEMIGO_X_CAMBIO[e] = 1
ENEMIGO_Y[e] += ENEMIGO_Y_CAMBIO[e]
elif ENEMIGO_X[e] >= 1136:
ENEMIGO_X_CAMBIO[e] = -1
ENEMIGO_Y[e] += ENEMIGO_Y_CAMBIO[e]
# COLISIÓN
colision = hay_colision(ENEMIGO_X[e], ENEMIGO_Y[e], BALA_X, BALA_Y)
if colision:
sonido_colision = mixer.Sound('sound/Golpe.mp3')
sonido_colision.set_volume(0.3)
sonido_colision.play()
# Reiniciamos los valores de la bala
BALA_Y = 810
BALA_VISIBLE = False
# Contabilizamos el enemigo muerto
PUNTAJE += 1
# Hacemos que reaparezca el enemigo
ENEMIGO_X[e] = random.randint(0, 1136)
ENEMIGO_Y[e] = random.randint(0, 300)
# Llamamos a la función del enemigo
enemigo(ENEMIGO_X[e], ENEMIGO_Y[e], e)
# BALA
if BALA_Y <= -64:
BALA_Y = 810
BALA_VISIBLE = False
if BALA_VISIBLE:
disparar_bala(BALA_X, BALA_Y)
BALA_Y -= BALA_Y_CAMBIO
# LLAMAR A LAS FUNCIONES
# Llamamos a la función del jugador
jugador(JUGADOR_X, JUGADOR_Y)
# Llamaos a la puntuación
mostrar_puntuación(TEXTO_X, TEXTO_Y)
# Para que se ejecute lo anterior se necesita actualizar
pygame.display.update()