From 9d57ae40095b2928672b2f4b23a87b8d5927753e Mon Sep 17 00:00:00 2001 From: flavio Date: Wed, 07 Dec 2011 23:10:50 +0000 Subject: CucaraSims Base --- (limited to 'BiblioJAM/JAMatrix.py') 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() -- cgit v0.9.1