## ######################################################################
##                              PROG_TIC
## ######################################################################
## Librería de utililerías para juegos 2D (funciona sobre pygame).
## Pensado para hacer juegos en la asignatura de TIC I en 1º de Bachillerato
## ######################################################################
##
## Clases que incluye:
##  Graficador: Sirve para crear gráficos en BMP a dos colores a partir de
##              un array de enteros (cada entero en binario representa una
##				línea de bits). Se puede añadir píxeles del color que se quiera.

##  Ventana: 	Clase que muestra una ventana con su título y ejecuta el método
## 				run de una clase que le ha de pasar al método. Es la base para 
##              crear juego, pues al redefinir el método run, Ventana ejecuta
##				este cada "frame" del juego. 

## Métodos: 
## cargaGrafico(fichero): dado un fichero en bmp, devuelve un objeto "grafico"
##                      propio de la librería pygame. Dicho gráfico se reescala
##                      al tamaño dado en la librería TAM_GRAF.

## Variables:
## TAM_GRAF: factor de escala de los gráficos.
## TAM_X: anchura en píxeles de la ventana. Por defecto 480.
## TAM_Y: altura en píxeles de la ventana. Por defecto 320.

## Define los colores: AZUL, ROJO, VERDE, AMARILLO, BLANCO, NEGRO, GRIS, GRIS_CLARO
## Inicializar la librería pygame.
## define una variable "pantalla" con el manejardor
## gráfico para imprimir en este los diferentes gráficos.

import pygame

##  Graficador: Sirve para crear gráficos en BMP a partir de un array de enteros
##              (cada entero en binario representa una línea de bits.)
class Graficador:
	def __init__(self, decimals, nombreFich):
		self.decimals=decimals
		self.nombreFich=nombreFich
		self.colorTinta=(255,255,255)
		self.colorFondo=(0,0,0)
		self.pixeles=[]
		
	def setColorFondo(self,color):
		self.colorFondo=color
		
	def setColorTinta(self,color):
		self.colorTinta=color
		
	def setColorTintaEn(self,fil,col,color):
		self.pixeles.append([col,fil,color])
		
	def creaBMP(self):
		# Array de decimales que representan filas de bits
		rows = len(self.decimals)
		cols = len(self.decimals)

		# Crear superficie
		surface = pygame.Surface((cols, rows))

		for y, val in enumerate(self.decimals):
			binary_str = f"{val:10b}"
			for x, b in enumerate(binary_str):
				color = self.colorTinta if b == "1" else self.colorFondo
				surface.set_at((x, y), color)
		for pix in self.pixeles:
			surface.set_at((pix[0],pix[1]),pix[2])

		# Guardar como BMP
		pygame.image.save(surface, self.nombreFich)


## Variables que definenen el tamaño de la ventana.
TAM_GRAF = 16  # Factor de escala de los gráficos.
TAM_X = 480
TAM_Y = 320
pantalla = pygame.display.set_mode((TAM_X, TAM_Y))

## Clase que muestra una ventana con su título y ejecuta el método
## run de una clase que le ha de pasar al método 
class Ventana:
	def __init__(self,titulo):
		pygame.display.set_caption(titulo)
		
	def execute(self,mod):
		running = True
		while running:
			for event in pygame.event.get():
				if event.type == pygame.QUIT:
					running = False
			mod.run()
	
def cargaGrafico(fichero):
	graf = pygame.image.load(fichero)
	return pygame.transform.scale(graf, (TAM_GRAF, TAM_GRAF))
			
pygame.init()

## Definición de colores.
AZUL=(0,0,255)
VERDE=(0,255,0)
ROJO=(255,0,0)
NEGRO=(0,0,0)
GRIS=(127,127,127)
GRIS_CLARO=(190,190,190)
BLANCO=(255,255,255)
AMARILLO=(255,255,0)

