diff --git a/configuraciones.py b/configuraciones.py new file mode 100644 index 0000000..643c81b --- /dev/null +++ b/configuraciones.py @@ -0,0 +1,58 @@ +#VENTANA +ANCHO_VENTANA = 700 +ALTO_VENTANA = 400 + +#CORDENADA DEL PISO +NIVEL_PISO = 552 +NIVEL_TECHO = 50 + +#FOTOGRAMAS POR SEGUNDO +FPS = 120 + +#RUTA DE IMAGENES +RUTA_IMAGEN = r"C:\Users\lucia\Documents\Castle Defense\recursos\\" #RUTA DE IMAGENES +RUTA_MUSICA = r"C:\Users\lucia\Documents\JUEGO_FINAL\sounds\\" #RUTA DE MUSICA + +#DIRECCION DONDE MIRA EL PERSONAJKE +IZQUIERDA = -1 +DERECHA = 1 + +#TAMAÑO DE COLLIDERECT +ALTURA_PIES = 8 # Aprox Gravedad/2 + 1 + +#MODO DEBUG // DIBUJAR RECTANGULOS +DEBUG = False + +#COLORES +RED = (255,0,0) +GREEN = (0,255,0) +BLUE = (0,0,255) +BLACK = (0,0,0) +WHITE = (255,255,255) +YELLOW = (255,255,0) +CYAN = "#d7fcd4" +DORADO = "#b68f40" + +#ESTADOS +M_STATE_NORMAL = 1 +M_STATE_HOVER = 2 +M_STATE_CLICK = 3 +M_BRIGHT_HOVER = 1 +M_BRIGHT_CLICK = 2 + +#TILED +PLATAFORMA = "P" +PISO = "O" +MURO = "M" +LOOT = "B" +CAJA = "C" +PINCHO = "S" +FONDO_ACIDO = "A" +TOP_ACIDO = "T" +MOBILE = "U" + +CORAZON = RUTA_IMAGEN + r"Menu\Button\Health_Dot.png" +BALA = RUTA_IMAGEN + r"Menu\Button\Armor_Bar_Dot.png" + + + diff --git a/gui_button.py b/gui_button.py new file mode 100644 index 0000000..1c7a277 --- /dev/null +++ b/gui_button.py @@ -0,0 +1,39 @@ +import pygame +from pygame.locals import * +from gui_widget import Widget +from configuraciones import * + + +class Button(Widget): + def __init__(self,master,x=0,y=0,w=200,h=50,color_background=GREEN,color_border=RED,image_background=None,text="Button",font="Arial",font_size=14,font_color=BLUE,on_click=None,on_click_param=None): + super().__init__(master,x,y,w,h,color_background,color_border,image_background,text,font,font_size,font_color) + self.on_click = on_click + self.on_click_param = on_click_param + self.state = M_STATE_NORMAL + self.render() + + def render(self): + super().render() + if self.state == M_STATE_HOVER: # Se aclara la imagen + self.slave_surface.fill(M_BRIGHT_HOVER, special_flags=pygame.BLEND_RGB_ADD) + elif self.state == M_STATE_CLICK: # Se oscurece la imagen + self.slave_surface.fill(M_BRIGHT_CLICK, special_flags=pygame.BLEND_RGB_SUB) + + def update(self,lista_eventos): + mousePos = pygame.mouse.get_pos() + self.state = M_STATE_NORMAL + if self.slave_rect_collide.collidepoint(mousePos): + if(pygame.mouse.get_pressed()[0]): + self.state = M_STATE_CLICK + else: + self.state = M_STATE_HOVER + + for evento in lista_eventos: + if evento.type == pygame.MOUSEBUTTONDOWN: + if(self.slave_rect_collide.collidepoint(evento.pos)): + self.on_click(self.on_click_param) + + self.render() + + + diff --git a/gui_form.py b/gui_form.py new file mode 100644 index 0000000..cc36b56 --- /dev/null +++ b/gui_form.py @@ -0,0 +1,43 @@ +import pygame +from configuraciones import * +from pygame.locals import * + +class Form(): + forms_dict = {} + def __init__(self,name,master_surface,x,y,w,h,color_background,imagen_background,color_border,active): + self.forms_dict[name] = self + self.master_surface = master_surface + self.x = x + self.y = y + self.w = w + self.h = h + self.color_background = color_background + self.color_border = color_border + self.imagen_background = imagen_background + + self.surface = pygame.Surface((w,h)) + self.slave_rect = self.surface.get_rect() + self.slave_rect.x = x + self.slave_rect.y = y + self.active = active + + if self.imagen_background != None: + self.imagen_background = pygame.image.load(imagen_background) + self.imagen_background = pygame.transform.scale(self.imagen_background,(self.w,self.h)).convert_alpha() + self.surface = self.imagen_background + elif(self.color_background != None): + self.surface.fill(self.color_background) + + def set_active(self,name): + for aux_form in self.forms_dict.values(): + aux_form.active = False + self.forms_dict[name].active = True + + def render(self): + pass + + def update(self,lista_eventos): + pass + + def draw(self): + self.master_surface.blit(self.surface,self.slave_rect) diff --git a/gui_manager.py b/gui_manager.py new file mode 100644 index 0000000..81f2b10 --- /dev/null +++ b/gui_manager.py @@ -0,0 +1,32 @@ +from pygame.locals import * +from configuraciones import * +from gui_nivel import FormNivel + + +class FormManager(): + """ + Formulario manager que crea los demas formularios, los actualiza y dibuj, asi como tambien se fija cual mostrar en pantalla + """ + def __init__(self,pantalla) -> None: + self.pantalla = pantalla + self.form_nivel_1 = self.crear_nivel("nivel_1",RUTA_IMAGEN + "fondo\MetalSlug-Mission2.jpg") + self.niveles = [self.form_nivel_1] + + def crear_nivel(self,nivel,fondo): + """ + Este metodo se encarga de crear el formulario nivel + Parametros: recibe un str que representa la clave del nivel a crear + Retorna: un objeto que representa al formulario del nivel + """ + return FormNivel(name=nivel,master_surface = self.pantalla,x=0,y=0,w=ANCHO_VENTANA,h=ALTO_VENTANA,imagen_background=fondo,color_background=BLACK,color_border=BLACK,active=True) + + + def actualizar_forms(self,eventos): + """ + Este metodo se encarga de actualizar y dibujar el formulario que este activo + Parametros: una lista de eventos, teclas, sonidos, tambien un valor delta_ms, y un evento de usuario de tiempo + """ + + if(self.form_nivel_1.active): + self.form_nivel_1.update(eventos) + self.form_nivel_1.draw() \ No newline at end of file diff --git a/gui_nivel.py b/gui_nivel.py new file mode 100644 index 0000000..47e5604 --- /dev/null +++ b/gui_nivel.py @@ -0,0 +1,44 @@ +import pygame +from pygame.locals import * +from configuraciones import * +from gui_form import Form +from gui_progressbar import ProgressBar +from gui_widget import Widget + +class FormNivel(Form): + """ + Formulario que maneja el nivel, dependiendo de cual se cargue + """ + def __init__(self, name, master_surface, x=0, y=0, w=ANCHO_VENTANA, h=ALTO_VENTANA, imagen_background=None, color_background=None, color_border=None, active=False): + self.name = name + self.tiempo_juego = 0 + self.puntuacion = 0 + super().__init__(name, master_surface, x, y, w, h, color_background, imagen_background, color_border, active) + + self.text1 = Widget(master=self,x=450,y=45,w=25,h=25,color_background=None,color_border=DORADO,image_background=RUTA_IMAGEN + "interface\Marco.png",text=None,font=None,font_size=None,font_color=None) + self.text2 = Widget(master=self,x=480,y=45,w=25,h=25,color_background=None,color_border=DORADO,image_background=RUTA_IMAGEN + "interface\Marco.png",text=None,font=None,font_size=None,font_color=None) + self.text3 = Widget(master=self,x=510,y=45,w=25,h=25,color_background=None,color_border=DORADO,image_background=RUTA_IMAGEN + "interface\Marco.png",text=None,font=None,font_size=None,font_color=None) + self.text4 = Widget(master=self,x=540,y=45,w=25,h=25,color_background=None,color_border=DORADO,image_background=RUTA_IMAGEN + "interface\Marco.png",text=None,font=None,font_size=None,font_color=None) + self.text5 = Widget(master=self,x=570,y=45,w=25,h=25,color_background=None,color_border=DORADO,image_background=RUTA_IMAGEN + "interface\Marco.png",text=None,font=None,font_size=None,font_color=None) + self.text6 = Widget(master=self,x=600,y=45,w=25,h=25,color_background=None,color_border=DORADO,image_background=RUTA_IMAGEN + "interface\Marco.png",text=None,font=None,font_size=None,font_color=None) + self.text7 = Widget(master=self,x=630,y=45,w=25,h=25,color_background=None,color_border=DORADO,image_background=RUTA_IMAGEN + "interface\Marco.png",text=None,font=None,font_size=None,font_color=None) + self.text8 = Widget(master=self,x=660,y=45,w=25,h=25,color_background=None,color_border=DORADO,image_background=RUTA_IMAGEN + "interface\Marco.png",text=None,font=None,font_size=None,font_color=None) + self.text9 = Widget(master=self,x=600,y=10,w=100,h=25,color_background=None,color_border=None,image_background=None,text="{0}".format(self.tiempo_juego),font="IMPACT",font_size=30,font_color=WHITE) + self.text10 = Widget(master=self,x=300,y=10,w=100,h=25,color_background=None,color_border=None,image_background=None,text="{0}".format(self.puntuacion),font="IMPACT",font_size=30,font_color=WHITE) + + self.lista_widget = [self.text1,self.text2,self.text3,self.text4,self.text5,self.text6,self.text7,self.text8,self.text9,self.text10] + + + def update(self, lista_eventos): + for aux_widget in self.lista_widget: + aux_widget.update(lista_eventos) + + + def draw(self): + super().draw() + for aux_widget in self.lista_widget: + aux_widget.draw() + + + + \ No newline at end of file diff --git a/gui_progressbar.py b/gui_progressbar.py new file mode 100644 index 0000000..955ab19 --- /dev/null +++ b/gui_progressbar.py @@ -0,0 +1,29 @@ +import pygame +from pygame.locals import * +from gui_widget import Widget +from configuraciones import * + + +class ProgressBar(Widget): + def __init__(self,master,x=0,y=0,w=200,h=50,color_background=None,color_border=None,image_background=None,image_progress=None,value=1,value_max=5): + super().__init__(master,x,y,w,h,color_background,color_border,image_background,None,None,None,None) + + + self.surface_element = pygame.image.load(image_progress) + self.surface_element = pygame.transform.scale(self.surface_element,(w/value_max, h)).convert_alpha() + + self.value=value + self.value_max=value_max + self.render() + + def render(self): + super().render() + for x in range(self.value): + self.slave_surface.blit(self.surface_element, (x*self.w/self.value_max, 0)) + + def update(self,lista_eventos): + + self.render() + + + diff --git a/gui_textbox.py b/gui_textbox.py new file mode 100644 index 0000000..46a4323 --- /dev/null +++ b/gui_textbox.py @@ -0,0 +1,46 @@ +import pygame +from pygame.locals import * +from gui_widget import Widget +from configuraciones import * + + +class TextBox(Widget): + def __init__(self,master,x=0,y=0,w=200,h=50,color_background=GREEN,color_border=RED,image_background=None,text="Button",font="Arial",font_size=14,font_color=BLUE,on_click=None,on_click_param=None): + super().__init__(master,x,y,w,h,color_background,color_border,image_background,text,font,font_size,font_color) + self.on_click = on_click + self.on_click_param = on_click_param + self.state = M_STATE_NORMAL + self.writing_flag = False + self.render() + + def render(self): + super().render() + if self.state == M_STATE_HOVER: # Se aclara la imagen + self.slave_surface.fill(M_BRIGHT_HOVER, special_flags=pygame.BLEND_RGB_ADD) + elif self.state == M_STATE_CLICK: # Se oscurece la imagen + self.slave_surface.fill(M_BRIGHT_CLICK, special_flags=pygame.BLEND_RGB_SUB) + + def update(self,lista_eventos): + mousePos = pygame.mouse.get_pos() + self.state = M_STATE_NORMAL + if self.slave_rect_collide.collidepoint(mousePos): + if(self.writing_flag): + self.state = M_STATE_CLICK + else: + self.state = M_STATE_HOVER + + for evento in lista_eventos: + if evento.type == pygame.MOUSEBUTTONDOWN : + self.writing_flag = self.slave_rect_collide.collidepoint(evento.pos) + if evento.type == pygame.KEYDOWN and self.writing_flag: + if evento.key == pygame.K_RETURN: + self.writing_flag = False + elif evento.key == pygame.K_BACKSPACE: + self._text = self._text[:-1] + else: + self._text += evento.unicode + + self.render() + + + diff --git a/gui_widget.py b/gui_widget.py new file mode 100644 index 0000000..5a050f3 --- /dev/null +++ b/gui_widget.py @@ -0,0 +1,55 @@ +import pygame +from pygame.locals import * +from configuraciones import * + +class Widget: + def __init__(self,master,x,y,w,h,color_background,color_border,image_background,text,font,font_size,font_color): + self.master = master + self.x = x + self.y = y + self.w = w + self.h = h + self.color_background = color_background + self.color_border = color_border + if image_background != None: + self.image_background = pygame.image.load(image_background) + self.image_background = pygame.transform.scale(self.image_background,(w, h)).convert_alpha() + else: + self.image_background = None + self._text = text + if(self._text != None): + pygame.font.init() + self._font_sys = pygame.font.SysFont(font,font_size) + self._font_color = font_color + + def render(self): + + self.slave_surface = pygame.Surface((self.w,self.h), pygame.SRCALPHA) + self.slave_rect = self.slave_surface.get_rect() + self.slave_rect.x = self.x + self.slave_rect.y = self.y + self.slave_rect_collide = pygame.Rect(self.slave_rect) + self.slave_rect_collide.x += self.master.x + self.slave_rect_collide.y += self.master.y + + if self.color_background: + self.slave_surface.fill(self.color_background) + + if self.image_background: + self.slave_surface.blit(self.image_background,(0,0)) + + if(self._text != None): + image_text = self._font_sys.render(self._text,True,self._font_color,self.color_background) + self.slave_surface.blit(image_text,[ + self.slave_rect.width/2 - image_text.get_rect().width/2, + self.slave_rect.height/2 - image_text.get_rect().height/2 + ]) + + if self.color_border: + pygame.draw.rect(self.slave_surface, self.color_border, self.slave_surface.get_rect(), 2) + + def update(self,lista_eventos): + self.render() + + def draw(self): + self.master.surface.blit(self.slave_surface,self.slave_rect) diff --git a/main.py b/main.py new file mode 100644 index 0000000..325fc62 --- /dev/null +++ b/main.py @@ -0,0 +1,42 @@ +import pygame +from pygame.locals import * +import sys +from configuraciones import * +from gui_manager import * + + +flags = DOUBLEBUF +PANTALLA = pygame.display.set_mode((ANCHO_VENTANA,ALTO_VENTANA), flags, 16) +pygame.init() +clock = pygame.time.Clock() + +juego = FormManager(PANTALLA) + +timer_1s = pygame.USEREVENT + 0 +pygame.time.set_timer(timer_1s,1000) + +while True: + eventos = pygame.event.get() + for event in eventos: + if event.type == pygame.QUIT: + pygame.quit() + sys.exit() + + delta_ms = clock.tick(FPS) + + juego.actualizar_forms(eventos) + + pygame.display.flip() + + + + + + + + + + + + +