190 lines
4.7 KiB
Python
190 lines
4.7 KiB
Python
|
import pygame
|
||
|
import random
|
||
|
import math
|
||
|
from pygame import mixer
|
||
|
|
||
|
# Inicializar Pygame
|
||
|
pygame.init()
|
||
|
|
||
|
# Crear la pantalla
|
||
|
pantalla = pygame.display.set_mode((800, 600))
|
||
|
|
||
|
# Titulo e Icono
|
||
|
pygame.display.set_caption("Invasión Espacial")
|
||
|
icono = pygame.image.load("ovni.png")
|
||
|
pygame.display.set_icon(icono)
|
||
|
fondo = pygame.image.load('fondo.jpg')
|
||
|
|
||
|
# agregar musica
|
||
|
mixer.music.load('MusicaFondo.mp3')
|
||
|
mixer.music.set_volume(0.3)
|
||
|
mixer.music.play(-1)
|
||
|
|
||
|
# variables del Jugador
|
||
|
img_jugador = pygame.image.load("cohete.png")
|
||
|
jugador_x = 368
|
||
|
jugador_y = 500
|
||
|
jugador_x_cambio = 0
|
||
|
|
||
|
# variables del enemigo
|
||
|
img_enemigo = []
|
||
|
enemigo_x = []
|
||
|
enemigo_y = []
|
||
|
enemigo_x_cambio = []
|
||
|
enemigo_y_cambio = []
|
||
|
cantidad_enemigos = 8
|
||
|
|
||
|
for e in range(cantidad_enemigos):
|
||
|
img_enemigo.append(pygame.image.load("enemigo.png"))
|
||
|
enemigo_x.append(random.randint(0, 736))
|
||
|
enemigo_y.append(random.randint(50, 200))
|
||
|
enemigo_x_cambio.append(0.5)
|
||
|
enemigo_y_cambio.append(50)
|
||
|
|
||
|
# variables de la bala
|
||
|
img_bala = pygame.image.load("bala.png")
|
||
|
bala_x = 0
|
||
|
bala_y = 500
|
||
|
bala_x_cambio = 0
|
||
|
bala_y_cambio = 3
|
||
|
bala_visible = False
|
||
|
|
||
|
# puntaje
|
||
|
puntaje = 0
|
||
|
fuente = pygame.font.Font('freesansbold.ttf', 32)
|
||
|
texto_x = 10
|
||
|
texto_y = 10
|
||
|
|
||
|
# texto final de juego
|
||
|
fuente_final = pygame.font.Font('freesansbold.ttf', 40)
|
||
|
|
||
|
|
||
|
def texto_final():
|
||
|
mi_fuente_final = fuente_final.render("JUEGO TERMINADO", True, (255, 255, 255))
|
||
|
pantalla.blit(mi_fuente_final, (60, 200))
|
||
|
|
||
|
|
||
|
# funcion mostrar puntaje
|
||
|
def mostrar_puntaje(x, y):
|
||
|
texto = fuente.render(f"Puntaje: {puntaje}", True, (255, 255, 255))
|
||
|
pantalla.blit(texto, (x, y))
|
||
|
|
||
|
|
||
|
# fucion jugador
|
||
|
def jugador(x, y):
|
||
|
pantalla.blit(img_jugador, (x, y))
|
||
|
|
||
|
|
||
|
# fucion enemigo
|
||
|
def enemigo(x, y, ene):
|
||
|
pantalla.blit(img_enemigo[ene], (x, y))
|
||
|
|
||
|
|
||
|
# funcion disparar bala
|
||
|
def disparar_bala(x, y):
|
||
|
global bala_visible
|
||
|
bala_visible = True
|
||
|
pantalla.blit(img_bala, (x + 16, y + 10))
|
||
|
|
||
|
|
||
|
# funcion detectar colisiones
|
||
|
def hay_colision(x_1, y_1, x_2, y_2):
|
||
|
distancia = math.sqrt(math.pow(x_1 - x_2, 2) + math.pow(y_2 - y_1, 2))
|
||
|
if distancia < 27:
|
||
|
return True
|
||
|
else:
|
||
|
return False
|
||
|
|
||
|
|
||
|
# Loop del juego
|
||
|
se_ejecuta = True
|
||
|
while se_ejecuta:
|
||
|
|
||
|
# image de fondo
|
||
|
pantalla.blit(fondo, (0, 0))
|
||
|
|
||
|
# iterar eventos
|
||
|
for evento in pygame.event.get():
|
||
|
|
||
|
# evento cerrar
|
||
|
if evento.type == pygame.QUIT:
|
||
|
se_ejecuta = False
|
||
|
|
||
|
# evento presionar teclas
|
||
|
if evento.type == pygame.KEYDOWN:
|
||
|
if evento.key == pygame.K_LEFT:
|
||
|
jugador_x_cambio = -1
|
||
|
if evento.key == pygame.K_RIGHT:
|
||
|
jugador_x_cambio = 1
|
||
|
if evento.key == pygame.K_SPACE:
|
||
|
sonido_bala = mixer.Sound('disparo.mp3')
|
||
|
sonido_bala.play()
|
||
|
if not bala_visible:
|
||
|
bala_x = jugador_x
|
||
|
disparar_bala(bala_x, bala_y)
|
||
|
|
||
|
# evento soltar flechas
|
||
|
if evento.type == pygame.KEYUP:
|
||
|
if evento.key == pygame.K_LEFT or evento.key == pygame.K_RIGHT:
|
||
|
jugador_x_cambio = 0
|
||
|
|
||
|
# modificar ubicacion del jugador
|
||
|
jugador_x += jugador_x_cambio
|
||
|
|
||
|
# mantener dentro de bordes al jugador
|
||
|
if jugador_x <= 0:
|
||
|
jugador_x = 0
|
||
|
elif jugador_x >= 736:
|
||
|
jugador_x = 736
|
||
|
|
||
|
# modificar ubicacion del enemigo
|
||
|
for e in range(cantidad_enemigos):
|
||
|
|
||
|
# fin del juego
|
||
|
if enemigo_y[e] > 500:
|
||
|
for k in range(cantidad_enemigos):
|
||
|
enemigo_y[k] = 1000
|
||
|
texto_final()
|
||
|
break
|
||
|
|
||
|
enemigo_x[e] += enemigo_x_cambio[e]
|
||
|
|
||
|
# mantener dentro de bordes al enemigo
|
||
|
if enemigo_x[e] <= 0:
|
||
|
enemigo_x_cambio[e] = 1
|
||
|
enemigo_y[e] += enemigo_y_cambio[e]
|
||
|
elif enemigo_x[e] >= 736:
|
||
|
enemigo_x_cambio[e] = -1
|
||
|
enemigo_y[e] += enemigo_y_cambio[e]
|
||
|
|
||
|
# colision
|
||
|
colision = hay_colision(enemigo_x[e], enemigo_y[e], bala_x, bala_y)
|
||
|
if colision:
|
||
|
sonido_colision = mixer.Sound('golpe.mp3')
|
||
|
sonido_colision.play()
|
||
|
bala_y = 500
|
||
|
bala_visible = False
|
||
|
puntaje += 1
|
||
|
enemigo_x[e] = random.randint(0, 736)
|
||
|
enemigo_y[e] = random.randint(50, 200)
|
||
|
|
||
|
enemigo(enemigo_x[e], enemigo_y[e], e)
|
||
|
|
||
|
# movimiento bala
|
||
|
if bala_y <= -64:
|
||
|
bala_y = 500
|
||
|
bala_visible = False
|
||
|
|
||
|
if bala_visible:
|
||
|
disparar_bala(bala_x, bala_y)
|
||
|
bala_y -= bala_y_cambio
|
||
|
|
||
|
|
||
|
jugador(jugador_x, jugador_y)
|
||
|
|
||
|
mostrar_puntaje(texto_x, texto_y)
|
||
|
|
||
|
# actualizar
|
||
|
pygame.display.update()
|
||
|
|