Gracias Hugo por el menu, en cuanto tenga hecho uno por mi lo substituyo


Dispone:
- 2 Players
- Interfaz sencilla pero agradable
- Música de fondo
- Menú
- Contador de puntos
- etc.
Falta (que no creo que termine):
- Jugar contra CPU
- Algunos eventos originales
Nath Pong 0.4.tar.gz
Para ejecutarlo en caso de tener Windows necesitais el intérprete de Python y la biblioteca Pygame
http://www.python.org/download/
http://www.pygame.org/download.shtml
En caso de tener GNU/Linux generalmente viene instalado por lo que tan sólo hay que hacer con la shell: python nombredelscript.py
- Código: Seleccionar todo
# Autor: Nath (Nath.py@hotmail.com)
# Licencia GPL
# Descripcion: El clasico juego del Ping Pong a 2D
# Greetz to Hugo Ruscitti for Menu ;)
#------------------------------------------------------------------------------
#Importamos los modulos necesarios
import random
import pygame
from pygame.locals import *
import math
pygame.init()
pygame.mixer.init()
pygame.mixer.music.load("Error.mp3")
pygame.mixer.music.play()
class Opcion:
def __init__(self, fuente, titulo, x, y, paridad, funcion_asignada):
self.imagen_normal = fuente.render(titulo, 1, (0, 0, 0))
self.imagen_destacada = fuente.render(titulo, 1, (200, 0, 0))
self.image = self.imagen_normal
self.rect = self.image.get_rect()
self.rect.x = 500 * paridad
self.rect.y = y
self.funcion_asignada = funcion_asignada
self.x = float(self.rect.x)
def actualizar(self):
destino_x = 105
self.x += (destino_x - self.x) / 5.0
self.rect.x = int(self.x)
def imprimir(self, screen):
screen.blit(self.image, self.rect)
def destacar(self, estado):
if estado:
self.image = self.imagen_destacada
else:
self.image = self.imagen_normal
def activar(self):
self.funcion_asignada()
class Cursor:
def __init__(self, x, y, dy):
self.image = pygame.image.load('cursor.png').convert_alpha()
self.rect = self.image.get_rect()
self.rect.x = x
self.y_inicial = y
self.dy = dy
self.y = 0
self.seleccionar(0)
def actualizar(self):
self.y += (self.to_y - self.y) / 10.0
self.rect.y = int(self.y)
def seleccionar(self, indice):
self.to_y = self.y_inicial + indice * self.dy
def imprimir(self, screen):
screen.blit(self.image, self.rect)
class Menu:
def __init__(self, opciones):
self.opciones = []
fuente = pygame.font.Font('dejavu.ttf', 20)
x = 105
y = 105
paridad = 1
self.cursor = Cursor(x - 30, y, 30)
for titulo, funcion in opciones:
self.opciones.append(Opcion(fuente, titulo, x, y, paridad, funcion))
y += 30
if paridad == 1:
paridad = -1
else:
paridad = 1
self.seleccionado = 0
self.total = len(self.opciones)
self.mantiene_pulsado = False
def actualizar(self):
k = pygame.key.get_pressed()
if not self.mantiene_pulsado:
if k[K_UP]:
self.seleccionado -= 1
elif k[K_DOWN]:
self.seleccionado += 1
elif k[K_RETURN]:
self.opciones[self.seleccionado].activar()
if self.seleccionado < 0:
self.seleccionado = 0
elif self.seleccionado > self.total - 1:
self.seleccionado = self.total - 1
self.cursor.seleccionar(self.seleccionado)
self.mantiene_pulsado = k[K_UP] or k[K_DOWN] or k[K_RETURN]
self.cursor.actualizar()
for o in self.opciones:
o.actualizar()
def imprimir(self, screen):
self.cursor.imprimir(screen)
for opcion in self.opciones:
opcion.imprimir(screen)
def comenzar_nuevo_juego():
#Definimos la pantalla como 640x480
Anchura, Altura = 640, 480
screen = pygame.display.set_mode((Anchura,Altura))
pygame.display.set_caption("Ping Pong")
Fondo = pygame.image.load("Fondo.jpg")
#Definimos el Sprite "Jugador1", el de la izquierda.
class Jugador1 (pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.Jugador1_image = pygame.image.load("pala.png")
self.rect = self.Jugador1_image.get_rect()
def Update(self):
self.rect.clamp_ip(screen.get_rect())
self.key = pygame.key.get_pressed()
if self.key[pygame.K_w]:
self.rect.y -= 5
elif self.key[pygame.K_s]:
self.rect.y += 5
screen.blit(self.Jugador1_image,self.rect)
#Definimos el Sprite "Jugador2", el de la derecha.
class Jugador2 (pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.color = (0,0,0)
self.Jugador2_image = pygame.image.load("pala.png")
self.rect = self.Jugador2_image.get_rect()
self.rect.x = 620
def Update(self):
self.rect.clamp_ip(screen.get_rect())
self.key = pygame.key.get_pressed()
if self.key[pygame.K_UP]:
self.rect.y -= 5
elif self.key[pygame.K_DOWN]:
self.rect.y += 5
screen.blit(self.Jugador2_image,self.rect)
#Definimos el sprite "Pelota"
class Pelota(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.color = (0,0,0)
self.Pelota_image = pygame.image.load("ball.gif")
self.rect = self.Pelota_image.get_rect()
self.speed = [3,3]
self.rect.y,self.rect.x = 200,200
self.Player2_Score = 0
self.Player1_Score = 0
def Update(self):
self.rect.clamp_ip(screen.get_rect())
Colision = pygame.sprite.spritecollide(self,GrupoJugadores,dokill=False)
if Colision:
if self.speed[0] > 0:
self.speed[0] += 1
elif self.speed[0] < 0:
self.speed[0] -= 1
elif self.speed[1] > 0:
self.speed[1] += 1
elif self.speed[1] < 0:
self.speed[1] -= 1
self.speed[0] = - self.speed[0]
if self.rect.top < 1 or self.rect.bottom > 479: self.speed[1] = -self.speed[1]
elif self.rect.left < 1:
self.Player2_Score += 1
if self.Player2_Score == 5:
Render = Fuente2.render("Ha ganado el Jugador 2!", 1, (0, 0, 0))
screen.blit(Render,(30,230))
pygame.display.update()
pygame.time.wait(1000)
exit()
Reset("Ganador_2")
elif self.rect.right > 639:
self.Player1_Score += 1
if self.Player1_Score == 5:
Render = Fuente2.render("Ha ganado el Jugador 1!", 1, (0, 0, 0))
screen.blit(Render,(30,230))
pygame.display.update()
pygame.time.wait(2000)
exit()
Reset("Ganador_1")
self.rect.move_ip(self.speed[0],self.speed[1])
screen.blit(self.Pelota_image,self.rect)
#Funcion para resetear despues de un punto
def Reset(Ganador):
Pelota.speed[0],Pelota.speed[1] = 2,2
Pelota.rect.x,Pelota.rect.y = 300,210
if Ganador == "Ganador_1":
Pelota.speed[0] = -Pelota.speed[0]
pygame.time.wait(100)
elif Ganador == "Ganador_2":
Pelota.speed[0] = -Pelota.speed[0]
pygame.time.wait(100)
#Inicializaciones y configuraciones previas para empezar el juego
Jugador1 = Jugador1()
Jugador2 = Jugador2()
Pelota = Pelota()
GrupoJugadores = pygame.sprite.Group()
GrupoJugadores.add(Jugador1,Jugador2)
Running = True
pygame.mouse.set_visible(False)
#Definimos la fuente para el marcador
Fuente = pygame.font.Font("dejavu.ttf",80)
Fuente2 = pygame.font.Font("dejavu.ttf",40)
#Empezamos el bucle infinito que inicia el juego
while Running:
for event in pygame.event.get():
if event.type == QUIT:
Running = False
if event.type == pygame.K_ESCAPE:
Running = False
screen.blit(Fondo,(0,0))
Jugador1.Update()
Jugador2.Update()
Pelota.Update()
screen.blit(Fuente.render(str(Pelota.Player1_Score)+" - " + str(Pelota.Player2_Score),True, (255,000,000)),(230,30))
pygame.display.flip()
def salir_del_programa():
exit()
if __name__ == '__main__':
salir = False
opciones = [
("Jugar", comenzar_nuevo_juego),
("Salir", salir_del_programa)
]
pygame.font.init()
screen = pygame.display.set_mode((310, 200))
fondo = pygame.image.load("fondo.png").convert()
menu = Menu(opciones)
while not salir:
for e in pygame.event.get():
if e.type == QUIT:
salir = True
screen.blit(fondo, (0, 0))
menu.actualizar()
menu.imprimir(screen)
pygame.display.flip()
pygame.time.delay(10)