-
Notifications
You must be signed in to change notification settings - Fork 1
/
5-enemigos.py
172 lines (140 loc) · 7.04 KB
/
5-enemigos.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
168
169
170
171
172
import pygame # Importa el módulo pygame
import os # Importa el módulo os
import random # Importa el módulo random
pygame.init() # Inicializa pygame
# Función para cargar imágenes
def cargarImagen(imagen):
ruta = os.path.join("assets", imagen) # Construye la ruta completa
return pygame.image.load(ruta) # Carga la imagen y la devuelve
WIDTH = 800 # Anchura de la ventana
HEIGHT = 600 # Altura de la ventana
SHIP_WIDTH = 80 # Anchura de la nave
SHIP_HEIGHT = 54 # Altura de la nave
VEL_JUGADOR = 10 # Velocidad de la nave
VEL_ENEMIGO = 5 # Velocidad de los enemigos
MAX_ENEMIGOS = 6 # Número máximo de enemigos simultáneos
PROB_ENEMIGO = 40 # Probabilidad de que aparezca un nuevo enemigo
ESPERA_ENEMIGOS = 20 # Espera mínima entre enemigos
IMAGENES_ENEMIGOS = [ # Modelos de nave enemiga
cargarImagen("enemy1.png"),
cargarImagen("enemy2.png"),
cargarImagen("enemy3.png")
]
# Crea una imagen de fondo con un mosaico de estrellas
def crearFondo():
img = pygame.surface.Surface((WIDTH, HEIGHT)) # Crea una imagen del tamaño de la pantalla
pieza = cargarImagen("stars.png") # Carga la imagen de mosaico
y = 0 # Inicia recorrido vertical
while (y < HEIGHT): # Recorre en vertical
x = 0 # Inicia recorrido horizontal
while (x < WIDTH): # Recorre en horizontal
img.blit(pieza, (x,y)) # Pinta la pieza en la posición (x,y)
x += pieza.get_width() # Avanza el ancho de la pieza en horizontal
y += pieza.get_height() # Avanza el alto de la pieza en vertical
return img
# Inicializa la ventana principal
WIN = pygame.display.set_mode((WIDTH, HEIGHT)) # Crea la ventana
pygame.display.set_caption("Space Shooter") # Establece el título de la ventana
ICONO = cargarImagen("icon.png") # Carga la imagen de icono
pygame.display.set_icon(ICONO) # Establece el icono de la ventana
FONDO = crearFondo() # Crea la imagen de fondo
# Grupos
enemigos = pygame.sprite.Group()
todo = pygame.sprite.Group()
# Sprite Jugador
class Jugador(pygame.sprite.Sprite): # Clase que deriva de Sprite
# CONSTRUCTOR
def __init__(self):
super().__init__()
# Carga la imagen
ship = cargarImagen("playerShip.png")
# Reduce el tamaño
self.image = pygame.transform.scale(ship, (SHIP_WIDTH,SHIP_HEIGHT))
# Crea el Rect con el tamaño de la imagen
self.rect = self.image.get_bounding_rect()
# Ajusta la posición
self.rect.midbottom = (WIDTH // 2, HEIGHT - 20)
# Añade el sprite al grupo general
self.add(todo)
# Movimiento del jugador
def update(self):
# Lee las teclas pulsadas
keys = pygame.key.get_pressed()
if (keys[pygame.K_UP]): # Arriba
self.rect.y -= VEL_JUGADOR
if (keys[pygame.K_DOWN]): # Abajo
self.rect.y += VEL_JUGADOR
if (keys[pygame.K_LEFT]): # Izquierda
self.rect.x -= VEL_JUGADOR
if (keys[pygame.K_RIGHT]): # Derecha
self.rect.x += VEL_JUGADOR
if self.rect.left < 0: # Sobrepasa el borde izquierdo
self.rect.left = 0
if self.rect.right > WIDTH: # Sobrepasa el borde derecho
self.rect.right = WIDTH
if self.rect.top < 0: # Sobrepasa el borde superior
self.rect.top = 0
if self.rect.bottom > HEIGHT: # Sobrepasa el borde inferior
self.rect.bottom = HEIGHT
# Sprite enemigo
class Enemigo(pygame.sprite.Sprite): # Clase que deriva de Sprite
# CONSTRUCTOR
def __init__(self):
super().__init__()
# Elige un tipo de nave
ship = random.choice(IMAGENES_ENEMIGOS)
# Calcula el tamaño del sprite ajustándolo al tamaño del jugador
self.rect = ship.get_bounding_rect().fit((0,0,SHIP_WIDTH,SHIP_HEIGHT))
# Reduce el tamaño de la imagen
self.image = pygame.transform.scale(ship, self.rect.size)
# Posición horizontal aleatoria en todo el ancho de la ventana
self.rect.x = random.randint(0, WIDTH - self.rect.width)
# Posición vertical por encima del borde superior
self.rect.y = -self.rect.height
# Velocidad horizontal aleatoria (izquierda, abajo, derecha)
self.velx = random.choice([-VEL_ENEMIGO, 0 , VEL_ENEMIGO])
# Añade el sprite a sus grupos
self.add(enemigos, todo)
# Movimiento del enemigo
def update(self):
self.rect.x += self.velx # Movimiento horizontal
self.rect.y += VEL_ENEMIGO # Movimiento vertical
# Ajustes
if self.rect.left < 0: # Sobrepasa el borde izquierdo
self.rect.left = 0 # Se queda en el borde
self.velx = -self.velx # y cambia de dirección
if self.rect.right > WIDTH: # Sobrepasa el borde derecho
self.rect.right = WIDTH # Se queda en el borde
self.velx = -self.velx # y cambia de dirección
if self.rect.y > HEIGHT: # Sobrepasa el borde inferior
self.kill() # Eliminamos el sprite
nave = Jugador() # Crea el sprite jugador
# Función que dibuja la pantalla completa en cada iteración del juego
def dibuja():
WIN.blit(FONDO, (0,0)) # Dibuja el fondo
todo.draw(WIN) # Dibuja los sprites
pygame.display.update() # Actualiza la pantalla
# Función principal del juego
def main():
esperaEnemigo = 0 # Tiempo de espera entre enemigos
reloj = pygame.time.Clock() # Reloj para FPS
jugando = True # Condición del bucle
while jugando: # Bucle del juego
for event in pygame.event.get(): # Obtiene los eventos y los recorre
if event.type == pygame.QUIT: # Evento QUIT
jugando = False # Salimos del bucle
# Generar enemigos si no estamos en espera y no hemos alcanzado el máximo
if esperaEnemigo == 0 and len(enemigos) < MAX_ENEMIGOS:
# Aplica la probabilidad
if (random.uniform(0,100) < PROB_ENEMIGO):
Enemigo() # Crea el sprite enemigo
esperaEnemigo = ESPERA_ENEMIGOS # Inicia el tiempo de espera
elif esperaEnemigo > 0: # Estamos en espera
esperaEnemigo -= 1 # Descuenta del tiempo de espera
todo.update() # Actualiza los sprites
dibuja() # Dibuja la pantalla
reloj.tick(60) # Fuerza FPS
pygame.quit() # Cerramos pygame
# Si han ejecutado directamente este archivo, lanzamos main()
if __name__ == "__main__":
main()