juegos-python/space_invaders_2/main.py

225 lines
6.2 KiB
Python
Raw Permalink Normal View History

2023-04-10 00:48:44 +02:00
# Juego en Python con pygame
# autor: Magno Efren - 2022
# https://www.youtube.com/c/MagnoEfren/videos
import pygame
import random
pygame.init()
pygame.mixer.init()
fondo = pygame.image.load('imagenes/fondo.png')
laser_sonido = pygame.mixer.Sound('laser.wav')
explosion_sonido = pygame.mixer.Sound('explosion.wav')
golpe_sonido = pygame.mixer.Sound('golpe.wav')
explosion_list = []
for i in range(1,13):
explosion = pygame.image.load(f'explosion/{i}.png')
explosion_list.append(explosion)
width = fondo.get_width()
height = fondo.get_height()
window = pygame.display.set_mode((width, height))
pygame.display.set_caption('Juego Space Invaders')
run = True
fps = 60
clock = pygame.time.Clock()
score = 0
vida = 100
blanco = (255,255,255)
negro = (0,0,0)
def texto_puntuacion(frame, text, size, x,y):
font = pygame.font.SysFont('Small Fonts', size, bold=True)
text_frame = font.render(text, True, blanco,negro)
text_rect = text_frame.get_rect()
text_rect.midtop = (x,y)
frame.blit(text_frame, text_rect)
def barra_vida(frame, x,y, nivel):
longitud = 100
alto = 20
fill = int((nivel/100)*longitud)
border = pygame.Rect(x,y, longitud, alto)
fill = pygame.Rect(x,y,fill, alto)
pygame.draw.rect(frame, (255,0,55),fill)
pygame.draw.rect(frame, negro, border,4)
class Jugador(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.image.load('imagenes/A1.png').convert_alpha()
pygame.display.set_icon(self.image)
self.rect = self.image.get_rect()
self.rect.centerx = width//2
self.rect.centery = height-50
self.velocidad_x = 0
self.vida = 100
def update(self):
self.velocidad_x = 0
keystate = pygame.key.get_pressed()
if keystate[pygame.K_LEFT]:
self.velocidad_x = -5
elif keystate[pygame.K_RIGHT]:
self.velocidad_x = 5
self.rect.x += self.velocidad_x
if self.rect.right > width:
self.rect.right = width
elif self.rect.left < 0:
self.rect.left = 0
def disparar(self):
bala = Balas(self.rect.centerx, self.rect.top)
grupo_jugador.add(bala)
grupo_balas_jugador.add(bala)
laser_sonido.play()
class Enemigos(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.image.load('imagenes/E1.png').convert_alpha()
self.rect = self.image.get_rect()
self.rect.x = random.randrange(1, width-50)
self.rect.y = 10
self.velocidad_y = random.randrange(-5,20)
def update(self):
self.time = random.randrange(-1, pygame.time.get_ticks()//5000)
self.rect.x += self.time
if self.rect.x >= width:
self.rect.x = 0
self.rect.y += 50
def disparar_enemigos(self):
bala = Balas_enemigos(self.rect.centerx, self.rect.bottom)
grupo_jugador.add(bala)
grupo_balas_enemigos.add(bala)
laser_sonido.play()
class Balas(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.image.load('imagenes/B2.png').convert_alpha()
self.rect = self.image.get_rect()
self.rect.centerx = x
self.rect.y = y
self.velocidad = -18
def update(self):
self.rect.y += self.velocidad
if self.rect.bottom <0:
self.kill()
class Balas_enemigos(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.image.load('imagenes/B1.png').convert_alpha()
self.image = pygame.transform.rotate(self.image, 180)
self.rect = self.image.get_rect()
self.rect.centerx = x
self.rect.y = random.randrange(10, width)
self.velocidad_y = 4
def update(self):
self.rect.y += self.velocidad_y
if self.rect.bottom > height:
self.kill()
class Explosion(pygame.sprite.Sprite):
def __init__(self, position):
super().__init__()
self.image = explosion_list[0]
img_scala = pygame.transform.scale(self.image, (20,20))
self.rect = img_scala.get_rect()
self.rect.center = position
self.time = pygame.time.get_ticks()
self.velocidad_explo = 30
self.frames = 0
def update(self):
tiempo = pygame.time.get_ticks()
if tiempo - self.time > self.velocidad_explo:
self.time = tiempo
self.frames+=1
if self.frames == len(explosion_list):
self.kill()
else:
position = self.rect.center
self.image = explosion_list[self.frames]
self.rect = self.image.get_rect()
self.rect.center = position
grupo_jugador = pygame.sprite.Group()
grupo_enemigos = pygame.sprite.Group()
grupo_balas_jugador = pygame.sprite.Group()
grupo_balas_enemigos = pygame.sprite.Group()
player = Jugador()
grupo_jugador.add(player)
grupo_balas_jugador.add(player)
for x in range(10):
enemigo = Enemigos(10,10)
grupo_enemigos.add(enemigo)
grupo_jugador.add(enemigo)
while run:
clock.tick(fps)
window.blit(fondo, (0,0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
player.disparar()
grupo_jugador.update()
grupo_enemigos.update()
grupo_balas_jugador.update()
grupo_balas_enemigos.update()
grupo_jugador.draw(window)
# Coliciones balas_jugador - enemigo
colicion1 = pygame.sprite.groupcollide(grupo_enemigos, grupo_balas_jugador,True,True)
for i in colicion1:
score+=10
enemigo.disparar_enemigos()
enemigo = Enemigos(300,10)
grupo_enemigos.add(enemigo)
grupo_jugador.add(enemigo)
explo = Explosion(i.rect.center)
grupo_jugador.add(explo)
explosion_sonido.set_volume(0.3)
explosion_sonido.play()
# Coliciones jugador - balas_enemigo
colicion2 = pygame.sprite.spritecollide(player, grupo_balas_enemigos, True)
for j in colicion2:
player.vida -= 10
if player.vida <=0:
run = False
explo1 = Explosion(j.rect.center)
grupo_jugador.add(explo1)
golpe_sonido.play()
# Coliciones jugador - enemigo
hits =pygame.sprite.spritecollide(player, grupo_enemigos , False)
for hit in hits:
player.vida -= 100
enemigos = Enemigos(10,10)
grupo_jugador.add(enemigos)
grupo_enemigos.add(enemigos)
if player.vida <=0:
run = False
# Indicador y Score
texto_puntuacion(window, (' SCORE: '+ str(score)+' '), 30, width-85, 2)
barra_vida(window, width-285, 0, player.vida)
pygame.display.flip()
pygame.quit()