Ping Pong.py [0.4]

Ping Pong.py [0.4]

Notapor Nathaniel » Sab Feb 14, 2009 8:06 pm

Versión 0.4 del Ping Pong, la más reciente y supongo que ultima

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

Imagen

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)
Última edición por Nathaniel el Lun Jun 15, 2009 4:17 pm, editado 4 veces en total
Nathaniel
 
Mensajes: 8
Registrado: Sab Feb 14, 2009 8:00 pm

Notapor endaramiz » Dom Feb 15, 2009 3:56 pm

A simple vista:
Código: Seleccionar todo
screen = pygame.display.set_mode((Anchura,Altura))
pygame.display.set_caption("Ping Pong")
Fondo = pygame.image.load("Fondo.jpg")

Yo pondría esto dentro del main y pasaría la screen como parámetro de una función para pintar los sprites. Aunque aún mejor: pygame te crea un método draw automáticamente en los spritegroups.

Por lo demás, tiene buena pinta. Ánimo y ya nos enseñarás tu próxima versión.
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona

Version 0.4

Notapor Nathaniel » Lun Jun 15, 2009 4:11 pm

Modifico el post principal!
Nathaniel
 
Mensajes: 8
Registrado: Sab Feb 14, 2009 8:00 pm


Volver a Videojuegos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron