[EJEMPLO] nieve! :D

Losersjuegos cuenta con una secciones de ejemplos en su web. Utilice esta sección para consultar o proponer ideas acerca de ellos.

[EJEMPLO] nieve! :D

Notapor shackra » Vie Abr 02, 2010 10:11 pm

codigo fuente escrito por mi que simula una nevada, puedes pausar la simulacion con el boton [ENTER] ;D.
el codigo esta comentado en lo maximo posible para ser legible a los novatos (los que empieza desde 0)

Código: Seleccionar todo
#******************************************************************************
# nieve.py: mini juego que simula una nevada.
#
# Histortial:
#    0.0.1: todo el framework es creado
#       0.0.2: se implementa una funcion generadora de posiciones y velocidades
#              aleatorias para las bolitas de nieve.
#       0.0.3: se implementa la posibilidad de pausar la simulacion con la
#              tecla ENTER.
#       0.1.0: se agrega la posibilidad de optar por el modo fullscreen u modo
#              ventana y este historial.
#
# Por Shackra para los chicos de losersjuegos.com.ar
# From Dreams To Games - Studios
#******************************************************************************

import pygame
from pygame.locals import *
import random

def gennieve(lista):
    """ generea posiciones aleatorias par la nieve """
    valoresx = []
    # generemos una lista de valores aleatorios
    for i in range(0, 5):
        valoresx.append(random.randrange(0, pygame.display.get_surface().get_width()/2, 1))
    for i in range(0, 5):
        valoresx.append(random.randrange(pygame.display.get_surface().get_width()/2, pygame.display.get_surface().get_width(), 2))

    # lo mas aleatorio posible sin complicarnos
    random.shuffle(valoresx)
    #print "lista random generada: {0}".format(valoresx)
    # posicion para X y Y
    posxy = [random.choice(valoresx), random.randint(-1, 0)]
    # velocidades para X y Y
    velxy = [random.randint(0, 1), random.randint(1, 2)]
    lista.append([posxy, velxy])

nieve = []
RESOLUCION = (800, 600)
tiempo = pygame.time.Clock()

GRIS = (127, 127, 127)
BLANCO = (255, 255, 255)
ROSADO = (255, 192, 203)
NEGRO_A = (0, 0, 0, 64)

pygame.display.set_mode(RESOLUCION)
pygame.display.set_caption("nieve! :: FDTG -    S    T    U    D    I    O    S    ")

quit = False

pausa = False
pausa_screen_copy = None
pausa_screen_black = pygame.Surface(RESOLUCION)
pausa_screen_black.convert()
pausa_screen_black.set_alpha(64)

pygame.font.init()
texto = pygame.font.Font(None, 45)
texto_d = texto.size("Pausa")
texto_s = texto.render("Pausa", True, BLANCO)

pausa_screen_black.blit(texto_s, (RESOLUCION[0]/2 - texto_d[0]/2, RESOLUCION[1]/2 - texto_d[1]/2))

print "\n\nteclas disponibles:\nENTER: pone/quita la pausa\ntecla F: pone/quita el fullscreen (solo en linux!)\
\ntecla ESC: termina la \"simulacion\" de nieve sin retrasos en ipython o python ;)"

print "\nprueba (o ejemplo?) realizado por Shackra para los chicos de losersjuegos.com.ar"
print "From Dreams To Games - Studios"
print "apuesto que el siguiente post es del gran hugoruscitti ;)"

while not quit:
    tiempo.tick_busy_loop(120)

    for evento in pygame.event.get():
        if evento.type == QUIT:
            quit = True
        elif evento.type == KEYDOWN:
            if evento.key in [K_ESCAPE]:
                quit = True
            elif evento.key == K_RETURN:
                if not pausa:
                    pausa = True
                    # copiamos lo que hay dibujado en la pantalla antes de hacer la pausa
                    pausa_screen_copy = pygame.display.get_surface().copy()
                else:
                    pausa = False
            elif evento.key == K_f:
                pygame.display.toggle_fullscreen()

### comprobacion del estado de pausa ###
    if pausa:
        # si hay pausa...

        # dibujamos lo que habiamos copiado, muy listo no?
        # aunque tambien podemos blitear las bolitas de nieve
        # en sus posiciones actuales, sin modificar estas con
        # la velocidad que ellas llevan. pero a mi me gusta asi =)

        pygame.display.get_surface().blit(pausa_screen_copy, (0, 0))

        # una sexy cortinita negra pegadita a la piel de la pantalla
        # con un estampado que dice "Pausa", ideal para dejar volar
        # la imaginacion del jugador xD.

        pygame.display.get_surface().blit(pausa_screen_black, (0, 0))

    else:
        # si no es asi, pues... que siga la simulacion! =)
        gennieve(nieve)
        pygame.display.get_surface().fill(ROSADO)
        # actualizemos todas las posiciones de todas las bolitas de nieve
        for i in nieve:
            # posicion de x + velocidad de x
            i[0][0] = i[0][0] + i[1][0]
            # posicion de y + velocidad de y
            i[0][1] = i[0][1] + i[1][1]
            # podria hacer de la manera corta +=, pero me da perecita hacerlo! :D
            # variemos la posicion de x
            if random.randint(0, 2) <1>= pygame.display.get_surface().get_width():
                nieve.remove(i)
            elif i[0][1] >= pygame.display.get_surface().get_height():
               nieve.remove(i)
            # por ultimo dibujemos todas las bolitas de nieve :)
            pygame.draw.circle(pygame.display.get_surface(), BLANCO, (i[0][0], i[0][1]), 3)

    pygame.display.flip()

# para ipython es necesario usar exit(), si no fuera asi nos dejaria en la shell de python
# y eso me molesta =(.
exit()
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Notapor hugoruscitti » Vie Abr 02, 2010 11:25 pm

wow, que buen efecto!!, se ve muy bien:

Imagen
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor shackra » Dom Abr 11, 2010 8:21 pm

:oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops:
que pena!!! xD, gracias hugo, tu si que sabes apreciar! =).
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica


Volver a Ejemplos

¿Quién está conectado?

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