Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/BiblioJAM/JAMatrix.py
diff options
context:
space:
mode:
Diffstat (limited to 'BiblioJAM/JAMatrix.py')
-rw-r--r--BiblioJAM/JAMatrix.py302
1 files changed, 302 insertions, 0 deletions
diff --git a/BiblioJAM/JAMatrix.py b/BiblioJAM/JAMatrix.py
new file mode 100644
index 0000000..8c0129e
--- /dev/null
+++ b/BiblioJAM/JAMatrix.py
@@ -0,0 +1,302 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# BiblioJAM (Versión 2.0) - 31/05/2011 - CeibalJAM! - Uruguay
+# JAMatrix.py por: Flavio Danesse fdanesse@gmail.com
+# https://sites.google.com/site/flaviodanesse/
+# https://sites.google.com/site/sugaractivities/
+# http://codigosdeejemplo.blogspot.com/
+
+import pygame
+from pygame.locals import *
+
+import gc
+gc.enable()
+
+import sys, os, random, threading
+
+from JAMLabel import JAMLabel
+from JAMClock import JAMClock
+from JAMCalendar import JAMCalendar
+
+import JAMGlobals as VG
+
+class JAMatrix():
+ ''' Main de JAMatrix. '''
+ def __init__(self, juego, ventana, resolucion):
+ self.juego= juego # el juego base
+ self.ventana= ventana # la ventana pygame
+ self.resolucion= resolucion # la resolucion de la pantalla
+
+ self.widgets= None # grupo de terrones
+ self.interval= 0 # intervalo para agregar terrones
+ self.reloj= None # pygame.time
+ self.fondo= None # el fondo
+ self.etiqueta= None # el mensaje sobre lo que se está cargando
+ self.posicion_label= None # la posicion de la etiqueta para cambiar el mensaje
+ self.imagen_matrix= None # pygame.image.load(VG.get_terron())
+
+ try:
+ self.imagen_matrix= pygame.image.load(VG.get_terron())
+ except:
+ pass
+
+ self.callback_handle_event= None
+ self.latencia= 10
+ self.setup()
+ #self.ventana.blit(self.fondo, (0,0))
+
+ # -------- SETEOS ----------------------
+ def set_imagen_matrix(self, imagen):
+ ''' Setea una imagen para remplazar terron. '''
+ if imagen:
+ self.imagen_matrix = pygame.image.load(imagen)
+ else:
+ self.imagen_matrix= None
+
+ def set_callback_event(self, callback):
+ ''' Conecta una función para detectar eventos mientras se ejecuta JAMatrix. '''
+ self.callback_handle_event= callback
+ def set_latencia(self, latencia):
+ ''' Setea la latencia de generación de terrones. '''
+ if type(latencia)== int: self.latencia= latencia
+ # -------- SETEOS ----------------------
+
+ def carga_game(self):
+ ''' Carga este juego en un thread en segundo plano. '''
+ thread = threading.Thread( target=self.juego.load )
+ thread.start()
+ while not self.juego.estado:
+ self.run()
+ self.unload() # descarga todo lo que puede para liberar memoria
+
+ def unload(self):
+ ''' Al cambiar el estado del juego porque se han cargado todos sus objetos, se descarga JAMatrix en un thread en segundo plano. '''
+ thread = threading.Thread( target=self.descarga_todo )
+ thread.start()
+ gc.collect()
+
+ def run(self):
+ ''' JAMatrix corriendo. '''
+ self.setup()
+ pygame.mouse.set_visible(False)
+ self.reloj.tick(35)
+ if self.interval == self.latencia:
+ self.genera_terrones()
+ self.interval = 0
+ cambios=[]
+ self.widgets.clear(self.ventana, self.fondo)
+ self.widgets.update()
+
+ cambios.extend ( self.widgets.draw(self.ventana) )
+ pygame.display.update(cambios)
+ pygame.event.clear()
+ #pygame.time.wait(1)
+ self.interval += 1
+
+ if self.callback_handle_event:
+ return self.callback_handle_event()
+
+ def descarga_todo(self):
+ ''' Libera memoria. '''
+ self.widgets = None
+ self.interval = 0
+ self.reloj = None
+ self.fondo = None
+ self.etiqueta = None
+ self.posicion_label = None
+
+ def setup(self):
+ ''' Configura los objetos. '''
+ if not self.widgets:
+ self.widgets = pygame.sprite.OrderedUpdates()
+ if not self.reloj:
+ self.reloj = pygame.time.Clock()
+ if not self.fondo:
+ self.fondo = self.get_fondo(color= VG.get_negro(), tamanio=self.resolucion) # superficie
+ if not self.etiqueta:
+ self.etiqueta = JAMLabel (texto="Cargando %s" % (self.juego.name))
+ self.etiqueta.set_text(tamanio= 50, color= VG.get_blanco())
+ if not self.posicion_label:
+ self.posicion_label = (self.resolucion[0]/2 - self.etiqueta.rect.w/2, self.resolucion[1]/2 - self.etiqueta.rect.h/2)
+ self.etiqueta.set_posicion(punto= self.posicion_label)
+ if not self.etiqueta in self.widgets.sprites():
+ self.widgets.add(self.etiqueta)
+
+ def get_fondo(self, color=(100,100,100,1), tamanio=(800,600)):
+ ''' El fondo de la ventana. '''
+ superficie = pygame.Surface( tamanio, flags=HWSURFACE )
+ superficie.fill(color)
+ return superficie
+
+ def genera_terrones(self):
+ ''' Nace un Terron. '''
+ if not self.imagen_matrix: return
+ x = random.randrange(0, self.resolucion[0], self.imagen_matrix.get_size()[0])
+ terron = Terron(self)
+ terron.rect.x, terron.rect.y = (x,-50)
+ self.widgets.add(terron)
+
+class Terron(pygame.sprite.Sprite):
+ ''' Sprite Terron. '''
+ def __init__(self, base):
+ pygame.sprite.Sprite.__init__(self)
+ self.base= base
+ self.imagen1 = self.base.imagen_matrix
+ self.image = self.imagen1
+ self.rect = self.image.get_rect()
+ self.cuenta = 0
+ def update(self):
+ ''' Terrón cae. '''
+ self.rect.y += 4
+ if self.rect.y > self.base.resolucion[1]:
+ self.kill()
+
+# ----- FIN DE CLASE JAMatrix - INICIO DE DEBUG Y EJEMPLO DE LA CLASE -----
+class Ejemplo(object):
+ def __init__(self):
+
+ # Variables obligatorias en tu juego para poder utilizar JAMatrix.
+ self.resolucion = (800,600)
+ self.ventana = None
+ self.name= "Ejemplo JAMatrix"
+ self.estado = False
+
+ # Variables del juego
+ self.reloj = None
+ self.fondo = None
+
+ self.jamclock= None
+ self.jamcalendar= None
+ self.jamclock1= None
+ self.jamcalendar1= None
+ self.jamclock2= None
+ self.jamcalendar2= None
+
+ self.preset() # crea la ventana principal
+
+ # usando JAMatrix para cargar el juego
+ self.matrix= JAMatrix(self, self.ventana, self.resolucion)
+ self.matrix.set_callback_event(self.handle_event) # si quieres detectar eventos durante JAMatrix se ejecuta para cortar la carga.
+ #self.matrix.set_imagen_matrix(os.getcwd() + "/Recursos/Iconos/bandera_uruguay.png")
+ self.matrix.carga_game() # lanza JAMatrix
+
+ # Comienza a ejecutar tu juego
+ self.estado= "menu_0"
+ self.run_menu_0()
+
+ def run_menu_0(self):
+ ''' Tu juego corriendo. '''
+ self.ventana.blit(self.fondo, (0,0))
+
+ self.jamclock.draw(self.ventana)
+ self.jamclock1.draw(self.ventana)
+ self.jamclock2.draw(self.ventana)
+ self.jamcalendar.draw(self.ventana)
+ self.jamcalendar1.draw(self.ventana)
+ self.jamcalendar2.draw(self.ventana)
+
+ pygame.display.update()
+
+ contador = 0
+ while self.estado == "menu_0":
+ self.reloj.tick(35)
+
+ cambios=[]
+ self.jamclock.clear(self.ventana, self.fondo)
+ self.jamclock1.clear(self.ventana, self.fondo)
+ self.jamclock2.clear(self.ventana, self.fondo)
+ self.jamcalendar.clear(self.ventana, self.fondo)
+ self.jamcalendar1.clear(self.ventana, self.fondo)
+ self.jamcalendar2.clear(self.ventana, self.fondo)
+
+ self.jamclock.update()
+ self.jamclock1.update()
+ self.jamclock2.update()
+ self.jamcalendar.update()
+ self.jamcalendar1.update()
+ self.jamcalendar2.update()
+
+ self.handle_event()
+ pygame.event.clear()
+
+ cambios.extend ( self.jamclock.draw(self.ventana) )
+ cambios.extend ( self.jamclock1.draw(self.ventana) )
+ cambios.extend ( self.jamclock2.draw(self.ventana) )
+ cambios.extend ( self.jamcalendar.draw(self.ventana) )
+ cambios.extend ( self.jamcalendar1.draw(self.ventana) )
+ cambios.extend ( self.jamcalendar2.draw(self.ventana) )
+
+ pygame.display.update(cambios)
+ contador += 1
+
+ def preset(self):
+ ''' Iniciando pygame y creando una ventana. '''
+ pygame.init()
+ pygame.display.set_mode(self.resolucion , 0, 0)
+ self.ventana = pygame.display.get_surface()
+
+ def load(self):
+ ''' Creando y seteando todos los objetos de tu juego. '''
+ self.fondo = self.get_Fondo()
+ self.reloj = pygame.time.Clock()
+
+ self.jamclock= JAMClock()
+ self.jamclock1= JAMClock()
+ self.jamclock2= JAMClock()
+ self.jamcalendar= JAMCalendar()
+ self.jamcalendar1= JAMCalendar()
+ self.jamcalendar2= JAMCalendar()
+
+ # los tres de arriba
+ posicion= (25,25)
+ self.jamcalendar.set_posicion(punto= posicion)
+
+ tamanio= self.jamcalendar.get_tamanio()
+ posicion= (posicion[0]+tamanio[0], posicion[1])
+ self.jamclock.set_posicion(punto= posicion)
+
+ tamanio= self.jamclock.get_tamanio()
+ posicion= (posicion[0]+tamanio[0], posicion[1])
+ self.jamcalendar1.set_posicion(punto= posicion)
+
+ # los tres de abajo
+ tamanio= self.jamcalendar.get_tamanio()
+ posicion= (self.jamcalendar.posicion[0], tamanio[1]+ posicion[1])
+ self.jamclock1.set_posicion(punto= posicion)
+
+ tamanio= self.jamclock1.get_tamanio()
+ posicion= (self.jamclock1.posicion[0]+tamanio[0], posicion[1])
+ self.jamcalendar2.set_posicion(punto= posicion)
+
+ tamanio= self.jamcalendar2.get_tamanio()
+ posicion= (self.jamclock.posicion[0]+tamanio[0], posicion[1])
+ self.jamclock2.set_posicion(punto= posicion)
+
+
+ pygame.display.set_caption("Ejemplo de Carga de un Juego con JAMatrix")
+ pygame.event.set_blocked([JOYAXISMOTION, JOYBALLMOTION, JOYHATMOTION, JOYBUTTONUP, JOYBUTTONDOWN,
+ KEYUP, USEREVENT, QUIT, ACTIVEEVENT])
+ pygame.event.set_allowed([MOUSEMOTION, MOUSEBUTTONUP, MOUSEBUTTONDOWN, KEYDOWN, VIDEORESIZE, VIDEOEXPOSE])
+ pygame.mouse.set_visible(True)
+ self.estado= True # Todo se ha cargado y seteado, listo para correr el juego.
+
+ def get_Fondo(self):
+ superficie = pygame.Surface( self.resolucion, flags=HWSURFACE )
+ superficie.fill(VG.get_negro())
+ return superficie
+
+ def handle_event(self):
+ for event in pygame.event.get():
+ if event.type == pygame.KEYDOWN:
+ self.salir()
+ pygame.event.clear()
+
+ def salir(self):
+ pygame.quit()
+ sys.exit()
+
+
+
+if __name__ == "__main__":
+ Ejemplo()