[{"data":1,"prerenderedAt":4697},["ShallowReactive",2],{"navigation_docs":3,"-archivos-ui-rpg-ui-1":412,"-archivos-ui-rpg-ui-1-surround":4692},[4,18,43,118,160,200,231,320,346],{"title":5,"path":6,"stem":7,"children":8,"icon":17},"Evaluación","\u002Fintroduction","1.introduction\u002F1.index",[9,12],{"title":10,"path":6,"stem":7,"icon":11},"Método de Evaluación","i-iconamoon-cheque-bold",{"title":13,"path":14,"stem":15,"icon":16},"Plataforma de Aprendizaje","\u002Fintroduction\u002Fplataforma","1.introduction\u002F2.plataforma","i-lucide-book-marked","i-lucide-house",{"title":19,"icon":20,"path":21,"stem":22,"children":23,"page":42},"Entorno de desarrollo","i-codicon-edit-code","\u002Fide","2.ide",[24,28,33,37],{"title":25,"path":26,"stem":27,"icon":20},"¿Qué es un IDE?","\u002Fide\u002Fentorno","2.ide\u002F1.entorno",{"title":29,"path":30,"stem":31,"icon":32},"Estructura de un Proyecto","\u002Fide\u002Festructura","2.ide\u002F2.estructura","i-clarity-tree-view-line",{"title":34,"path":35,"stem":36,"icon":20},"La compilación en un IDE","\u002Fide\u002Fcompilacion","2.ide\u002F3.compilacion",{"title":38,"path":39,"stem":40,"icon":41},"Depuración de Código","\u002Fide\u002Fdepurar","2.ide\u002F4.depurar","i-lucide-bug",false,{"title":44,"icon":45,"path":46,"stem":47,"children":48,"page":42},"Clases y Objetos","i-catppuccin-java-class","\u002Fclases-objetos","3.clases-objetos",[49,53,57,62,66,70,74,78,83,88,92,96,101,106,110,114],{"title":50,"path":51,"stem":52},"Repaso previo a Clases y Objetos","\u002Fclases-objetos\u002Fpreview","3.clases-objetos\u002F00.preview",{"title":54,"path":55,"stem":56,"icon":45},"¿Qué es la Programación Orientada a Objetos (POO)?","\u002Fclases-objetos\u002Fpoo","3.clases-objetos\u002F01.poo",{"title":58,"path":59,"stem":60,"icon":61},"Diagramas de Clases y Objetos","\u002Fclases-objetos\u002Fdiagramas","3.clases-objetos\u002F02.diagramas","i-devicon-uml",{"title":63,"path":64,"stem":65,"icon":45},"Las Clases","\u002Fclases-objetos\u002Fclases","3.clases-objetos\u002F03.clases",{"title":67,"path":68,"stem":69,"icon":45},"Ámbito y Visibilidad","\u002Fclases-objetos\u002Fambito","3.clases-objetos\u002F04.ambito",{"title":71,"path":72,"stem":73,"icon":45},"Declaración e Instanciación de Objetos","\u002Fclases-objetos\u002Fobjetos","3.clases-objetos\u002F05.objetos",{"title":75,"path":76,"stem":77,"icon":45},"Clases Predefinidas en Java","\u002Fclases-objetos\u002Fpredefinidas","3.clases-objetos\u002F06.predefinidas",{"title":79,"path":80,"stem":81,"icon":82},"Paquetes en Java","\u002Fclases-objetos\u002Fpaquetes","3.clases-objetos\u002F07.paquetes","i-material-icon-theme-folder-java-open",{"title":84,"path":85,"stem":86,"icon":87},"Las Excepciones","\u002Fclases-objetos\u002Fexcepciones","3.clases-objetos\u002F08.excepciones","i-catppuccin-java-exception",{"title":89,"path":90,"stem":91,"icon":45},"La clase JOptionPane","\u002Fclases-objetos\u002Fjoptionpane","3.clases-objetos\u002F09.joptionpane",{"title":93,"path":94,"stem":95,"icon":45},"Constructores y Accesores","\u002Fclases-objetos\u002Fconstructores","3.clases-objetos\u002F10.constructores",{"title":97,"path":98,"stem":99,"icon":100},"Tipos Enumerados (Enums)","\u002Fclases-objetos\u002Fenumerados","3.clases-objetos\u002F11.enumerados","i-catppuccin-java-enum",{"title":102,"path":103,"stem":104,"icon":105},"Modificadores de acceso static y final","\u002Fclases-objetos\u002Fmodificadores","3.clases-objetos\u002F12.modificadores","i-mdi-chart-box",{"title":107,"path":108,"stem":109,"icon":105},"El casting en Java","\u002Fclases-objetos\u002Fcasting","3.clases-objetos\u002F13.casting",{"title":111,"path":112,"stem":113},"Las Expresiones Regulares","\u002Fclases-objetos\u002Fexpresiones-regulares","3.clases-objetos\u002F14.expresiones-regulares",{"title":115,"path":116,"stem":117,"icon":105},"Clases Genéricas en Java","\u002Fclases-objetos\u002Fclases-genericas","3.clases-objetos\u002F15.clases-genericas",{"title":119,"icon":120,"path":121,"stem":122,"children":123,"page":42},"Funciones (Métodos)","i-material-symbols-function","\u002Fmetodos","4.metodos",[124,128,132,136,140,144,148,152,156],{"title":125,"path":126,"stem":127},"Funciones Genéricas","\u002Fmetodos\u002Ffuncion-generica","4.metodos\u002F01.funcion-generica",{"title":129,"path":130,"stem":131},"Métodos de Instancia y de Clase","\u002Fmetodos\u002Finstancia-clase","4.metodos\u002F02.instancia-clase",{"title":133,"path":134,"stem":135},"Sobrecarga de Funciones","\u002Fmetodos\u002Fsobrecarga","4.metodos\u002F03.sobrecarga",{"title":137,"path":138,"stem":139},"Alcance de Variables y Métodos","\u002Fmetodos\u002Falcance","4.metodos\u002F04.alcance",{"title":141,"path":142,"stem":143},"Recursividad","\u002Fmetodos\u002Frecursividad","4.metodos\u002F05.recursividad",{"title":145,"path":146,"stem":147},"Puntero this","\u002Fmetodos\u002Fthis","4.metodos\u002F06.this",{"title":149,"path":150,"stem":151},"Los argumentos variables (varargs)","\u002Fmetodos\u002Fvarargs","4.metodos\u002F07.varargs",{"title":153,"path":154,"stem":155},"La clase Arrays","\u002Fmetodos\u002Farrays","4.metodos\u002F08.arrays",{"title":157,"path":158,"stem":159},"Predicados Simples y Compuestos en Java","\u002Fmetodos\u002Fpredicados","4.metodos\u002F09.predicados",{"title":161,"path":162,"stem":163,"children":164,"icon":199},"Herencia","\u002Fherencia","5.herencia\u002F01.index",[165,167,171,175,179,183,187,191,195],{"title":166,"path":162,"stem":163},"¿Qué es la herencia?",{"title":168,"path":169,"stem":170},"Sobreescritura de métodos y uso de `super`","\u002Fherencia\u002Fsobeescritura","5.herencia\u002F02.sobeescritura",{"title":172,"path":173,"stem":174},"Tipos de herencia","\u002Fherencia\u002Ftipos-herencia","5.herencia\u002F03.tipos-herencia",{"title":176,"path":177,"stem":178},"La clase Object en Java","\u002Fherencia\u002Fobject","5.herencia\u002F04.object",{"title":180,"path":181,"stem":182},"Polimorfismo","\u002Fherencia\u002Fpolimorfismo","5.herencia\u002F05.polimorfismo",{"title":184,"path":185,"stem":186},"Clases y Funciones Abstractas","\u002Fherencia\u002Fabstract","5.herencia\u002F06.abstract",{"title":188,"path":189,"stem":190},"Interfaces","\u002Fherencia\u002Finterfaces","5.herencia\u002F07.interfaces",{"title":192,"path":193,"stem":194},"Funciones e Interfaces","\u002Fherencia\u002Ffunciones-interfaces","5.herencia\u002F08.funciones-interfaces",{"title":196,"path":197,"stem":198},"Interfaces y Funciones Lambda","\u002Fherencia\u002Flambda-interface","5.herencia\u002F09.lambda-interface","i-material-symbols-heritage",{"title":201,"path":202,"stem":203,"children":204,"icon":199},"Arreglos","\u002Farreglos","6.arreglos\u002F01.index",[205,207,211,215,219,223,227],{"title":206,"path":202,"stem":203},"Los arreglos en Java",{"title":208,"path":209,"stem":210},"Los arreglos","\u002Farreglos\u002Farray","6.arreglos\u002F02.array",{"title":212,"path":213,"stem":214},"Matrices","\u002Farreglos\u002Fmatrices","6.arreglos\u002F03.matrices",{"title":216,"path":217,"stem":218},"Comparadores","\u002Farreglos\u002Fcomparator","6.arreglos\u002F04.comparator",{"title":220,"path":221,"stem":222},"Arreglos dinámicos: ArrayList","\u002Farreglos\u002Farraylist","6.arreglos\u002F05.arraylist",{"title":224,"path":225,"stem":226},"Arreglos Relacionales: HashMap","\u002Farreglos\u002Fhashmap","6.arreglos\u002F06.hashmap",{"title":228,"path":229,"stem":230},"La clase Stream en Java","\u002Farreglos\u002Fstream","6.arreglos\u002F07.stream",{"title":232,"icon":199,"path":233,"stem":234,"children":235,"page":42},"Archivos e Interfaz de Usuario","\u002Farchivos-ui","7.archivos-ui",[236,240,244,248,252,256,260,264,268,272,276,280,284,288,292,296,300,304,308,312,316],{"title":237,"path":238,"stem":239},"El paquete Swing","\u002Farchivos-ui\u002Fswing","7.archivos-ui\u002F01.swing",{"title":241,"path":242,"stem":243},"La clase JFrame y el JPanel","\u002Farchivos-ui\u002Fjpanel","7.archivos-ui\u002F02.jpanel",{"title":245,"path":246,"stem":247},"Los Layouts en Swing","\u002Farchivos-ui\u002Flayout","7.archivos-ui\u002F03.layout",{"title":249,"path":250,"stem":251},"Iniciando con Swing","\u002Farchivos-ui\u002Finiciando","7.archivos-ui\u002F04.iniciando",{"title":253,"path":254,"stem":255},"Las clases Color y Font en Swing","\u002Farchivos-ui\u002Fcolor-font","7.archivos-ui\u002F05.color-font",{"title":257,"path":258,"stem":259},"Etiquetas en Swing","\u002Farchivos-ui\u002Fetiquetas","7.archivos-ui\u002F06.etiquetas",{"title":261,"path":262,"stem":263},"Personalizando la apariencia de los componentes en Swing","\u002Farchivos-ui\u002Fpersonalizando","7.archivos-ui\u002F07.personalizando",{"title":265,"path":266,"stem":267},"Sobrescribiendo el método drawComponent() en Swing","\u002Farchivos-ui\u002Fdraw","7.archivos-ui\u002F08.draw",{"title":269,"path":270,"stem":271},"Manejando eventos en Swing","\u002Farchivos-ui\u002Feventos","7.archivos-ui\u002F09.eventos",{"title":273,"path":274,"stem":275},"Personalización de Componentes mediante la Extensión de Clases en Swing","\u002Farchivos-ui\u002Fextends-component","7.archivos-ui\u002F10.extends-component",{"title":277,"path":278,"stem":279},"Gradientes","\u002Farchivos-ui\u002Fgradientes","7.archivos-ui\u002F11.gradientes",{"title":281,"path":282,"stem":283},"Botones en Swing","\u002Farchivos-ui\u002Fbotones","7.archivos-ui\u002F12.botones",{"title":285,"path":286,"stem":287},"Los delegadores en Swing","\u002Farchivos-ui\u002Fdelegadores","7.archivos-ui\u002F13.delegadores",{"title":289,"path":290,"stem":291},"UI para nuestro RPG: Parte 1","\u002Farchivos-ui\u002Frpg-ui-1","7.archivos-ui\u002F14.rpg-ui-1",{"title":293,"path":294,"stem":295},"UI para nuestro RPG: Parte 2","\u002Farchivos-ui\u002Frpg-ui-2","7.archivos-ui\u002F15.rpg-ui-2",{"title":297,"path":298,"stem":299},"Los Streams Entrada y Salida","\u002Farchivos-ui\u002Fstreams","7.archivos-ui\u002F16.streams",{"title":301,"path":302,"stem":303},"Archivo tipo Objeto","\u002Farchivos-ui\u002Farchivo-objeto","7.archivos-ui\u002F17.archivo-objeto",{"title":305,"path":306,"stem":307},"UI para nuestro RPG: Parte 3","\u002Farchivos-ui\u002Frpg-ui-3","7.archivos-ui\u002F18.rpg-ui-3",{"title":309,"path":310,"stem":311},"UI para nuestro RPG: Parte 4","\u002Farchivos-ui\u002Frpg-ui-4","7.archivos-ui\u002F19.rpg-ui-4",{"title":313,"path":314,"stem":315},"UI para nuestro RPG: Parte 5","\u002Farchivos-ui\u002Frpg-ui-5","7.archivos-ui\u002F20.rpg-ui-5",{"title":317,"path":318,"stem":319},"UI para nuestro RPG: Parte 6","\u002Farchivos-ui\u002Frpg-ui-6","7.archivos-ui\u002F21.rpg-ui-6",{"title":321,"icon":322,"path":323,"stem":324,"children":325,"page":42},"Ejemplos","i-check-circle","\u002Fejemplos","8.ejemplos",[326,330,334,338,342],{"title":327,"path":328,"stem":329,"icon":105},"Ejemplo 1: Validando entradas con JOptionPane","\u002Fejemplos\u002Fejemplo-01","8.ejemplos\u002F01.ejemplo-01",{"title":331,"path":332,"stem":333},"Ejemplo 02: Uso de clases genéricas en Java","\u002Fejemplos\u002Fejemplo-02","8.ejemplos\u002F02.ejemplo-02",{"title":335,"path":336,"stem":337},"Ejemplo 03: Uso de Enum, Excepciones en Java","\u002Fejemplos\u002Fejemplo-03","8.ejemplos\u002F03.ejemplo-03",{"title":339,"path":340,"stem":341},"Ejemplo 4: Clase con funciones genéricas de validación","\u002Fejemplos\u002Fejemplo-04","8.ejemplos\u002F04.ejemplo-04",{"title":343,"path":344,"stem":345},"Ejemplo 5: Sistema de Gestión de Empleados","\u002Fejemplos\u002Fejemplo-05","8.ejemplos\u002F05.ejemplo-05",{"title":347,"icon":322,"path":348,"stem":349,"children":350,"page":42},"Actividades","\u002Factividades","9.actividades",[351,355,360,364,368,372,376,380,384,388,392,396,400,404,408],{"title":352,"path":353,"stem":354,"icon":105},"Actividad 1: Infografía sobre el proceso de compilación","\u002Factividades\u002Fact-01","9.actividades\u002F01.act-01",{"title":356,"path":357,"stem":358,"icon":359},"Actividad 2: Modelando Diagramas de Clases UML","\u002Factividades\u002Fact-02","9.actividades\u002F02.act-02","i-material-icon-theme-uml",{"title":361,"path":362,"stem":363,"icon":45},"Actividad 3: Creando Clases y Objetos en Java","\u002Factividades\u002Fact-03","9.actividades\u002F03.act-03",{"title":365,"path":366,"stem":367},"Actividad 4: Validando entradas de datos","\u002Factividades\u002Fact-04","9.actividades\u002F04.act-04",{"title":369,"path":370,"stem":371,"icon":105},"Actividad 5: Implementando una clase genérica","\u002Factividades\u002Fact-05","9.actividades\u002F05.act-05",{"title":373,"path":374,"stem":375,"icon":105},"Actividad 6: Expandiendo InputValidator con Predicados y Function","\u002Factividades\u002Fact-06","9.actividades\u002F06.act-06",{"title":377,"path":378,"stem":379,"icon":105},"Actividad 7: Gestor de Biblioteca con InputValidator","\u002Factividades\u002Fact-07","9.actividades\u002F07.act-07",{"title":381,"path":382,"stem":383,"icon":105},"Actividad 8: Calculadora de Figuras Geométricas","\u002Factividades\u002Fact-08","9.actividades\u002F08.act-08",{"title":385,"path":386,"stem":387,"icon":105},"Actividad 9: gestión de una empresa agroalimentaria","\u002Factividades\u002Fact-09","9.actividades\u002F09.act-09",{"title":389,"path":390,"stem":391,"icon":105},"Actividad 10: Sistema de gestión de clínicas veterinarias","\u002Factividades\u002Fact-10","9.actividades\u002F10.act-10",{"title":393,"path":394,"stem":395},"Definición de Proyecto Evolutivo","\u002Factividades\u002Frpg","9.actividades\u002F11.rpg",{"title":397,"path":398,"stem":399},"Actividad 11: Creación de Personajes","\u002Factividades\u002Fact-11","9.actividades\u002F12.act-11",{"title":401,"path":402,"stem":403},"Actividad 12: El Inventario y los Objetos","\u002Factividades\u002Fact-12","9.actividades\u002F13.act-12",{"title":405,"path":406,"stem":407},"Actividad 13: El combate por turnos","\u002Factividades\u002Fact-13","9.actividades\u002F14.act-13",{"title":409,"path":410,"stem":411},"Actividad 14: Guardando y Cargando","\u002Factividades\u002Fact-14","9.actividades\u002F15.act-14",{"id":413,"title":289,"body":414,"description":4686,"extension":4687,"links":4688,"meta":4689,"navigation":572,"path":290,"seo":4690,"stem":291,"__hash__":4691},"docs\u002F7.archivos-ui\u002F14.rpg-ui-1.md",{"type":415,"value":416,"toc":4674},"minimark",[417,422,426,430,446,449,452,458,462,465,502,506,509,519,529,533,537,540,543,1159,1166,1170,1181,2264,2285,2289,2295,2300,2303,3061,3071,3483,3506,3904,3919,4260,4270,4273,4632,4652,4655,4659,4670],[418,419,421],"h2",{"id":420},"diseño-de-la-interfaz-gráfica-para-nuestro-rpg","Diseño de la Interfaz Gráfica para nuestro RPG",[423,424,425],"p",{},"Hasta ahora hemos visto cómo crear componentes personalizados y manejar eventos en Swing, lo que nos ha dado una base sólida para comenzar a diseñar la interfaz gráfica de nuestro RPG. En esta sección, comenzaremos a construir la ventana principal de nuestro juego y los componentes básicos para la gestión de personajes.",[418,427,429],{"id":428},"ventana-de-inicio-carga-y-creación-de-personajes","Ventana de Inicio, Carga y Creación de Personajes",[423,431,432,433,437,438,441,442,445],{},"Para la ventana de inicio, carga y creación de personajes, podemos diseñar una interfaz que permita a los jugadores seleccionar entre crear un nuevo personaje o cargar uno existente. Esto se puede lograr utilizando componentes como ",[434,435,436],"code",{},"JButton"," para las opciones de creación y carga, y ",[434,439,440],{},"JPanel"," para organizar los componentes en la ventana, y ",[434,443,444],{},"JLabel"," para mostrar información relevante.",[423,447,448],{},"Entonces, podríamos tener una ventana principal con un título, cuatro paneles para los slots de personajes, y botones para crear, cargar o eliminar personajes. Cada panel de personaje podría mostrar información básica del personaje, como su nombre, clase, y nivel.",[423,450,451],{},"Por consiguiente, la interfaz ser veriá algo así:",[423,453,454],{},[455,456],"img",{"alt":457,"src":457},"ui-1.png",[418,459,461],{"id":460},"componentes-para-la-gestión-de-personajes","Componentes para la Gestión de Personajes",[423,463,464],{},"Para la gestión de la interfaz anterior, necesitamos lo siguientes componentes:",[466,467,468,476,481,486,491,496],"ul",{},[469,470,471,475],"li",{},[472,473,474],"strong",{},"JFrame",": Para la ventana principal del juego.",[469,477,478,480],{},[472,479,440],{},": Para organizar los componentes dentro de la ventana.",[469,482,483,485],{},[472,484,444],{},": Para mostrar el Slot de personaje.",[469,487,488,490],{},[472,489,444],{},": Para mostrar los atributos del personaje (nombre, clase, nivel).",[469,492,493,495],{},[472,494,436],{},": Para crear, cargar o eliminar personajes.",[469,497,498,501],{},[472,499,500],{},"JOptionPane",": Para mostrar diálogos de creación y carga de personajes.",[418,503,505],{"id":504},"estructura-de-carpetas-para-la-interfaz-gráfica","Estructura de carpetas para la Interfaz Gráfica",[423,507,508],{},"Para mantener nuestro proyecto organizado, podemos seguir una estructura de carpetas que separe claramente los diferentes componentes de la interfaz gráfica. De tal razón que la estructura de carpetas podría ser la siguiente:",[510,511,516],"pre",{"className":512,"code":514,"language":515},[513],"language-text","📦 RPG Project\n├─ resources\n└── src\n   └─ app\n      └─ game\n         └─ rpg\n            ├─ ui\n            │  └─ components\n            │     ├─ borders\n            │     ├─ frames\n            │     ├─ panels\n            │     ├─ buttons\n            │     ├─ labels\n            │     ├─ dialogs\n            │     ├─ delegates\n            │     ├─ listeners\n            │     └─ utils\n            ├─ entities\n            ├─ controllers\n            ├─ views\n            └─ models\n","text",[434,517,514],{"__ignoreMap":518},"",[423,520,521,522],{},"©generated by ",[523,524,528],"a",{"href":525,"rel":526},"https:\u002F\u002Fwoochanleee.github.io\u002Fproject-tree-generator",[527],"nofollow","Project Tree Generator",[530,531,532],"note",{},"Esta estructura de carpetas es solo una sugerencia y puede ser ajustada según las necesidades específicas de tu proyecto. Lo importante es mantener una organización clara y coherente para facilitar el desarrollo y mantenimiento de la interfaz gráfica de tu RPG. Al separar los componentes en diferentes carpetas, podrás encontrar y modificar fácilmente los archivos relacionados con cada aspecto de la interfaz gráfica, lo que mejorará tu productividad y facilitará la colaboración con otros desarrolladores si estás trabajando en equipo.",[418,534,536],{"id":535},"los-colores-de-la-interfaz-gráfica","Los colores de la interfaz gráfica",[423,538,539],{},"En cierta medida, el diseño de la interfaz gráfica de nuestro RPG también puede beneficiarse de una paleta de colores bien definida. Para mantener una apariencia coherente y atractiva, podemos elegir colores que se ajusten al tema de nuestro juego. Por ejemplo, podríamos optar por tonos oscuros y cálidos para un RPG de fantasía, o colores más brillantes y vibrantes para un RPG de ciencia ficción. Además, es importante considerar la accesibilidad y asegurarse de que los colores elegidos sean legibles y no causen fatiga visual a los jugadores.",[423,541,542],{},"Por consiguiente definiremos una paleta de colores que incluya colores para el fondo, los botones, los textos y los bordes. Esto nos ayudará a mantener una apariencia consistente en toda la interfaz gráfica y a crear una experiencia visual atractiva para los jugadores.",[544,545,546],"code-collapse",{},[510,547,552],{"className":548,"code":549,"filename":550,"language":551,"meta":518,"style":518},"language-java shiki shiki-themes github-dark","package app.game.rpg.utils;\n\nimport java.awt.*;\n\npublic class ColorPalette {\n\n    public static Color GREEN_TOP = new Color(35, 165, 35);\n    public static Color GREEN_BOTTOM = new Color(15, 73, 15);\n\n    public static Color GREEN_HOVER_TOP = GREEN_TOP.brighter();\n    public static Color GREEN_HOVER_BOTTOM = GREEN_BOTTOM.brighter();\n\n    public static Color GREEN_PRESSED_TOP = GREEN_TOP.darker();\n    public static Color GREEN_PRESSED_BOTTOM = GREEN_BOTTOM.darker();\n\n    public static Color RED_TOP = new Color(191, 37, 37);\n    public static Color RED_BOTTOM = new Color(80, 16, 16);\n\n    public static Color RED_HOVER_TOP = RED_TOP.brighter();\n    public static Color RED_HOVER_BOTTOM = RED_BOTTOM.brighter();\n\n    public static Color RED_PRESSED_TOP = RED_TOP.darker();\n    public static Color RED_PRESSED_BOTTOM = RED_BOTTOM.darker();\n\n    public static Color BLUE_TOP = new Color(10, 111, 178);\n    public static Color BLUE_BOTTOM = new Color(5, 55, 89);\n\n    public static Color BLUE_HOVER_TOP = BLUE_TOP.brighter();\n    public static Color BLUE_HOVER_BOTTOM = BLUE_BOTTOM.brighter();\n\n    public static Color BLUE_PRESSED_TOP = BLUE_TOP.darker();\n    public static Color BLUE_PRESSED_BOTTOM = BLUE_BOTTOM.darker();\n\n    public static Color BORDER_LIGHT = new Color(255, 215, 0);\n    public static Color BORDER_DARK = new Color(128, 64, 0);\n}\n","app.game.rpg.utils.ColorPalette.java","java",[434,553,554,567,574,590,595,611,616,656,688,693,714,733,738,757,775,780,812,844,849,868,887,892,910,928,933,966,999,1004,1023,1042,1047,1065,1083,1088,1121,1153],{"__ignoreMap":518},[555,556,559,563],"span",{"class":557,"line":558},"line",1,[555,560,562],{"class":561},"snl16","package",[555,564,566],{"class":565},"s95oV"," app.game.rpg.utils;\n",[555,568,570],{"class":557,"line":569},2,[555,571,573],{"emptyLinePlaceholder":572},true,"\n",[555,575,577,580,583,587],{"class":557,"line":576},3,[555,578,579],{"class":561},"import",[555,581,582],{"class":565}," java.awt.",[555,584,586],{"class":585},"sDLfK","*",[555,588,589],{"class":565},";\n",[555,591,593],{"class":557,"line":592},4,[555,594,573],{"emptyLinePlaceholder":572},[555,596,598,601,604,608],{"class":557,"line":597},5,[555,599,600],{"class":561},"public",[555,602,603],{"class":561}," class",[555,605,607],{"class":606},"svObZ"," ColorPalette",[555,609,610],{"class":565}," {\n",[555,612,614],{"class":557,"line":613},6,[555,615,573],{"emptyLinePlaceholder":572},[555,617,619,622,625,628,631,634,637,640,643,646,649,651,653],{"class":557,"line":618},7,[555,620,621],{"class":561},"    public",[555,623,624],{"class":561}," static",[555,626,627],{"class":565}," Color GREEN_TOP ",[555,629,630],{"class":561},"=",[555,632,633],{"class":561}," new",[555,635,636],{"class":606}," Color",[555,638,639],{"class":565},"(",[555,641,642],{"class":585},"35",[555,644,645],{"class":565},", ",[555,647,648],{"class":585},"165",[555,650,645],{"class":565},[555,652,642],{"class":585},[555,654,655],{"class":565},");\n",[555,657,659,661,663,666,668,670,672,674,677,679,682,684,686],{"class":557,"line":658},8,[555,660,621],{"class":561},[555,662,624],{"class":561},[555,664,665],{"class":565}," Color GREEN_BOTTOM ",[555,667,630],{"class":561},[555,669,633],{"class":561},[555,671,636],{"class":606},[555,673,639],{"class":565},[555,675,676],{"class":585},"15",[555,678,645],{"class":565},[555,680,681],{"class":585},"73",[555,683,645],{"class":565},[555,685,676],{"class":585},[555,687,655],{"class":565},[555,689,691],{"class":557,"line":690},9,[555,692,573],{"emptyLinePlaceholder":572},[555,694,696,698,700,703,705,708,711],{"class":557,"line":695},10,[555,697,621],{"class":561},[555,699,624],{"class":561},[555,701,702],{"class":565}," Color GREEN_HOVER_TOP ",[555,704,630],{"class":561},[555,706,707],{"class":565}," GREEN_TOP.",[555,709,710],{"class":606},"brighter",[555,712,713],{"class":565},"();\n",[555,715,717,719,721,724,726,729,731],{"class":557,"line":716},11,[555,718,621],{"class":561},[555,720,624],{"class":561},[555,722,723],{"class":565}," Color GREEN_HOVER_BOTTOM ",[555,725,630],{"class":561},[555,727,728],{"class":565}," GREEN_BOTTOM.",[555,730,710],{"class":606},[555,732,713],{"class":565},[555,734,736],{"class":557,"line":735},12,[555,737,573],{"emptyLinePlaceholder":572},[555,739,741,743,745,748,750,752,755],{"class":557,"line":740},13,[555,742,621],{"class":561},[555,744,624],{"class":561},[555,746,747],{"class":565}," Color GREEN_PRESSED_TOP ",[555,749,630],{"class":561},[555,751,707],{"class":565},[555,753,754],{"class":606},"darker",[555,756,713],{"class":565},[555,758,760,762,764,767,769,771,773],{"class":557,"line":759},14,[555,761,621],{"class":561},[555,763,624],{"class":561},[555,765,766],{"class":565}," Color GREEN_PRESSED_BOTTOM ",[555,768,630],{"class":561},[555,770,728],{"class":565},[555,772,754],{"class":606},[555,774,713],{"class":565},[555,776,778],{"class":557,"line":777},15,[555,779,573],{"emptyLinePlaceholder":572},[555,781,783,785,787,790,792,794,796,798,801,803,806,808,810],{"class":557,"line":782},16,[555,784,621],{"class":561},[555,786,624],{"class":561},[555,788,789],{"class":565}," Color RED_TOP ",[555,791,630],{"class":561},[555,793,633],{"class":561},[555,795,636],{"class":606},[555,797,639],{"class":565},[555,799,800],{"class":585},"191",[555,802,645],{"class":565},[555,804,805],{"class":585},"37",[555,807,645],{"class":565},[555,809,805],{"class":585},[555,811,655],{"class":565},[555,813,815,817,819,822,824,826,828,830,833,835,838,840,842],{"class":557,"line":814},17,[555,816,621],{"class":561},[555,818,624],{"class":561},[555,820,821],{"class":565}," Color RED_BOTTOM ",[555,823,630],{"class":561},[555,825,633],{"class":561},[555,827,636],{"class":606},[555,829,639],{"class":565},[555,831,832],{"class":585},"80",[555,834,645],{"class":565},[555,836,837],{"class":585},"16",[555,839,645],{"class":565},[555,841,837],{"class":585},[555,843,655],{"class":565},[555,845,847],{"class":557,"line":846},18,[555,848,573],{"emptyLinePlaceholder":572},[555,850,852,854,856,859,861,864,866],{"class":557,"line":851},19,[555,853,621],{"class":561},[555,855,624],{"class":561},[555,857,858],{"class":565}," Color RED_HOVER_TOP ",[555,860,630],{"class":561},[555,862,863],{"class":565}," RED_TOP.",[555,865,710],{"class":606},[555,867,713],{"class":565},[555,869,871,873,875,878,880,883,885],{"class":557,"line":870},20,[555,872,621],{"class":561},[555,874,624],{"class":561},[555,876,877],{"class":565}," Color RED_HOVER_BOTTOM ",[555,879,630],{"class":561},[555,881,882],{"class":565}," RED_BOTTOM.",[555,884,710],{"class":606},[555,886,713],{"class":565},[555,888,890],{"class":557,"line":889},21,[555,891,573],{"emptyLinePlaceholder":572},[555,893,895,897,899,902,904,906,908],{"class":557,"line":894},22,[555,896,621],{"class":561},[555,898,624],{"class":561},[555,900,901],{"class":565}," Color RED_PRESSED_TOP ",[555,903,630],{"class":561},[555,905,863],{"class":565},[555,907,754],{"class":606},[555,909,713],{"class":565},[555,911,913,915,917,920,922,924,926],{"class":557,"line":912},23,[555,914,621],{"class":561},[555,916,624],{"class":561},[555,918,919],{"class":565}," Color RED_PRESSED_BOTTOM ",[555,921,630],{"class":561},[555,923,882],{"class":565},[555,925,754],{"class":606},[555,927,713],{"class":565},[555,929,931],{"class":557,"line":930},24,[555,932,573],{"emptyLinePlaceholder":572},[555,934,936,938,940,943,945,947,949,951,954,956,959,961,964],{"class":557,"line":935},25,[555,937,621],{"class":561},[555,939,624],{"class":561},[555,941,942],{"class":565}," Color BLUE_TOP ",[555,944,630],{"class":561},[555,946,633],{"class":561},[555,948,636],{"class":606},[555,950,639],{"class":565},[555,952,953],{"class":585},"10",[555,955,645],{"class":565},[555,957,958],{"class":585},"111",[555,960,645],{"class":565},[555,962,963],{"class":585},"178",[555,965,655],{"class":565},[555,967,969,971,973,976,978,980,982,984,987,989,992,994,997],{"class":557,"line":968},26,[555,970,621],{"class":561},[555,972,624],{"class":561},[555,974,975],{"class":565}," Color BLUE_BOTTOM ",[555,977,630],{"class":561},[555,979,633],{"class":561},[555,981,636],{"class":606},[555,983,639],{"class":565},[555,985,986],{"class":585},"5",[555,988,645],{"class":565},[555,990,991],{"class":585},"55",[555,993,645],{"class":565},[555,995,996],{"class":585},"89",[555,998,655],{"class":565},[555,1000,1002],{"class":557,"line":1001},27,[555,1003,573],{"emptyLinePlaceholder":572},[555,1005,1007,1009,1011,1014,1016,1019,1021],{"class":557,"line":1006},28,[555,1008,621],{"class":561},[555,1010,624],{"class":561},[555,1012,1013],{"class":565}," Color BLUE_HOVER_TOP ",[555,1015,630],{"class":561},[555,1017,1018],{"class":565}," BLUE_TOP.",[555,1020,710],{"class":606},[555,1022,713],{"class":565},[555,1024,1026,1028,1030,1033,1035,1038,1040],{"class":557,"line":1025},29,[555,1027,621],{"class":561},[555,1029,624],{"class":561},[555,1031,1032],{"class":565}," Color BLUE_HOVER_BOTTOM ",[555,1034,630],{"class":561},[555,1036,1037],{"class":565}," BLUE_BOTTOM.",[555,1039,710],{"class":606},[555,1041,713],{"class":565},[555,1043,1045],{"class":557,"line":1044},30,[555,1046,573],{"emptyLinePlaceholder":572},[555,1048,1050,1052,1054,1057,1059,1061,1063],{"class":557,"line":1049},31,[555,1051,621],{"class":561},[555,1053,624],{"class":561},[555,1055,1056],{"class":565}," Color BLUE_PRESSED_TOP ",[555,1058,630],{"class":561},[555,1060,1018],{"class":565},[555,1062,754],{"class":606},[555,1064,713],{"class":565},[555,1066,1068,1070,1072,1075,1077,1079,1081],{"class":557,"line":1067},32,[555,1069,621],{"class":561},[555,1071,624],{"class":561},[555,1073,1074],{"class":565}," Color BLUE_PRESSED_BOTTOM ",[555,1076,630],{"class":561},[555,1078,1037],{"class":565},[555,1080,754],{"class":606},[555,1082,713],{"class":565},[555,1084,1086],{"class":557,"line":1085},33,[555,1087,573],{"emptyLinePlaceholder":572},[555,1089,1091,1093,1095,1098,1100,1102,1104,1106,1109,1111,1114,1116,1119],{"class":557,"line":1090},34,[555,1092,621],{"class":561},[555,1094,624],{"class":561},[555,1096,1097],{"class":565}," Color BORDER_LIGHT ",[555,1099,630],{"class":561},[555,1101,633],{"class":561},[555,1103,636],{"class":606},[555,1105,639],{"class":565},[555,1107,1108],{"class":585},"255",[555,1110,645],{"class":565},[555,1112,1113],{"class":585},"215",[555,1115,645],{"class":565},[555,1117,1118],{"class":585},"0",[555,1120,655],{"class":565},[555,1122,1124,1126,1128,1131,1133,1135,1137,1139,1142,1144,1147,1149,1151],{"class":557,"line":1123},35,[555,1125,621],{"class":561},[555,1127,624],{"class":561},[555,1129,1130],{"class":565}," Color BORDER_DARK ",[555,1132,630],{"class":561},[555,1134,633],{"class":561},[555,1136,636],{"class":606},[555,1138,639],{"class":565},[555,1140,1141],{"class":585},"128",[555,1143,645],{"class":565},[555,1145,1146],{"class":585},"64",[555,1148,645],{"class":565},[555,1150,1118],{"class":585},[555,1152,655],{"class":565},[555,1154,1156],{"class":557,"line":1155},36,[555,1157,1158],{"class":565},"}\n",[423,1160,1161,1162,1165],{},"Como podrás notar, hemos definido una clase ",[434,1163,1164],{},"ColorPalette"," que contiene colores para diferentes estados de los botones (normal, hover y pressed) en tonos verdes, rojos y azules, así como colores para los bordes. Esto nos permitirá mantener una apariencia consistente en toda la interfaz gráfica de nuestro RPG y facilitará la aplicación de estilos a los componentes de la interfaz. En las siguientes secciones, utilizaremos esta paleta de colores para diseñar los botones y otros componentes de la interfaz gráfica de nuestro RPG, asegurándonos de que se vean atractivos y coherentes con el tema de nuestro juego.",[418,1167,1169],{"id":1168},"definiendo-el-border-redondeado-para-los-componentes-de-la-interfaz-gráfica","Definiendo el Border redondeado para los componentes de la interfaz gráfica",[423,1171,1172,1173,1176,1177,1180],{},"Para darle un aspecto más moderno y atractivo a los componentes de la interfaz gráfica de nuestro RPG, podemos definir un border redondeado que se aplicará a los botones y otros elementos de la interfaz. Esto se puede lograr creando una clase que implemente la interfaz ",[434,1174,1175],{},"Border"," de Swing y utilizando la clase ",[434,1178,1179],{},"Graphics2D"," para dibujar un borde redondeado alrededor de los componentes.",[544,1182,1183],{},[510,1184,1187],{"className":548,"code":1185,"filename":1186,"language":551,"meta":518,"style":518},"package app.game.rpg.ui.components.borders;\n\nimport javax.swing.border.Border;\nimport java.awt.*;\n\n\u002F**\n * RPGRoundedBorder es una clase personalizada que implementa la interfaz Border para crear un borde redondeado con un degradado de color dorado. Este borde se puede aplicar a los paneles de los personajes en la interfaz gráfica de nuestro RPG para mejorar su apariencia.\n *\u002F\npublic class RPGRoundedBorder implements Border {\n\n    \u002F**\n     * Grosor del borde que se dibujará alrededor del componente.\n     *\u002F\n    private final int thickness;\n    \u002F**\n     * Radio de las esquinas redondeadas del borde.\n     *\u002F\n    private final int radius;\n    private final Color startColor;\n    private final Color endColor;\n\n    \u002F**\n     * Constructor para crear un borde redondeado con un degradado de color dorado.\n     *\n     * @param thickness El grosor del borde.\n     * @param radius    El radio de las esquinas redondeadas.\n     *\u002F\n    public RPGRoundedBorder(int thickness, int radius) {\n        this.thickness = thickness;\n        this.radius = radius;\n        this.startColor = new Color(255, 215, 0);\n        this.endColor = new Color(180, 140, 0);\n    }\n\n    \u002F**\n     * Constructor para crear un borde redondeado con un degradado de color personalizado.\n     *\n     * @param thickness  El grosor del borde.\n     * @param radius     El radio de las esquinas redondeadas.\n     * @param startColor El color de inicio del degradado.\n     * @param endColor   El color de fin del degradado.\n     *\u002F\n    public RPGRoundedBorder(int thickness, int radius, Color startColor, Color endColor) {\n        this.thickness = thickness;\n        this.radius = radius;\n        this.startColor = startColor;\n        this.endColor = endColor;\n    }\n\n    \u002F**\n     * Función que se encargará de dibujar el borde redondeado con un degradado de color dorado alrededor del componente.\n     *\n     * @param c      El componente al que se le aplicará el borde.\n     * @param g      El objeto Graphics utilizado para dibujar el borde.\n     * @param x      La coordenada x del borde.\n     * @param y      La coordenada y del borde.\n     * @param width  El ancho del borde.\n     * @param height La altura del borde.\n     *\u002F\n    @Override\n    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {\n        \u002F\u002F Crear un objeto Graphics2D a partir del objeto Graphics proporcionado para tener un control más avanzado sobre el dibujo.\n        Graphics2D g2 = (Graphics2D) g.create();\n\n        \u002F\u002F Establecer antialiasing para mejorar la calidad del dibujo\n        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\n                RenderingHints.VALUE_ANTIALIAS_ON);\n\n        \u002F\u002F Crear un degradado de color dorado para el borde, que va desde un tono más claro en la parte superior a un tono más oscuro en la parte inferior.\n        \u002F\u002F Toma en cuenta que puedes ajustar los colores y las coordenadas del degradado para obtener el efecto deseado.\n        GradientPaint borderGradient = new GradientPaint(\n                0, 0, startColor,\n                0, height, endColor\n        );\n\n        \u002F\u002F Establecer el degradado como el color de pintura para el borde y configurar el grosor del borde utilizando un BasicStroke.\n        g2.setPaint(borderGradient);\n        \u002F\u002F La clase BasicStroke se utiliza para definir el grosor y el estilo del borde que se dibujará alrededor del componente.\n        g2.setStroke(new BasicStroke(thickness));\n\n        \u002F\u002F Dibujar un rectángulo redondeado utilizando la función drawRoundRect, que toma en cuenta el grosor del borde para asegurarse de que el borde se dibuje correctamente alrededor del componente.\n        \u002F\u002F Las formulas para calcular las coordenadas y dimensiones del rectángulo redondeado se basan en el grosor del borde para garantizar que el borde se dibuje dentro de los límites del componente.\n        g2.drawRoundRect(\n                x + thickness \u002F 2,\n                y + thickness \u002F 2,\n                width - thickness,\n                height - thickness,\n                radius,\n                radius\n        );\n\n        \u002F\u002F Indicamos que hemos terminado de dibujar el borde personalizado y liberamos los recursos utilizados por el objeto Graphics2D.\n        g2.dispose();\n    }\n\n    \u002F**\n     * Función que devuelve los insets del borde, que son las áreas de espacio alrededor del componente donde el borde se dibujará. En este caso, el borde se dibujará con un grosor igual al valor de thickness en todos los lados del componente.\n     * Los insets son importantes para asegurarse de que el borde se dibuje correctamente alrededor del componente sin superponerse al contenido del componente.\n     *\n     * @param c the component for which this border insets value applies\n     * @return los insets del borde, que indican el espacio alrededor del componente donde se dibujará el borde.\n     *\u002F\n    @Override\n    public Insets getBorderInsets(Component c) {\n        return new Insets(thickness, thickness, thickness, thickness);\n    }\n\n    \u002F**\n     * Función que indica si el borde es opaco o no. En este caso, el borde no es opaco, lo que significa que el fondo del componente será visible a través del borde. Esto es importante para asegurarse de que el borde se integre bien con el diseño general de la interfaz gráfica y no bloquee la visibilidad del contenido del componente.\n     *\n     * @return false, indicando que el borde no es opaco y que el fondo del componente será visible a través del borde.\n     *\u002F\n    @Override\n    public boolean isBorderOpaque() {\n        return false;\n    }\n}\n","app.game.rpg.ui.components.borders.RoundedBorder.java",[434,1188,1189,1196,1200,1207,1217,1221,1227,1232,1237,1254,1258,1263,1268,1273,1287,1291,1296,1300,1311,1320,1329,1333,1337,1342,1347,1362,1374,1378,1400,1412,1423,1450,1479,1484,1488,1492,1497,1502,1514,1526,1539,1552,1557,1589,1600,1611,1623,1635,1640,1645,1650,1656,1661,1674,1687,1700,1713,1726,1739,1744,1753,1802,1808,1824,1829,1835,1847,1853,1858,1864,1870,1886,1899,1907,1913,1918,1924,1935,1941,1960,1965,1971,1977,1987,2008,2024,2036,2046,2052,2058,2063,2068,2074,2084,2089,2094,2099,2105,2111,2116,2128,2139,2144,2151,2168,2182,2187,2192,2197,2203,2208,2218,2223,2230,2244,2254,2259],{"__ignoreMap":518},[555,1190,1191,1193],{"class":557,"line":558},[555,1192,562],{"class":561},[555,1194,1195],{"class":565}," app.game.rpg.ui.components.borders;\n",[555,1197,1198],{"class":557,"line":569},[555,1199,573],{"emptyLinePlaceholder":572},[555,1201,1202,1204],{"class":557,"line":576},[555,1203,579],{"class":561},[555,1205,1206],{"class":565}," javax.swing.border.Border;\n",[555,1208,1209,1211,1213,1215],{"class":557,"line":592},[555,1210,579],{"class":561},[555,1212,582],{"class":565},[555,1214,586],{"class":585},[555,1216,589],{"class":565},[555,1218,1219],{"class":557,"line":597},[555,1220,573],{"emptyLinePlaceholder":572},[555,1222,1223],{"class":557,"line":613},[555,1224,1226],{"class":1225},"sAwPA","\u002F**\n",[555,1228,1229],{"class":557,"line":618},[555,1230,1231],{"class":1225}," * RPGRoundedBorder es una clase personalizada que implementa la interfaz Border para crear un borde redondeado con un degradado de color dorado. Este borde se puede aplicar a los paneles de los personajes en la interfaz gráfica de nuestro RPG para mejorar su apariencia.\n",[555,1233,1234],{"class":557,"line":658},[555,1235,1236],{"class":1225}," *\u002F\n",[555,1238,1239,1241,1243,1246,1249,1252],{"class":557,"line":690},[555,1240,600],{"class":561},[555,1242,603],{"class":561},[555,1244,1245],{"class":606}," RPGRoundedBorder",[555,1247,1248],{"class":561}," implements",[555,1250,1251],{"class":606}," Border",[555,1253,610],{"class":565},[555,1255,1256],{"class":557,"line":695},[555,1257,573],{"emptyLinePlaceholder":572},[555,1259,1260],{"class":557,"line":716},[555,1261,1262],{"class":1225},"    \u002F**\n",[555,1264,1265],{"class":557,"line":735},[555,1266,1267],{"class":1225},"     * Grosor del borde que se dibujará alrededor del componente.\n",[555,1269,1270],{"class":557,"line":740},[555,1271,1272],{"class":1225},"     *\u002F\n",[555,1274,1275,1278,1281,1284],{"class":557,"line":759},[555,1276,1277],{"class":561},"    private",[555,1279,1280],{"class":561}," final",[555,1282,1283],{"class":561}," int",[555,1285,1286],{"class":565}," thickness;\n",[555,1288,1289],{"class":557,"line":777},[555,1290,1262],{"class":1225},[555,1292,1293],{"class":557,"line":782},[555,1294,1295],{"class":1225},"     * Radio de las esquinas redondeadas del borde.\n",[555,1297,1298],{"class":557,"line":814},[555,1299,1272],{"class":1225},[555,1301,1302,1304,1306,1308],{"class":557,"line":846},[555,1303,1277],{"class":561},[555,1305,1280],{"class":561},[555,1307,1283],{"class":561},[555,1309,1310],{"class":565}," radius;\n",[555,1312,1313,1315,1317],{"class":557,"line":851},[555,1314,1277],{"class":561},[555,1316,1280],{"class":561},[555,1318,1319],{"class":565}," Color startColor;\n",[555,1321,1322,1324,1326],{"class":557,"line":870},[555,1323,1277],{"class":561},[555,1325,1280],{"class":561},[555,1327,1328],{"class":565}," Color endColor;\n",[555,1330,1331],{"class":557,"line":889},[555,1332,573],{"emptyLinePlaceholder":572},[555,1334,1335],{"class":557,"line":894},[555,1336,1262],{"class":1225},[555,1338,1339],{"class":557,"line":912},[555,1340,1341],{"class":1225},"     * Constructor para crear un borde redondeado con un degradado de color dorado.\n",[555,1343,1344],{"class":557,"line":930},[555,1345,1346],{"class":1225},"     *\n",[555,1348,1349,1352,1355,1359],{"class":557,"line":935},[555,1350,1351],{"class":1225},"     * ",[555,1353,1354],{"class":561},"@param",[555,1356,1358],{"class":1357},"s9osk"," thickness",[555,1360,1361],{"class":1225}," El grosor del borde.\n",[555,1363,1364,1366,1368,1371],{"class":557,"line":968},[555,1365,1351],{"class":1225},[555,1367,1354],{"class":561},[555,1369,1370],{"class":1357}," radius",[555,1372,1373],{"class":1225},"    El radio de las esquinas redondeadas.\n",[555,1375,1376],{"class":557,"line":1001},[555,1377,1272],{"class":1225},[555,1379,1380,1382,1384,1386,1389,1391,1393,1395,1397],{"class":557,"line":1006},[555,1381,621],{"class":561},[555,1383,1245],{"class":606},[555,1385,639],{"class":565},[555,1387,1388],{"class":561},"int",[555,1390,1358],{"class":1357},[555,1392,645],{"class":565},[555,1394,1388],{"class":561},[555,1396,1370],{"class":1357},[555,1398,1399],{"class":565},") {\n",[555,1401,1402,1405,1408,1410],{"class":557,"line":1025},[555,1403,1404],{"class":585},"        this",[555,1406,1407],{"class":565},".thickness ",[555,1409,630],{"class":561},[555,1411,1286],{"class":565},[555,1413,1414,1416,1419,1421],{"class":557,"line":1044},[555,1415,1404],{"class":585},[555,1417,1418],{"class":565},".radius ",[555,1420,630],{"class":561},[555,1422,1310],{"class":565},[555,1424,1425,1427,1430,1432,1434,1436,1438,1440,1442,1444,1446,1448],{"class":557,"line":1049},[555,1426,1404],{"class":585},[555,1428,1429],{"class":565},".startColor ",[555,1431,630],{"class":561},[555,1433,633],{"class":561},[555,1435,636],{"class":606},[555,1437,639],{"class":565},[555,1439,1108],{"class":585},[555,1441,645],{"class":565},[555,1443,1113],{"class":585},[555,1445,645],{"class":565},[555,1447,1118],{"class":585},[555,1449,655],{"class":565},[555,1451,1452,1454,1457,1459,1461,1463,1465,1468,1470,1473,1475,1477],{"class":557,"line":1067},[555,1453,1404],{"class":585},[555,1455,1456],{"class":565},".endColor ",[555,1458,630],{"class":561},[555,1460,633],{"class":561},[555,1462,636],{"class":606},[555,1464,639],{"class":565},[555,1466,1467],{"class":585},"180",[555,1469,645],{"class":565},[555,1471,1472],{"class":585},"140",[555,1474,645],{"class":565},[555,1476,1118],{"class":585},[555,1478,655],{"class":565},[555,1480,1481],{"class":557,"line":1085},[555,1482,1483],{"class":565},"    }\n",[555,1485,1486],{"class":557,"line":1090},[555,1487,573],{"emptyLinePlaceholder":572},[555,1489,1490],{"class":557,"line":1123},[555,1491,1262],{"class":1225},[555,1493,1494],{"class":557,"line":1155},[555,1495,1496],{"class":1225},"     * Constructor para crear un borde redondeado con un degradado de color personalizado.\n",[555,1498,1500],{"class":557,"line":1499},37,[555,1501,1346],{"class":1225},[555,1503,1505,1507,1509,1511],{"class":557,"line":1504},38,[555,1506,1351],{"class":1225},[555,1508,1354],{"class":561},[555,1510,1358],{"class":1357},[555,1512,1513],{"class":1225},"  El grosor del borde.\n",[555,1515,1517,1519,1521,1523],{"class":557,"line":1516},39,[555,1518,1351],{"class":1225},[555,1520,1354],{"class":561},[555,1522,1370],{"class":1357},[555,1524,1525],{"class":1225},"     El radio de las esquinas redondeadas.\n",[555,1527,1529,1531,1533,1536],{"class":557,"line":1528},40,[555,1530,1351],{"class":1225},[555,1532,1354],{"class":561},[555,1534,1535],{"class":1357}," startColor",[555,1537,1538],{"class":1225}," El color de inicio del degradado.\n",[555,1540,1542,1544,1546,1549],{"class":557,"line":1541},41,[555,1543,1351],{"class":1225},[555,1545,1354],{"class":561},[555,1547,1548],{"class":1357}," endColor",[555,1550,1551],{"class":1225},"   El color de fin del degradado.\n",[555,1553,1555],{"class":557,"line":1554},42,[555,1556,1272],{"class":1225},[555,1558,1560,1562,1564,1566,1568,1570,1572,1574,1576,1579,1582,1584,1587],{"class":557,"line":1559},43,[555,1561,621],{"class":561},[555,1563,1245],{"class":606},[555,1565,639],{"class":565},[555,1567,1388],{"class":561},[555,1569,1358],{"class":1357},[555,1571,645],{"class":565},[555,1573,1388],{"class":561},[555,1575,1370],{"class":1357},[555,1577,1578],{"class":565},", Color ",[555,1580,1581],{"class":1357},"startColor",[555,1583,1578],{"class":565},[555,1585,1586],{"class":1357},"endColor",[555,1588,1399],{"class":565},[555,1590,1592,1594,1596,1598],{"class":557,"line":1591},44,[555,1593,1404],{"class":585},[555,1595,1407],{"class":565},[555,1597,630],{"class":561},[555,1599,1286],{"class":565},[555,1601,1603,1605,1607,1609],{"class":557,"line":1602},45,[555,1604,1404],{"class":585},[555,1606,1418],{"class":565},[555,1608,630],{"class":561},[555,1610,1310],{"class":565},[555,1612,1614,1616,1618,1620],{"class":557,"line":1613},46,[555,1615,1404],{"class":585},[555,1617,1429],{"class":565},[555,1619,630],{"class":561},[555,1621,1622],{"class":565}," startColor;\n",[555,1624,1626,1628,1630,1632],{"class":557,"line":1625},47,[555,1627,1404],{"class":585},[555,1629,1456],{"class":565},[555,1631,630],{"class":561},[555,1633,1634],{"class":565}," endColor;\n",[555,1636,1638],{"class":557,"line":1637},48,[555,1639,1483],{"class":565},[555,1641,1643],{"class":557,"line":1642},49,[555,1644,573],{"emptyLinePlaceholder":572},[555,1646,1648],{"class":557,"line":1647},50,[555,1649,1262],{"class":1225},[555,1651,1653],{"class":557,"line":1652},51,[555,1654,1655],{"class":1225},"     * Función que se encargará de dibujar el borde redondeado con un degradado de color dorado alrededor del componente.\n",[555,1657,1659],{"class":557,"line":1658},52,[555,1660,1346],{"class":1225},[555,1662,1664,1666,1668,1671],{"class":557,"line":1663},53,[555,1665,1351],{"class":1225},[555,1667,1354],{"class":561},[555,1669,1670],{"class":1357}," c",[555,1672,1673],{"class":1225},"      El componente al que se le aplicará el borde.\n",[555,1675,1677,1679,1681,1684],{"class":557,"line":1676},54,[555,1678,1351],{"class":1225},[555,1680,1354],{"class":561},[555,1682,1683],{"class":1357}," g",[555,1685,1686],{"class":1225},"      El objeto Graphics utilizado para dibujar el borde.\n",[555,1688,1690,1692,1694,1697],{"class":557,"line":1689},55,[555,1691,1351],{"class":1225},[555,1693,1354],{"class":561},[555,1695,1696],{"class":1357}," x",[555,1698,1699],{"class":1225},"      La coordenada x del borde.\n",[555,1701,1703,1705,1707,1710],{"class":557,"line":1702},56,[555,1704,1351],{"class":1225},[555,1706,1354],{"class":561},[555,1708,1709],{"class":1357}," y",[555,1711,1712],{"class":1225},"      La coordenada y del borde.\n",[555,1714,1716,1718,1720,1723],{"class":557,"line":1715},57,[555,1717,1351],{"class":1225},[555,1719,1354],{"class":561},[555,1721,1722],{"class":1357}," width",[555,1724,1725],{"class":1225},"  El ancho del borde.\n",[555,1727,1729,1731,1733,1736],{"class":557,"line":1728},58,[555,1730,1351],{"class":1225},[555,1732,1354],{"class":561},[555,1734,1735],{"class":1357}," height",[555,1737,1738],{"class":1225}," La altura del borde.\n",[555,1740,1742],{"class":557,"line":1741},59,[555,1743,1272],{"class":1225},[555,1745,1747,1750],{"class":557,"line":1746},60,[555,1748,1749],{"class":565},"    @",[555,1751,1752],{"class":561},"Override\n",[555,1754,1756,1758,1761,1764,1767,1770,1773,1776,1778,1780,1782,1784,1786,1788,1790,1792,1794,1796,1798,1800],{"class":557,"line":1755},61,[555,1757,621],{"class":561},[555,1759,1760],{"class":561}," void",[555,1762,1763],{"class":606}," paintBorder",[555,1765,1766],{"class":565},"(Component ",[555,1768,1769],{"class":1357},"c",[555,1771,1772],{"class":565},", Graphics ",[555,1774,1775],{"class":1357},"g",[555,1777,645],{"class":565},[555,1779,1388],{"class":561},[555,1781,1696],{"class":1357},[555,1783,645],{"class":565},[555,1785,1388],{"class":561},[555,1787,1709],{"class":1357},[555,1789,645],{"class":565},[555,1791,1388],{"class":561},[555,1793,1722],{"class":1357},[555,1795,645],{"class":565},[555,1797,1388],{"class":561},[555,1799,1735],{"class":1357},[555,1801,1399],{"class":565},[555,1803,1805],{"class":557,"line":1804},62,[555,1806,1807],{"class":1225},"        \u002F\u002F Crear un objeto Graphics2D a partir del objeto Graphics proporcionado para tener un control más avanzado sobre el dibujo.\n",[555,1809,1811,1814,1816,1819,1822],{"class":557,"line":1810},63,[555,1812,1813],{"class":565},"        Graphics2D g2 ",[555,1815,630],{"class":561},[555,1817,1818],{"class":565}," (Graphics2D) g.",[555,1820,1821],{"class":606},"create",[555,1823,713],{"class":565},[555,1825,1827],{"class":557,"line":1826},64,[555,1828,573],{"emptyLinePlaceholder":572},[555,1830,1832],{"class":557,"line":1831},65,[555,1833,1834],{"class":1225},"        \u002F\u002F Establecer antialiasing para mejorar la calidad del dibujo\n",[555,1836,1838,1841,1844],{"class":557,"line":1837},66,[555,1839,1840],{"class":565},"        g2.",[555,1842,1843],{"class":606},"setRenderingHint",[555,1845,1846],{"class":565},"(RenderingHints.KEY_ANTIALIASING,\n",[555,1848,1850],{"class":557,"line":1849},67,[555,1851,1852],{"class":565},"                RenderingHints.VALUE_ANTIALIAS_ON);\n",[555,1854,1856],{"class":557,"line":1855},68,[555,1857,573],{"emptyLinePlaceholder":572},[555,1859,1861],{"class":557,"line":1860},69,[555,1862,1863],{"class":1225},"        \u002F\u002F Crear un degradado de color dorado para el borde, que va desde un tono más claro en la parte superior a un tono más oscuro en la parte inferior.\n",[555,1865,1867],{"class":557,"line":1866},70,[555,1868,1869],{"class":1225},"        \u002F\u002F Toma en cuenta que puedes ajustar los colores y las coordenadas del degradado para obtener el efecto deseado.\n",[555,1871,1873,1876,1878,1880,1883],{"class":557,"line":1872},71,[555,1874,1875],{"class":565},"        GradientPaint borderGradient ",[555,1877,630],{"class":561},[555,1879,633],{"class":561},[555,1881,1882],{"class":606}," GradientPaint",[555,1884,1885],{"class":565},"(\n",[555,1887,1889,1892,1894,1896],{"class":557,"line":1888},72,[555,1890,1891],{"class":585},"                0",[555,1893,645],{"class":565},[555,1895,1118],{"class":585},[555,1897,1898],{"class":565},", startColor,\n",[555,1900,1902,1904],{"class":557,"line":1901},73,[555,1903,1891],{"class":585},[555,1905,1906],{"class":565},", height, endColor\n",[555,1908,1910],{"class":557,"line":1909},74,[555,1911,1912],{"class":565},"        );\n",[555,1914,1916],{"class":557,"line":1915},75,[555,1917,573],{"emptyLinePlaceholder":572},[555,1919,1921],{"class":557,"line":1920},76,[555,1922,1923],{"class":1225},"        \u002F\u002F Establecer el degradado como el color de pintura para el borde y configurar el grosor del borde utilizando un BasicStroke.\n",[555,1925,1927,1929,1932],{"class":557,"line":1926},77,[555,1928,1840],{"class":565},[555,1930,1931],{"class":606},"setPaint",[555,1933,1934],{"class":565},"(borderGradient);\n",[555,1936,1938],{"class":557,"line":1937},78,[555,1939,1940],{"class":1225},"        \u002F\u002F La clase BasicStroke se utiliza para definir el grosor y el estilo del borde que se dibujará alrededor del componente.\n",[555,1942,1944,1946,1949,1951,1954,1957],{"class":557,"line":1943},79,[555,1945,1840],{"class":565},[555,1947,1948],{"class":606},"setStroke",[555,1950,639],{"class":565},[555,1952,1953],{"class":561},"new",[555,1955,1956],{"class":606}," BasicStroke",[555,1958,1959],{"class":565},"(thickness));\n",[555,1961,1963],{"class":557,"line":1962},80,[555,1964,573],{"emptyLinePlaceholder":572},[555,1966,1968],{"class":557,"line":1967},81,[555,1969,1970],{"class":1225},"        \u002F\u002F Dibujar un rectángulo redondeado utilizando la función drawRoundRect, que toma en cuenta el grosor del borde para asegurarse de que el borde se dibuje correctamente alrededor del componente.\n",[555,1972,1974],{"class":557,"line":1973},82,[555,1975,1976],{"class":1225},"        \u002F\u002F Las formulas para calcular las coordenadas y dimensiones del rectángulo redondeado se basan en el grosor del borde para garantizar que el borde se dibuje dentro de los límites del componente.\n",[555,1978,1980,1982,1985],{"class":557,"line":1979},83,[555,1981,1840],{"class":565},[555,1983,1984],{"class":606},"drawRoundRect",[555,1986,1885],{"class":565},[555,1988,1990,1993,1996,1999,2002,2005],{"class":557,"line":1989},84,[555,1991,1992],{"class":565},"                x ",[555,1994,1995],{"class":561},"+",[555,1997,1998],{"class":565}," thickness ",[555,2000,2001],{"class":561},"\u002F",[555,2003,2004],{"class":585}," 2",[555,2006,2007],{"class":565},",\n",[555,2009,2011,2014,2016,2018,2020,2022],{"class":557,"line":2010},85,[555,2012,2013],{"class":565},"                y ",[555,2015,1995],{"class":561},[555,2017,1998],{"class":565},[555,2019,2001],{"class":561},[555,2021,2004],{"class":585},[555,2023,2007],{"class":565},[555,2025,2027,2030,2033],{"class":557,"line":2026},86,[555,2028,2029],{"class":565},"                width ",[555,2031,2032],{"class":561},"-",[555,2034,2035],{"class":565}," thickness,\n",[555,2037,2039,2042,2044],{"class":557,"line":2038},87,[555,2040,2041],{"class":565},"                height ",[555,2043,2032],{"class":561},[555,2045,2035],{"class":565},[555,2047,2049],{"class":557,"line":2048},88,[555,2050,2051],{"class":565},"                radius,\n",[555,2053,2055],{"class":557,"line":2054},89,[555,2056,2057],{"class":565},"                radius\n",[555,2059,2061],{"class":557,"line":2060},90,[555,2062,1912],{"class":565},[555,2064,2066],{"class":557,"line":2065},91,[555,2067,573],{"emptyLinePlaceholder":572},[555,2069,2071],{"class":557,"line":2070},92,[555,2072,2073],{"class":1225},"        \u002F\u002F Indicamos que hemos terminado de dibujar el borde personalizado y liberamos los recursos utilizados por el objeto Graphics2D.\n",[555,2075,2077,2079,2082],{"class":557,"line":2076},93,[555,2078,1840],{"class":565},[555,2080,2081],{"class":606},"dispose",[555,2083,713],{"class":565},[555,2085,2087],{"class":557,"line":2086},94,[555,2088,1483],{"class":565},[555,2090,2092],{"class":557,"line":2091},95,[555,2093,573],{"emptyLinePlaceholder":572},[555,2095,2097],{"class":557,"line":2096},96,[555,2098,1262],{"class":1225},[555,2100,2102],{"class":557,"line":2101},97,[555,2103,2104],{"class":1225},"     * Función que devuelve los insets del borde, que son las áreas de espacio alrededor del componente donde el borde se dibujará. En este caso, el borde se dibujará con un grosor igual al valor de thickness en todos los lados del componente.\n",[555,2106,2108],{"class":557,"line":2107},98,[555,2109,2110],{"class":1225},"     * Los insets son importantes para asegurarse de que el borde se dibuje correctamente alrededor del componente sin superponerse al contenido del componente.\n",[555,2112,2114],{"class":557,"line":2113},99,[555,2115,1346],{"class":1225},[555,2117,2119,2121,2123,2125],{"class":557,"line":2118},100,[555,2120,1351],{"class":1225},[555,2122,1354],{"class":561},[555,2124,1670],{"class":1357},[555,2126,2127],{"class":1225}," the component for which this border insets value applies\n",[555,2129,2131,2133,2136],{"class":557,"line":2130},101,[555,2132,1351],{"class":1225},[555,2134,2135],{"class":561},"@return",[555,2137,2138],{"class":1225}," los insets del borde, que indican el espacio alrededor del componente donde se dibujará el borde.\n",[555,2140,2142],{"class":557,"line":2141},102,[555,2143,1272],{"class":1225},[555,2145,2147,2149],{"class":557,"line":2146},103,[555,2148,1749],{"class":565},[555,2150,1752],{"class":561},[555,2152,2154,2156,2159,2162,2164,2166],{"class":557,"line":2153},104,[555,2155,621],{"class":561},[555,2157,2158],{"class":565}," Insets ",[555,2160,2161],{"class":606},"getBorderInsets",[555,2163,1766],{"class":565},[555,2165,1769],{"class":1357},[555,2167,1399],{"class":565},[555,2169,2171,2174,2176,2179],{"class":557,"line":2170},105,[555,2172,2173],{"class":561},"        return",[555,2175,633],{"class":561},[555,2177,2178],{"class":606}," Insets",[555,2180,2181],{"class":565},"(thickness, thickness, thickness, thickness);\n",[555,2183,2185],{"class":557,"line":2184},106,[555,2186,1483],{"class":565},[555,2188,2190],{"class":557,"line":2189},107,[555,2191,573],{"emptyLinePlaceholder":572},[555,2193,2195],{"class":557,"line":2194},108,[555,2196,1262],{"class":1225},[555,2198,2200],{"class":557,"line":2199},109,[555,2201,2202],{"class":1225},"     * Función que indica si el borde es opaco o no. En este caso, el borde no es opaco, lo que significa que el fondo del componente será visible a través del borde. Esto es importante para asegurarse de que el borde se integre bien con el diseño general de la interfaz gráfica y no bloquee la visibilidad del contenido del componente.\n",[555,2204,2206],{"class":557,"line":2205},110,[555,2207,1346],{"class":1225},[555,2209,2211,2213,2215],{"class":557,"line":2210},111,[555,2212,1351],{"class":1225},[555,2214,2135],{"class":561},[555,2216,2217],{"class":1225}," false, indicando que el borde no es opaco y que el fondo del componente será visible a través del borde.\n",[555,2219,2221],{"class":557,"line":2220},112,[555,2222,1272],{"class":1225},[555,2224,2226,2228],{"class":557,"line":2225},113,[555,2227,1749],{"class":565},[555,2229,1752],{"class":561},[555,2231,2233,2235,2238,2241],{"class":557,"line":2232},114,[555,2234,621],{"class":561},[555,2236,2237],{"class":561}," boolean",[555,2239,2240],{"class":606}," isBorderOpaque",[555,2242,2243],{"class":565},"() {\n",[555,2245,2247,2249,2252],{"class":557,"line":2246},115,[555,2248,2173],{"class":561},[555,2250,2251],{"class":585}," false",[555,2253,589],{"class":565},[555,2255,2257],{"class":557,"line":2256},116,[555,2258,1483],{"class":565},[555,2260,2262],{"class":557,"line":2261},117,[555,2263,1158],{"class":565},[423,2265,2266,2267,2270,2271,2274,2275,2277,2278,2280,2281,2284],{},"En esta clase ",[434,2268,2269],{},"RPGRoundedBorder",", hemos definido un borde redondeado con un degradado de color dorado que se puede aplicar a los componentes de la interfaz gráfica de nuestro RPG. El constructor permite personalizar el grosor, el radio de las esquinas y los colores del degradado, lo que nos brinda flexibilidad para adaptar el diseño a nuestras necesidades. La función ",[434,2272,2273],{},"paintBorder"," se encarga de dibujar el borde utilizando ",[434,2276,1179],{},", mientras que las funciones ",[434,2279,2161],{}," e ",[434,2282,2283],{},"isBorderOpaque"," aseguran que el borde se dibuje correctamente alrededor del componente sin bloquear la visibilidad del contenido. En las siguientes secciones, aplicaremos este borde a los paneles de los personajes y otros componentes de la interfaz gráfica para mejorar su apariencia y coherencia visual.",[418,2286,2288],{"id":2287},"estructurando-nuestra-ventana-frame-general-para-el-rpg","Estructurando nuestra ventana (Frame) general para el RPG",[423,2290,2291,2292,2294],{},"Para estructurar la ventana principal de nuestro RPG, podemos crear una clase que extienda ",[434,2293,474],{}," y configure el diseño general de la interfaz gráfica. En esta clase, podemos definir un panel principal que contenga los diferentes componentes de la interfaz, como el panel de personajes, el panel de habilidades, el panel de inventario, etc. Además, podemos aplicar el borde redondeado que hemos definido anteriormente para mejorar la apariencia de los componentes. Y para hacer más personalizada la experiencia del usuario, definiremos un panel como barra de estado de la ventana con sus respectivos bótones para minimizar y cerrar la ventana. Esto nos permitirá tener un control total sobre el diseño y la funcionalidad de la ventana principal de nuestro RPG. En las siguientes secciones, implementaremos esta estructura y aplicaremos el borde redondeado a los componentes de la interfaz gráfica para crear una experiencia visual atractiva y coherente.",[2296,2297,2299],"h3",{"id":2298},"creando-la-barra-de-estado-personalizada","Creando la Barra de Estado Personalizada",[423,2301,2302],{},"Para crear una barra de estado personalizada en la ventana principal de nuestro RPG, podemos definir un panel que se ubique en la parte superior de la ventana y contenga los botones para minimizar y cerrar la ventana. Este panel puede tener un diseño personalizado que se integre con el tema visual de nuestro RPG, utilizando colores, fuentes y estilos que reflejen la estética del juego. Además, podemos agregar funcionalidad a los botones para que respondan a las acciones del usuario, como minimizar la ventana al hacer clic en el botón de minimizar o cerrar la aplicación al hacer clic en el botón de cerrar. Al implementar esta barra de estado personalizada, mejoraremos la experiencia del usuario al proporcionar una interfaz gráfica más atractiva y funcional para nuestro RPG. En las siguientes secciones, implementaremos esta barra de estado personalizada y la integraremos en la estructura general de la ventana principal de nuestro RPG.",[544,2304,2305],{},[510,2306,2309],{"className":548,"code":2307,"filename":2308,"language":551,"meta":518,"style":518},"package app.game.rpg.ui.components.panels;\n\nimport app.game.rpg.ui.components.buttons.RPGTitleBarButton;\nimport app.game.rpg.ui.components.buttons.RPGTitleBarButtonType;\nimport app.game.rpg.ui.components.delegates.RPGTitleBarUI;\nimport app.game.rpg.ui.components.listeners.RPGWindowDragListener;\n\nimport javax.swing.*;\nimport javax.swing.border.EmptyBorder;\nimport java.awt.*;\n\n\u002F**\n * RPGTitleBar es una clase personalizada que extiende JPanel para crear una barra de título personalizada para la ventana principal de nuestro RPG. Esta barra de título incluye botones personalizados para cerrar y minimizar la ventana, y se puede personalizar con diferentes colores y estilos.\n *\u002F\npublic class RPGTitleBar extends JPanel {\n    \u002F**\n     * Botón personalizado para cerrar la ventana.\n     *\u002F\n    private final RPGTitleBarButton closeButton;\n    \u002F**\n     * Botón personalizado para minimizar la ventana.\n     *\u002F\n    private final RPGTitleBarButton minimizeButton;\n    \u002F**\n     * Referencia al JFrame padre para controlar las acciones de minimizar y cerrar la ventana.\n     *\u002F\n    private final JFrame parentFrame;\n    \u002F**\n     * Punto inicial para el arrastre de la ventana, utilizado para permitir que el usuario mueva la ventana arrastrando la barra de título.\n     *\u002F\n    private Point initialClick;\n\n    \u002F**\n     * Constructor para crear una barra de título personalizada con botones de cerrar y minimizar.\n     *\n     * @param frame El JFrame al que se le aplicará la barra de título personalizada.\n     * @param title El texto que se mostrará en la barra de título.\n     *\u002F\n    public RPGTitleBar(JFrame frame, String title) {\n\n        \u002F\u002F Establece un diseño de borde para organizar los componentes de la barra de título. Recuerda que puedes personalizar los colores y estilos de la barra de título modificando los parámetros del constructor RPGTitleBarUI.\n        setUI(new RPGTitleBarUI(new Color(6, 44, 155), new Color(1, 36, 79)));\n        setPreferredSize(new Dimension(frame.getWidth(), 30));\n        parentFrame = frame;\n        closeButton = new RPGTitleBarButton(RPGTitleBarButtonType.CLOSE);\n        minimizeButton = new RPGTitleBarButton(RPGTitleBarButtonType.MINIMIZE);\n        initComponents(title);\n        addListeners();\n    }\n\n    \u002F**\n     * Función privada para inicializar los componentes de la barra de título, incluyendo el título y los botones de cerrar y minimizar.\n     *\n     * @param title El texto que se mostrará en la barra de título.\n     *\u002F\n    private void initComponents(String title) {\n\n        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 0, 0));\n        buttonPanel.setOpaque(false);\n        buttonPanel.add(minimizeButton);\n        buttonPanel.add(closeButton);\n        JLabel titleLabel = new JLabel(title);\n        titleLabel.setBorder(new EmptyBorder(0, 10, 0, 0));\n        titleLabel.setForeground(Color.WHITE);\n        add(titleLabel, BorderLayout.WEST);\n        add(buttonPanel, BorderLayout.EAST);\n    }\n\n    \u002F**\n     * Función privada para agregar los listeners a los botones de cerrar y minimizar, permitiendo que la barra de título controle las acciones de la ventana principal.\n     *\u002F\n    private void addListeners() {\n\n        closeButton.addActionListener(e -> System.exit(0));\n        minimizeButton.addActionListener(e -> parentFrame.setState(JFrame.ICONIFIED));\n    }\n\n    \u002F**\n     * Función pública para habilitar el arrastre de la ventana al hacer clic y arrastrar la barra de título. Esto permite que el usuario mueva la ventana arrastrando la barra de título, proporcionando una experiencia de usuario más fluida y personalizada.\n     *\u002F\n    public void enableWindowDragging() {\n\n        RPGWindowDragListener dragListener = new RPGWindowDragListener(parentFrame);\n        addMouseListener(dragListener);\n        addMouseMotionListener(dragListener);\n    }\n}\n","app.game.rpg.ui.components.panels.RPGTitleBar.java",[434,2310,2311,2318,2322,2329,2336,2343,2350,2354,2365,2372,2382,2386,2390,2395,2399,2416,2420,2425,2429,2438,2442,2447,2451,2460,2464,2469,2473,2482,2486,2491,2495,2502,2506,2510,2515,2519,2531,2543,2547,2567,2571,2576,2634,2661,2671,2686,2700,2708,2715,2719,2723,2727,2732,2736,2746,2750,2766,2770,2799,2814,2824,2833,2847,2880,2890,2898,2905,2909,2913,2917,2922,2926,2937,2941,2967,2987,2991,2995,2999,3004,3008,3019,3023,3038,3046,3053,3057],{"__ignoreMap":518},[555,2312,2313,2315],{"class":557,"line":558},[555,2314,562],{"class":561},[555,2316,2317],{"class":565}," app.game.rpg.ui.components.panels;\n",[555,2319,2320],{"class":557,"line":569},[555,2321,573],{"emptyLinePlaceholder":572},[555,2323,2324,2326],{"class":557,"line":576},[555,2325,579],{"class":561},[555,2327,2328],{"class":565}," app.game.rpg.ui.components.buttons.RPGTitleBarButton;\n",[555,2330,2331,2333],{"class":557,"line":592},[555,2332,579],{"class":561},[555,2334,2335],{"class":565}," app.game.rpg.ui.components.buttons.RPGTitleBarButtonType;\n",[555,2337,2338,2340],{"class":557,"line":597},[555,2339,579],{"class":561},[555,2341,2342],{"class":565}," app.game.rpg.ui.components.delegates.RPGTitleBarUI;\n",[555,2344,2345,2347],{"class":557,"line":613},[555,2346,579],{"class":561},[555,2348,2349],{"class":565}," app.game.rpg.ui.components.listeners.RPGWindowDragListener;\n",[555,2351,2352],{"class":557,"line":618},[555,2353,573],{"emptyLinePlaceholder":572},[555,2355,2356,2358,2361,2363],{"class":557,"line":658},[555,2357,579],{"class":561},[555,2359,2360],{"class":565}," javax.swing.",[555,2362,586],{"class":585},[555,2364,589],{"class":565},[555,2366,2367,2369],{"class":557,"line":690},[555,2368,579],{"class":561},[555,2370,2371],{"class":565}," javax.swing.border.EmptyBorder;\n",[555,2373,2374,2376,2378,2380],{"class":557,"line":695},[555,2375,579],{"class":561},[555,2377,582],{"class":565},[555,2379,586],{"class":585},[555,2381,589],{"class":565},[555,2383,2384],{"class":557,"line":716},[555,2385,573],{"emptyLinePlaceholder":572},[555,2387,2388],{"class":557,"line":735},[555,2389,1226],{"class":1225},[555,2391,2392],{"class":557,"line":740},[555,2393,2394],{"class":1225}," * RPGTitleBar es una clase personalizada que extiende JPanel para crear una barra de título personalizada para la ventana principal de nuestro RPG. Esta barra de título incluye botones personalizados para cerrar y minimizar la ventana, y se puede personalizar con diferentes colores y estilos.\n",[555,2396,2397],{"class":557,"line":759},[555,2398,1236],{"class":1225},[555,2400,2401,2403,2405,2408,2411,2414],{"class":557,"line":777},[555,2402,600],{"class":561},[555,2404,603],{"class":561},[555,2406,2407],{"class":606}," RPGTitleBar",[555,2409,2410],{"class":561}," extends",[555,2412,2413],{"class":606}," JPanel",[555,2415,610],{"class":565},[555,2417,2418],{"class":557,"line":782},[555,2419,1262],{"class":1225},[555,2421,2422],{"class":557,"line":814},[555,2423,2424],{"class":1225},"     * Botón personalizado para cerrar la ventana.\n",[555,2426,2427],{"class":557,"line":846},[555,2428,1272],{"class":1225},[555,2430,2431,2433,2435],{"class":557,"line":851},[555,2432,1277],{"class":561},[555,2434,1280],{"class":561},[555,2436,2437],{"class":565}," RPGTitleBarButton closeButton;\n",[555,2439,2440],{"class":557,"line":870},[555,2441,1262],{"class":1225},[555,2443,2444],{"class":557,"line":889},[555,2445,2446],{"class":1225},"     * Botón personalizado para minimizar la ventana.\n",[555,2448,2449],{"class":557,"line":894},[555,2450,1272],{"class":1225},[555,2452,2453,2455,2457],{"class":557,"line":912},[555,2454,1277],{"class":561},[555,2456,1280],{"class":561},[555,2458,2459],{"class":565}," RPGTitleBarButton minimizeButton;\n",[555,2461,2462],{"class":557,"line":930},[555,2463,1262],{"class":1225},[555,2465,2466],{"class":557,"line":935},[555,2467,2468],{"class":1225},"     * Referencia al JFrame padre para controlar las acciones de minimizar y cerrar la ventana.\n",[555,2470,2471],{"class":557,"line":968},[555,2472,1272],{"class":1225},[555,2474,2475,2477,2479],{"class":557,"line":1001},[555,2476,1277],{"class":561},[555,2478,1280],{"class":561},[555,2480,2481],{"class":565}," JFrame parentFrame;\n",[555,2483,2484],{"class":557,"line":1006},[555,2485,1262],{"class":1225},[555,2487,2488],{"class":557,"line":1025},[555,2489,2490],{"class":1225},"     * Punto inicial para el arrastre de la ventana, utilizado para permitir que el usuario mueva la ventana arrastrando la barra de título.\n",[555,2492,2493],{"class":557,"line":1044},[555,2494,1272],{"class":1225},[555,2496,2497,2499],{"class":557,"line":1049},[555,2498,1277],{"class":561},[555,2500,2501],{"class":565}," Point initialClick;\n",[555,2503,2504],{"class":557,"line":1067},[555,2505,573],{"emptyLinePlaceholder":572},[555,2507,2508],{"class":557,"line":1085},[555,2509,1262],{"class":1225},[555,2511,2512],{"class":557,"line":1090},[555,2513,2514],{"class":1225},"     * Constructor para crear una barra de título personalizada con botones de cerrar y minimizar.\n",[555,2516,2517],{"class":557,"line":1123},[555,2518,1346],{"class":1225},[555,2520,2521,2523,2525,2528],{"class":557,"line":1155},[555,2522,1351],{"class":1225},[555,2524,1354],{"class":561},[555,2526,2527],{"class":1357}," frame",[555,2529,2530],{"class":1225}," El JFrame al que se le aplicará la barra de título personalizada.\n",[555,2532,2533,2535,2537,2540],{"class":557,"line":1499},[555,2534,1351],{"class":1225},[555,2536,1354],{"class":561},[555,2538,2539],{"class":1357}," title",[555,2541,2542],{"class":1225}," El texto que se mostrará en la barra de título.\n",[555,2544,2545],{"class":557,"line":1504},[555,2546,1272],{"class":1225},[555,2548,2549,2551,2553,2556,2559,2562,2565],{"class":557,"line":1516},[555,2550,621],{"class":561},[555,2552,2407],{"class":606},[555,2554,2555],{"class":565},"(JFrame ",[555,2557,2558],{"class":1357},"frame",[555,2560,2561],{"class":565},", String ",[555,2563,2564],{"class":1357},"title",[555,2566,1399],{"class":565},[555,2568,2569],{"class":557,"line":1528},[555,2570,573],{"emptyLinePlaceholder":572},[555,2572,2573],{"class":557,"line":1541},[555,2574,2575],{"class":1225},"        \u002F\u002F Establece un diseño de borde para organizar los componentes de la barra de título. Recuerda que puedes personalizar los colores y estilos de la barra de título modificando los parámetros del constructor RPGTitleBarUI.\n",[555,2577,2578,2581,2583,2585,2588,2590,2592,2594,2596,2599,2601,2604,2606,2609,2612,2614,2616,2618,2621,2623,2626,2628,2631],{"class":557,"line":1554},[555,2579,2580],{"class":606},"        setUI",[555,2582,639],{"class":565},[555,2584,1953],{"class":561},[555,2586,2587],{"class":606}," RPGTitleBarUI",[555,2589,639],{"class":565},[555,2591,1953],{"class":561},[555,2593,636],{"class":606},[555,2595,639],{"class":565},[555,2597,2598],{"class":585},"6",[555,2600,645],{"class":565},[555,2602,2603],{"class":585},"44",[555,2605,645],{"class":565},[555,2607,2608],{"class":585},"155",[555,2610,2611],{"class":565},"), ",[555,2613,1953],{"class":561},[555,2615,636],{"class":606},[555,2617,639],{"class":565},[555,2619,2620],{"class":585},"1",[555,2622,645],{"class":565},[555,2624,2625],{"class":585},"36",[555,2627,645],{"class":565},[555,2629,2630],{"class":585},"79",[555,2632,2633],{"class":565},")));\n",[555,2635,2636,2639,2641,2643,2646,2649,2652,2655,2658],{"class":557,"line":1559},[555,2637,2638],{"class":606},"        setPreferredSize",[555,2640,639],{"class":565},[555,2642,1953],{"class":561},[555,2644,2645],{"class":606}," Dimension",[555,2647,2648],{"class":565},"(frame.",[555,2650,2651],{"class":606},"getWidth",[555,2653,2654],{"class":565},"(), ",[555,2656,2657],{"class":585},"30",[555,2659,2660],{"class":565},"));\n",[555,2662,2663,2666,2668],{"class":557,"line":1591},[555,2664,2665],{"class":565},"        parentFrame ",[555,2667,630],{"class":561},[555,2669,2670],{"class":565}," frame;\n",[555,2672,2673,2676,2678,2680,2683],{"class":557,"line":1602},[555,2674,2675],{"class":565},"        closeButton ",[555,2677,630],{"class":561},[555,2679,633],{"class":561},[555,2681,2682],{"class":606}," RPGTitleBarButton",[555,2684,2685],{"class":565},"(RPGTitleBarButtonType.CLOSE);\n",[555,2687,2688,2691,2693,2695,2697],{"class":557,"line":1613},[555,2689,2690],{"class":565},"        minimizeButton ",[555,2692,630],{"class":561},[555,2694,633],{"class":561},[555,2696,2682],{"class":606},[555,2698,2699],{"class":565},"(RPGTitleBarButtonType.MINIMIZE);\n",[555,2701,2702,2705],{"class":557,"line":1625},[555,2703,2704],{"class":606},"        initComponents",[555,2706,2707],{"class":565},"(title);\n",[555,2709,2710,2713],{"class":557,"line":1637},[555,2711,2712],{"class":606},"        addListeners",[555,2714,713],{"class":565},[555,2716,2717],{"class":557,"line":1642},[555,2718,1483],{"class":565},[555,2720,2721],{"class":557,"line":1647},[555,2722,573],{"emptyLinePlaceholder":572},[555,2724,2725],{"class":557,"line":1652},[555,2726,1262],{"class":1225},[555,2728,2729],{"class":557,"line":1658},[555,2730,2731],{"class":1225},"     * Función privada para inicializar los componentes de la barra de título, incluyendo el título y los botones de cerrar y minimizar.\n",[555,2733,2734],{"class":557,"line":1663},[555,2735,1346],{"class":1225},[555,2737,2738,2740,2742,2744],{"class":557,"line":1676},[555,2739,1351],{"class":1225},[555,2741,1354],{"class":561},[555,2743,2539],{"class":1357},[555,2745,2542],{"class":1225},[555,2747,2748],{"class":557,"line":1689},[555,2749,1272],{"class":1225},[555,2751,2752,2754,2756,2759,2762,2764],{"class":557,"line":1702},[555,2753,1277],{"class":561},[555,2755,1760],{"class":561},[555,2757,2758],{"class":606}," initComponents",[555,2760,2761],{"class":565},"(String ",[555,2763,2564],{"class":1357},[555,2765,1399],{"class":565},[555,2767,2768],{"class":557,"line":1715},[555,2769,573],{"emptyLinePlaceholder":572},[555,2771,2772,2775,2777,2779,2781,2783,2785,2788,2791,2793,2795,2797],{"class":557,"line":1728},[555,2773,2774],{"class":565},"        JPanel buttonPanel ",[555,2776,630],{"class":561},[555,2778,633],{"class":561},[555,2780,2413],{"class":606},[555,2782,639],{"class":565},[555,2784,1953],{"class":561},[555,2786,2787],{"class":606}," FlowLayout",[555,2789,2790],{"class":565},"(FlowLayout.RIGHT, ",[555,2792,1118],{"class":585},[555,2794,645],{"class":565},[555,2796,1118],{"class":585},[555,2798,2660],{"class":565},[555,2800,2801,2804,2807,2809,2812],{"class":557,"line":1741},[555,2802,2803],{"class":565},"        buttonPanel.",[555,2805,2806],{"class":606},"setOpaque",[555,2808,639],{"class":565},[555,2810,2811],{"class":585},"false",[555,2813,655],{"class":565},[555,2815,2816,2818,2821],{"class":557,"line":1746},[555,2817,2803],{"class":565},[555,2819,2820],{"class":606},"add",[555,2822,2823],{"class":565},"(minimizeButton);\n",[555,2825,2826,2828,2830],{"class":557,"line":1755},[555,2827,2803],{"class":565},[555,2829,2820],{"class":606},[555,2831,2832],{"class":565},"(closeButton);\n",[555,2834,2835,2838,2840,2842,2845],{"class":557,"line":1804},[555,2836,2837],{"class":565},"        JLabel titleLabel ",[555,2839,630],{"class":561},[555,2841,633],{"class":561},[555,2843,2844],{"class":606}," JLabel",[555,2846,2707],{"class":565},[555,2848,2849,2852,2855,2857,2859,2862,2864,2866,2868,2870,2872,2874,2876,2878],{"class":557,"line":1810},[555,2850,2851],{"class":565},"        titleLabel.",[555,2853,2854],{"class":606},"setBorder",[555,2856,639],{"class":565},[555,2858,1953],{"class":561},[555,2860,2861],{"class":606}," EmptyBorder",[555,2863,639],{"class":565},[555,2865,1118],{"class":585},[555,2867,645],{"class":565},[555,2869,953],{"class":585},[555,2871,645],{"class":565},[555,2873,1118],{"class":585},[555,2875,645],{"class":565},[555,2877,1118],{"class":585},[555,2879,2660],{"class":565},[555,2881,2882,2884,2887],{"class":557,"line":1826},[555,2883,2851],{"class":565},[555,2885,2886],{"class":606},"setForeground",[555,2888,2889],{"class":565},"(Color.WHITE);\n",[555,2891,2892,2895],{"class":557,"line":1831},[555,2893,2894],{"class":606},"        add",[555,2896,2897],{"class":565},"(titleLabel, BorderLayout.WEST);\n",[555,2899,2900,2902],{"class":557,"line":1837},[555,2901,2894],{"class":606},[555,2903,2904],{"class":565},"(buttonPanel, BorderLayout.EAST);\n",[555,2906,2907],{"class":557,"line":1849},[555,2908,1483],{"class":565},[555,2910,2911],{"class":557,"line":1855},[555,2912,573],{"emptyLinePlaceholder":572},[555,2914,2915],{"class":557,"line":1860},[555,2916,1262],{"class":1225},[555,2918,2919],{"class":557,"line":1866},[555,2920,2921],{"class":1225},"     * Función privada para agregar los listeners a los botones de cerrar y minimizar, permitiendo que la barra de título controle las acciones de la ventana principal.\n",[555,2923,2924],{"class":557,"line":1872},[555,2925,1272],{"class":1225},[555,2927,2928,2930,2932,2935],{"class":557,"line":1888},[555,2929,1277],{"class":561},[555,2931,1760],{"class":561},[555,2933,2934],{"class":606}," addListeners",[555,2936,2243],{"class":565},[555,2938,2939],{"class":557,"line":1901},[555,2940,573],{"emptyLinePlaceholder":572},[555,2942,2943,2946,2949,2952,2955,2958,2961,2963,2965],{"class":557,"line":1909},[555,2944,2945],{"class":565},"        closeButton.",[555,2947,2948],{"class":606},"addActionListener",[555,2950,2951],{"class":565},"(e ",[555,2953,2954],{"class":561},"->",[555,2956,2957],{"class":565}," System.",[555,2959,2960],{"class":606},"exit",[555,2962,639],{"class":565},[555,2964,1118],{"class":585},[555,2966,2660],{"class":565},[555,2968,2969,2972,2974,2976,2978,2981,2984],{"class":557,"line":1915},[555,2970,2971],{"class":565},"        minimizeButton.",[555,2973,2948],{"class":606},[555,2975,2951],{"class":565},[555,2977,2954],{"class":561},[555,2979,2980],{"class":565}," parentFrame.",[555,2982,2983],{"class":606},"setState",[555,2985,2986],{"class":565},"(JFrame.ICONIFIED));\n",[555,2988,2989],{"class":557,"line":1920},[555,2990,1483],{"class":565},[555,2992,2993],{"class":557,"line":1926},[555,2994,573],{"emptyLinePlaceholder":572},[555,2996,2997],{"class":557,"line":1937},[555,2998,1262],{"class":1225},[555,3000,3001],{"class":557,"line":1943},[555,3002,3003],{"class":1225},"     * Función pública para habilitar el arrastre de la ventana al hacer clic y arrastrar la barra de título. Esto permite que el usuario mueva la ventana arrastrando la barra de título, proporcionando una experiencia de usuario más fluida y personalizada.\n",[555,3005,3006],{"class":557,"line":1962},[555,3007,1272],{"class":1225},[555,3009,3010,3012,3014,3017],{"class":557,"line":1967},[555,3011,621],{"class":561},[555,3013,1760],{"class":561},[555,3015,3016],{"class":606}," enableWindowDragging",[555,3018,2243],{"class":565},[555,3020,3021],{"class":557,"line":1973},[555,3022,573],{"emptyLinePlaceholder":572},[555,3024,3025,3028,3030,3032,3035],{"class":557,"line":1979},[555,3026,3027],{"class":565},"        RPGWindowDragListener dragListener ",[555,3029,630],{"class":561},[555,3031,633],{"class":561},[555,3033,3034],{"class":606}," RPGWindowDragListener",[555,3036,3037],{"class":565},"(parentFrame);\n",[555,3039,3040,3043],{"class":557,"line":1989},[555,3041,3042],{"class":606},"        addMouseListener",[555,3044,3045],{"class":565},"(dragListener);\n",[555,3047,3048,3051],{"class":557,"line":2010},[555,3049,3050],{"class":606},"        addMouseMotionListener",[555,3052,3045],{"class":565},[555,3054,3055],{"class":557,"line":2026},[555,3056,1483],{"class":565},[555,3058,3059],{"class":557,"line":2038},[555,3060,1158],{"class":565},[423,3062,3063,3064,3067,3068,3070],{},"En este código, hemos creado la clase ",[434,3065,3066],{},"RPGTitleBar"," que extiende ",[434,3069,440],{}," para crear una barra de título personalizada para la ventana principal de nuestro RPG. Esta barra de título incluye botones personalizados para cerrar y minimizar la ventana, y se puede personalizar con diferentes colores y estilos. Además, hemos agregado funcionalidad para permitir que el usuario arrastre la ventana al hacer clic y arrastrar la barra de título, proporcionando una experiencia de usuario más fluida y personalizada.",[544,3072,3073],{},[510,3074,3077],{"className":548,"code":3075,"filename":3076,"language":551,"meta":518,"style":518},"package app.game.rpg.ui.components.delegates;\n\nimport javax.swing.*;\nimport java.awt.*;\n\n\u002F**\n * RPGTitleBarUI es una clase personalizada que extiende RPGPanelUI para proporcionar un panel de título con un borde redondeado\n * y degradado de color, diseñado específicamente para la barra de título de nuestra interfaz gráfica de juego RPG. Este panel se puede utilizar\n * para mostrar el título del juego o cualquier información relevante en la parte superior de la ventana del juego.\n *\u002F\npublic class RPGTitleBarUI extends RPGPanelUI {\n\n\n    \u002F**\n     * Constructor para crear un objeto Panel de título con el color de inicio y final del degradado.\n     *\n     * @param startColor Color inicial seleccionado para el degradado del panel.\n     * @param endColor   Color final seleccionado para el degradado del panel.\n     *\u002F\n    public RPGTitleBarUI(Color startColor, Color endColor) {\n        super(startColor, endColor);\n    }\n\n    \u002F**\n     * Función que permite aplicar características por defecto a un JPanel. En nuestro caso, eliminamos su borde y un layout box\n     * para que los componentes a agregar se coloquen de forma vertical.\n     *\n     * @param p an instance of {@code JPanel}\n     *\u002F\n    @Override\n    protected void installDefaults(JPanel p) {\n        super.installDefaults(p);\n        p.setBorder(null);\n        p.setLayout(new BorderLayout());\n    }\n\n    \u002F**\n     * Función que permite dibujar el fondo degradado del panel RPGTitleBarUI en un componente {@code JComponent}.\n     * En nuestro caso usamos un degradado lineal para dibujar una textura con un color inicial y final,\n     * desde la parte superior del componente hasta la mitad de su altura.\n     *\n     * @param c an instance of {@code JComponent}\n     * @return an instance of {@code Paint} representing the gradient to be used for painting the background of the component.\n     *\u002F\n    @Override\n    protected Paint getPaintMethod(JComponent c) {\n        int x1 = 0, y1 = 0;\n        int x2 = 0, y2 = c.getHeight() \u002F 2;\n        return new GradientPaint(x1, y1, startColor, x2, y2, endColor);\n    }\n}\n","app.game.rpg.ui.components.delegates.RPGTitleBarUI.java",[434,3078,3079,3086,3090,3100,3110,3114,3118,3123,3128,3133,3137,3152,3156,3160,3164,3169,3173,3184,3195,3199,3216,3224,3228,3232,3236,3241,3246,3250,3262,3266,3272,3289,3302,3316,3333,3337,3341,3345,3350,3355,3360,3364,3375,3384,3388,3394,3411,3433,3464,3475,3479],{"__ignoreMap":518},[555,3080,3081,3083],{"class":557,"line":558},[555,3082,562],{"class":561},[555,3084,3085],{"class":565}," app.game.rpg.ui.components.delegates;\n",[555,3087,3088],{"class":557,"line":569},[555,3089,573],{"emptyLinePlaceholder":572},[555,3091,3092,3094,3096,3098],{"class":557,"line":576},[555,3093,579],{"class":561},[555,3095,2360],{"class":565},[555,3097,586],{"class":585},[555,3099,589],{"class":565},[555,3101,3102,3104,3106,3108],{"class":557,"line":592},[555,3103,579],{"class":561},[555,3105,582],{"class":565},[555,3107,586],{"class":585},[555,3109,589],{"class":565},[555,3111,3112],{"class":557,"line":597},[555,3113,573],{"emptyLinePlaceholder":572},[555,3115,3116],{"class":557,"line":613},[555,3117,1226],{"class":1225},[555,3119,3120],{"class":557,"line":618},[555,3121,3122],{"class":1225}," * RPGTitleBarUI es una clase personalizada que extiende RPGPanelUI para proporcionar un panel de título con un borde redondeado\n",[555,3124,3125],{"class":557,"line":658},[555,3126,3127],{"class":1225}," * y degradado de color, diseñado específicamente para la barra de título de nuestra interfaz gráfica de juego RPG. Este panel se puede utilizar\n",[555,3129,3130],{"class":557,"line":690},[555,3131,3132],{"class":1225}," * para mostrar el título del juego o cualquier información relevante en la parte superior de la ventana del juego.\n",[555,3134,3135],{"class":557,"line":695},[555,3136,1236],{"class":1225},[555,3138,3139,3141,3143,3145,3147,3150],{"class":557,"line":716},[555,3140,600],{"class":561},[555,3142,603],{"class":561},[555,3144,2587],{"class":606},[555,3146,2410],{"class":561},[555,3148,3149],{"class":606}," RPGPanelUI",[555,3151,610],{"class":565},[555,3153,3154],{"class":557,"line":735},[555,3155,573],{"emptyLinePlaceholder":572},[555,3157,3158],{"class":557,"line":740},[555,3159,573],{"emptyLinePlaceholder":572},[555,3161,3162],{"class":557,"line":759},[555,3163,1262],{"class":1225},[555,3165,3166],{"class":557,"line":777},[555,3167,3168],{"class":1225},"     * Constructor para crear un objeto Panel de título con el color de inicio y final del degradado.\n",[555,3170,3171],{"class":557,"line":782},[555,3172,1346],{"class":1225},[555,3174,3175,3177,3179,3181],{"class":557,"line":814},[555,3176,1351],{"class":1225},[555,3178,1354],{"class":561},[555,3180,1535],{"class":1357},[555,3182,3183],{"class":1225}," Color inicial seleccionado para el degradado del panel.\n",[555,3185,3186,3188,3190,3192],{"class":557,"line":846},[555,3187,1351],{"class":1225},[555,3189,1354],{"class":561},[555,3191,1548],{"class":1357},[555,3193,3194],{"class":1225},"   Color final seleccionado para el degradado del panel.\n",[555,3196,3197],{"class":557,"line":851},[555,3198,1272],{"class":1225},[555,3200,3201,3203,3205,3208,3210,3212,3214],{"class":557,"line":870},[555,3202,621],{"class":561},[555,3204,2587],{"class":606},[555,3206,3207],{"class":565},"(Color ",[555,3209,1581],{"class":1357},[555,3211,1578],{"class":565},[555,3213,1586],{"class":1357},[555,3215,1399],{"class":565},[555,3217,3218,3221],{"class":557,"line":889},[555,3219,3220],{"class":585},"        super",[555,3222,3223],{"class":565},"(startColor, endColor);\n",[555,3225,3226],{"class":557,"line":894},[555,3227,1483],{"class":565},[555,3229,3230],{"class":557,"line":912},[555,3231,573],{"emptyLinePlaceholder":572},[555,3233,3234],{"class":557,"line":930},[555,3235,1262],{"class":1225},[555,3237,3238],{"class":557,"line":935},[555,3239,3240],{"class":1225},"     * Función que permite aplicar características por defecto a un JPanel. En nuestro caso, eliminamos su borde y un layout box\n",[555,3242,3243],{"class":557,"line":968},[555,3244,3245],{"class":1225},"     * para que los componentes a agregar se coloquen de forma vertical.\n",[555,3247,3248],{"class":557,"line":1001},[555,3249,1346],{"class":1225},[555,3251,3252,3254,3256,3259],{"class":557,"line":1006},[555,3253,1351],{"class":1225},[555,3255,1354],{"class":561},[555,3257,3258],{"class":1357}," p",[555,3260,3261],{"class":1225}," an instance of {@code JPanel}\n",[555,3263,3264],{"class":557,"line":1025},[555,3265,1272],{"class":1225},[555,3267,3268,3270],{"class":557,"line":1044},[555,3269,1749],{"class":565},[555,3271,1752],{"class":561},[555,3273,3274,3277,3279,3282,3285,3287],{"class":557,"line":1049},[555,3275,3276],{"class":561},"    protected",[555,3278,1760],{"class":561},[555,3280,3281],{"class":606}," installDefaults",[555,3283,3284],{"class":565},"(JPanel ",[555,3286,423],{"class":1357},[555,3288,1399],{"class":565},[555,3290,3291,3293,3296,3299],{"class":557,"line":1067},[555,3292,3220],{"class":585},[555,3294,3295],{"class":565},".",[555,3297,3298],{"class":606},"installDefaults",[555,3300,3301],{"class":565},"(p);\n",[555,3303,3304,3307,3309,3311,3314],{"class":557,"line":1085},[555,3305,3306],{"class":565},"        p.",[555,3308,2854],{"class":606},[555,3310,639],{"class":565},[555,3312,3313],{"class":585},"null",[555,3315,655],{"class":565},[555,3317,3318,3320,3323,3325,3327,3330],{"class":557,"line":1090},[555,3319,3306],{"class":565},[555,3321,3322],{"class":606},"setLayout",[555,3324,639],{"class":565},[555,3326,1953],{"class":561},[555,3328,3329],{"class":606}," BorderLayout",[555,3331,3332],{"class":565},"());\n",[555,3334,3335],{"class":557,"line":1123},[555,3336,1483],{"class":565},[555,3338,3339],{"class":557,"line":1155},[555,3340,573],{"emptyLinePlaceholder":572},[555,3342,3343],{"class":557,"line":1499},[555,3344,1262],{"class":1225},[555,3346,3347],{"class":557,"line":1504},[555,3348,3349],{"class":1225},"     * Función que permite dibujar el fondo degradado del panel RPGTitleBarUI en un componente {@code JComponent}.\n",[555,3351,3352],{"class":557,"line":1516},[555,3353,3354],{"class":1225},"     * En nuestro caso usamos un degradado lineal para dibujar una textura con un color inicial y final,\n",[555,3356,3357],{"class":557,"line":1528},[555,3358,3359],{"class":1225},"     * desde la parte superior del componente hasta la mitad de su altura.\n",[555,3361,3362],{"class":557,"line":1541},[555,3363,1346],{"class":1225},[555,3365,3366,3368,3370,3372],{"class":557,"line":1554},[555,3367,1351],{"class":1225},[555,3369,1354],{"class":561},[555,3371,1670],{"class":1357},[555,3373,3374],{"class":1225}," an instance of {@code JComponent}\n",[555,3376,3377,3379,3381],{"class":557,"line":1559},[555,3378,1351],{"class":1225},[555,3380,2135],{"class":561},[555,3382,3383],{"class":1225}," an instance of {@code Paint} representing the gradient to be used for painting the background of the component.\n",[555,3385,3386],{"class":557,"line":1591},[555,3387,1272],{"class":1225},[555,3389,3390,3392],{"class":557,"line":1602},[555,3391,1749],{"class":565},[555,3393,1752],{"class":561},[555,3395,3396,3398,3401,3404,3407,3409],{"class":557,"line":1613},[555,3397,3276],{"class":561},[555,3399,3400],{"class":565}," Paint ",[555,3402,3403],{"class":606},"getPaintMethod",[555,3405,3406],{"class":565},"(JComponent ",[555,3408,1769],{"class":1357},[555,3410,1399],{"class":565},[555,3412,3413,3416,3419,3421,3424,3427,3429,3431],{"class":557,"line":1625},[555,3414,3415],{"class":561},"        int",[555,3417,3418],{"class":565}," x1 ",[555,3420,630],{"class":561},[555,3422,3423],{"class":585}," 0",[555,3425,3426],{"class":565},", y1 ",[555,3428,630],{"class":561},[555,3430,3423],{"class":585},[555,3432,589],{"class":565},[555,3434,3435,3437,3440,3442,3444,3447,3449,3452,3455,3458,3460,3462],{"class":557,"line":1637},[555,3436,3415],{"class":561},[555,3438,3439],{"class":565}," x2 ",[555,3441,630],{"class":561},[555,3443,3423],{"class":585},[555,3445,3446],{"class":565},", y2 ",[555,3448,630],{"class":561},[555,3450,3451],{"class":565}," c.",[555,3453,3454],{"class":606},"getHeight",[555,3456,3457],{"class":565},"() ",[555,3459,2001],{"class":561},[555,3461,2004],{"class":585},[555,3463,589],{"class":565},[555,3465,3466,3468,3470,3472],{"class":557,"line":1642},[555,3467,2173],{"class":561},[555,3469,633],{"class":561},[555,3471,1882],{"class":606},[555,3473,3474],{"class":565},"(x1, y1, startColor, x2, y2, endColor);\n",[555,3476,3477],{"class":557,"line":1647},[555,3478,1483],{"class":565},[555,3480,3481],{"class":557,"line":1652},[555,3482,1158],{"class":565},[423,3484,3063,3485,3067,3488,3491,3492,3494,3495,3498,3499,3501,3502,3505],{},[434,3486,3487],{},"RPGTitleBarUI",[434,3489,3490],{},"RPGPanelUI"," para proporcionar un panel de título con un borde redondeado y degradado de color, diseñado específicamente para la barra de título de nuestra interfaz gráfica de juego RPG. Este panel se puede utilizar para mostrar el título del juego o cualquier información relevante en la parte superior de la ventana del juego. Hemos personalizado el método ",[434,3493,3298],{}," para eliminar el borde del panel y establecer un layout de tipo ",[434,3496,3497],{},"BorderLayout",", y el método ",[434,3500,3403],{}," para dibujar un fondo degradado utilizando un ",[434,3503,3504],{},"GradientPaint"," que va desde la parte superior del componente hasta la mitad de su altura, proporcionando un efecto visual atractivo para la barra de título.",[544,3507,3508],{},[510,3509,3512],{"className":548,"code":3510,"filename":3511,"language":551,"meta":518,"style":518},"package app.game.rpg.ui.components.buttons;\n\nimport app.game.rpg.ui.components.delegates.RPGTitleBarButtonUI;\n\nimport javax.swing.*;\nimport java.awt.*;\n\n\u002F**\n * RPGTitleBarButton es una clase personalizada que extiende JButton para crear botones personalizados para la barra de título de la ventana principal de nuestro RPG. Estos botones pueden ser de tipo cerrar, minimizar, maximizar o restaurar, y se pueden personalizar con diferentes colores y estilos.\n *\u002F\npublic class RPGTitleBarButton extends JButton {\n    \u002F**\n     * Tipo del botón, que determina su función (cerrar, minimizar, maximizar o restaurar) y su apariencia.\n     *\u002F\n    private RPGTitleBarButtonType type;\n\n    \u002F**\n     * Constructor para crear un botón personalizado para la barra de título, basado en el tipo especificado.\n     *\n     * @param type El tipo del botón, que determina su función (cerrar, minimizar, maximizar o restaurar) y su apariencia. Este parámetro es esencial para configurar correctamente el botón y su comportamiento en la barra de título personalizada.\n     *\u002F\n    public RPGTitleBarButton(RPGTitleBarButtonType type) {\n\n        this.type = type;\n        switch (type) {\n            case CLOSE -> setBackground(new Color(200, 60, 60));\n            case MINIMIZE -> setBackground(new Color(60, 60, 200));\n            case MAXIMIZE, RESTORE -> setBackground(new Color(60, 200, 60));\n        }\n        setIcon(type.getSymbol());\n        setUI(new RPGTitleBarButtonUI());\n    }\n\n    \u002F**\n     * Función para actualizar el tipo del botón y su apariencia en la barra de título personalizada. Esta función permite cambiar dinámicamente el tipo del botón (por ejemplo, de maximizar a restaurar) y actualizar su icono y estilo en consecuencia.\n     *\n     * @param type El nuevo tipo del botón, que determina su función (cerrar, minimizar, maximizar o restaurar) y su apariencia. Este parámetro es esencial para actualizar correctamente el botón y su comportamiento en la barra de título personalizada.\n     *\u002F\n    public void setType(RPGTitleBarButtonType type) {\n\n        this.type = type;\n        setIcon(type.getSymbol());\n        revalidate();\n        repaint();\n    }\n}\n","app.game.rpg.ui.components.buttons.RPGTitleBarButton.java",[434,3513,3514,3521,3525,3532,3536,3546,3556,3560,3564,3569,3573,3588,3592,3597,3601,3608,3612,3616,3621,3625,3637,3641,3655,3659,3671,3679,3714,3745,3776,3781,3794,3807,3811,3815,3819,3824,3828,3839,3843,3858,3862,3872,3882,3889,3896,3900],{"__ignoreMap":518},[555,3515,3516,3518],{"class":557,"line":558},[555,3517,562],{"class":561},[555,3519,3520],{"class":565}," app.game.rpg.ui.components.buttons;\n",[555,3522,3523],{"class":557,"line":569},[555,3524,573],{"emptyLinePlaceholder":572},[555,3526,3527,3529],{"class":557,"line":576},[555,3528,579],{"class":561},[555,3530,3531],{"class":565}," app.game.rpg.ui.components.delegates.RPGTitleBarButtonUI;\n",[555,3533,3534],{"class":557,"line":592},[555,3535,573],{"emptyLinePlaceholder":572},[555,3537,3538,3540,3542,3544],{"class":557,"line":597},[555,3539,579],{"class":561},[555,3541,2360],{"class":565},[555,3543,586],{"class":585},[555,3545,589],{"class":565},[555,3547,3548,3550,3552,3554],{"class":557,"line":613},[555,3549,579],{"class":561},[555,3551,582],{"class":565},[555,3553,586],{"class":585},[555,3555,589],{"class":565},[555,3557,3558],{"class":557,"line":618},[555,3559,573],{"emptyLinePlaceholder":572},[555,3561,3562],{"class":557,"line":658},[555,3563,1226],{"class":1225},[555,3565,3566],{"class":557,"line":690},[555,3567,3568],{"class":1225}," * RPGTitleBarButton es una clase personalizada que extiende JButton para crear botones personalizados para la barra de título de la ventana principal de nuestro RPG. Estos botones pueden ser de tipo cerrar, minimizar, maximizar o restaurar, y se pueden personalizar con diferentes colores y estilos.\n",[555,3570,3571],{"class":557,"line":695},[555,3572,1236],{"class":1225},[555,3574,3575,3577,3579,3581,3583,3586],{"class":557,"line":716},[555,3576,600],{"class":561},[555,3578,603],{"class":561},[555,3580,2682],{"class":606},[555,3582,2410],{"class":561},[555,3584,3585],{"class":606}," JButton",[555,3587,610],{"class":565},[555,3589,3590],{"class":557,"line":735},[555,3591,1262],{"class":1225},[555,3593,3594],{"class":557,"line":740},[555,3595,3596],{"class":1225},"     * Tipo del botón, que determina su función (cerrar, minimizar, maximizar o restaurar) y su apariencia.\n",[555,3598,3599],{"class":557,"line":759},[555,3600,1272],{"class":1225},[555,3602,3603,3605],{"class":557,"line":777},[555,3604,1277],{"class":561},[555,3606,3607],{"class":565}," RPGTitleBarButtonType type;\n",[555,3609,3610],{"class":557,"line":782},[555,3611,573],{"emptyLinePlaceholder":572},[555,3613,3614],{"class":557,"line":814},[555,3615,1262],{"class":1225},[555,3617,3618],{"class":557,"line":846},[555,3619,3620],{"class":1225},"     * Constructor para crear un botón personalizado para la barra de título, basado en el tipo especificado.\n",[555,3622,3623],{"class":557,"line":851},[555,3624,1346],{"class":1225},[555,3626,3627,3629,3631,3634],{"class":557,"line":870},[555,3628,1351],{"class":1225},[555,3630,1354],{"class":561},[555,3632,3633],{"class":1357}," type",[555,3635,3636],{"class":1225}," El tipo del botón, que determina su función (cerrar, minimizar, maximizar o restaurar) y su apariencia. Este parámetro es esencial para configurar correctamente el botón y su comportamiento en la barra de título personalizada.\n",[555,3638,3639],{"class":557,"line":889},[555,3640,1272],{"class":1225},[555,3642,3643,3645,3647,3650,3653],{"class":557,"line":894},[555,3644,621],{"class":561},[555,3646,2682],{"class":606},[555,3648,3649],{"class":565},"(RPGTitleBarButtonType ",[555,3651,3652],{"class":1357},"type",[555,3654,1399],{"class":565},[555,3656,3657],{"class":557,"line":912},[555,3658,573],{"emptyLinePlaceholder":572},[555,3660,3661,3663,3666,3668],{"class":557,"line":930},[555,3662,1404],{"class":585},[555,3664,3665],{"class":565},".type ",[555,3667,630],{"class":561},[555,3669,3670],{"class":565}," type;\n",[555,3672,3673,3676],{"class":557,"line":935},[555,3674,3675],{"class":561},"        switch",[555,3677,3678],{"class":565}," (type) {\n",[555,3680,3681,3684,3687,3689,3692,3694,3696,3698,3700,3703,3705,3708,3710,3712],{"class":557,"line":968},[555,3682,3683],{"class":561},"            case",[555,3685,3686],{"class":565}," CLOSE ",[555,3688,2954],{"class":561},[555,3690,3691],{"class":606}," setBackground",[555,3693,639],{"class":565},[555,3695,1953],{"class":561},[555,3697,636],{"class":606},[555,3699,639],{"class":565},[555,3701,3702],{"class":585},"200",[555,3704,645],{"class":565},[555,3706,3707],{"class":585},"60",[555,3709,645],{"class":565},[555,3711,3707],{"class":585},[555,3713,2660],{"class":565},[555,3715,3716,3718,3721,3723,3725,3727,3729,3731,3733,3735,3737,3739,3741,3743],{"class":557,"line":1001},[555,3717,3683],{"class":561},[555,3719,3720],{"class":565}," MINIMIZE ",[555,3722,2954],{"class":561},[555,3724,3691],{"class":606},[555,3726,639],{"class":565},[555,3728,1953],{"class":561},[555,3730,636],{"class":606},[555,3732,639],{"class":565},[555,3734,3707],{"class":585},[555,3736,645],{"class":565},[555,3738,3707],{"class":585},[555,3740,645],{"class":565},[555,3742,3702],{"class":585},[555,3744,2660],{"class":565},[555,3746,3747,3749,3752,3754,3756,3758,3760,3762,3764,3766,3768,3770,3772,3774],{"class":557,"line":1006},[555,3748,3683],{"class":561},[555,3750,3751],{"class":565}," MAXIMIZE, RESTORE ",[555,3753,2954],{"class":561},[555,3755,3691],{"class":606},[555,3757,639],{"class":565},[555,3759,1953],{"class":561},[555,3761,636],{"class":606},[555,3763,639],{"class":565},[555,3765,3707],{"class":585},[555,3767,645],{"class":565},[555,3769,3702],{"class":585},[555,3771,645],{"class":565},[555,3773,3707],{"class":585},[555,3775,2660],{"class":565},[555,3777,3778],{"class":557,"line":1025},[555,3779,3780],{"class":565},"        }\n",[555,3782,3783,3786,3789,3792],{"class":557,"line":1044},[555,3784,3785],{"class":606},"        setIcon",[555,3787,3788],{"class":565},"(type.",[555,3790,3791],{"class":606},"getSymbol",[555,3793,3332],{"class":565},[555,3795,3796,3798,3800,3802,3805],{"class":557,"line":1049},[555,3797,2580],{"class":606},[555,3799,639],{"class":565},[555,3801,1953],{"class":561},[555,3803,3804],{"class":606}," RPGTitleBarButtonUI",[555,3806,3332],{"class":565},[555,3808,3809],{"class":557,"line":1067},[555,3810,1483],{"class":565},[555,3812,3813],{"class":557,"line":1085},[555,3814,573],{"emptyLinePlaceholder":572},[555,3816,3817],{"class":557,"line":1090},[555,3818,1262],{"class":1225},[555,3820,3821],{"class":557,"line":1123},[555,3822,3823],{"class":1225},"     * Función para actualizar el tipo del botón y su apariencia en la barra de título personalizada. Esta función permite cambiar dinámicamente el tipo del botón (por ejemplo, de maximizar a restaurar) y actualizar su icono y estilo en consecuencia.\n",[555,3825,3826],{"class":557,"line":1155},[555,3827,1346],{"class":1225},[555,3829,3830,3832,3834,3836],{"class":557,"line":1499},[555,3831,1351],{"class":1225},[555,3833,1354],{"class":561},[555,3835,3633],{"class":1357},[555,3837,3838],{"class":1225}," El nuevo tipo del botón, que determina su función (cerrar, minimizar, maximizar o restaurar) y su apariencia. Este parámetro es esencial para actualizar correctamente el botón y su comportamiento en la barra de título personalizada.\n",[555,3840,3841],{"class":557,"line":1504},[555,3842,1272],{"class":1225},[555,3844,3845,3847,3849,3852,3854,3856],{"class":557,"line":1516},[555,3846,621],{"class":561},[555,3848,1760],{"class":561},[555,3850,3851],{"class":606}," setType",[555,3853,3649],{"class":565},[555,3855,3652],{"class":1357},[555,3857,1399],{"class":565},[555,3859,3860],{"class":557,"line":1528},[555,3861,573],{"emptyLinePlaceholder":572},[555,3863,3864,3866,3868,3870],{"class":557,"line":1541},[555,3865,1404],{"class":585},[555,3867,3665],{"class":565},[555,3869,630],{"class":561},[555,3871,3670],{"class":565},[555,3873,3874,3876,3878,3880],{"class":557,"line":1554},[555,3875,3785],{"class":606},[555,3877,3788],{"class":565},[555,3879,3791],{"class":606},[555,3881,3332],{"class":565},[555,3883,3884,3887],{"class":557,"line":1559},[555,3885,3886],{"class":606},"        revalidate",[555,3888,713],{"class":565},[555,3890,3891,3894],{"class":557,"line":1591},[555,3892,3893],{"class":606},"        repaint",[555,3895,713],{"class":565},[555,3897,3898],{"class":557,"line":1602},[555,3899,1483],{"class":565},[555,3901,3902],{"class":557,"line":1613},[555,3903,1158],{"class":565},[423,3905,3063,3906,3067,3909,3911,3912,3914,3915,3918],{},[434,3907,3908],{},"RPGTitleBarButton",[434,3910,436],{}," para crear botones personalizados para la barra de título de la ventana principal de nuestro RPG. Estos botones pueden ser de tipo cerrar, minimizar, maximizar o restaurar, y se pueden personalizar con diferentes colores y estilos. El constructor de la clase toma un parámetro ",[434,3913,3652],{}," que determina el tipo del botón y su apariencia, y se utiliza un switch para configurar el color de fondo y el icono del botón según su tipo. Además, hemos agregado una función ",[434,3916,3917],{},"setType"," que permite actualizar dinámicamente el tipo del botón y su apariencia en la barra de título personalizada.",[544,3920,3921],{},[510,3922,3925],{"className":548,"code":3923,"filename":3924,"language":551,"meta":518,"style":518},"package app.game.rpg.ui.components.buttons;\n\nimport jiconfont.IconCode;\nimport jiconfont.icons.font_awesome.FontAwesome;\nimport jiconfont.swing.IconFontSwing;\n\nimport javax.swing.*;\nimport java.awt.*;\n\n\u002F**\n * Enum RPGTitleBarButtonType define los tipos de botones que se pueden utilizar en la barra de título personalizada de la ventana principal de nuestro RPG. Cada tipo de botón tiene un icono asociado que se muestra en la barra de título, y se puede personalizar con diferentes colores y estilos.\n *\u002F\npublic enum RPGTitleBarButtonType {\n\n    CLOSE(\"WINDOW_CLOSE\"),\n    MINIMIZE(\"WINDOW_MINIMIZE\"),\n    RESTORE(\"WINDOW_RESTORE\"),\n    MAXIMIZE(\"WINDOW_MAXIMIZE\");\n\n    \u002F**\n     * Icono asociado al tipo de botón, que se muestra en la barra de título personalizada. Este icono se genera utilizando la biblioteca IconFontSwing y el conjunto de iconos FontAwesome, lo que permite una apariencia visual atractiva y coherente con el estilo del RPG.\n     *\u002F\n    private final Icon symbol;\n\n    \u002F**\n     * Constructor para crear un tipo de botón con un icono asociado. El constructor recibe un símbolo como parámetro, que se utiliza para generar el icono correspondiente utilizando la biblioteca IconFontSwing y el conjunto de iconos FontAwesome. Este proceso permite que cada tipo de botón tenga un icono visualmente distintivo que se muestra en la barra de título personalizada.\n     *\n     * @param symbol El símbolo que se utiliza para generar el icono asociado al tipo de botón. Este parámetro es esencial para configurar correctamente el icono que se mostrará en la barra de título personalizada, proporcionando una experiencia de usuario más atractiva y coherente con el estilo del RPG.\n     *\u002F\n    RPGTitleBarButtonType(String symbol) {\n\n        IconFontSwing.register(FontAwesome.getIconFont());\n        IconCode iconCode = FontAwesome.valueOf(symbol);\n        this.symbol = IconFontSwing.buildIcon(iconCode, 20, Color.WHITE);\n    }\n\n    \u002F**\n     * Función para obtener el icono asociado al tipo de botón. Esta función devuelve el icono que se muestra en la barra de título personalizada, lo que permite que cada tipo de botón tenga una apariencia visual distintiva y coherente con el estilo del RPG.\n     *\n     * @return El icono asociado al tipo de botón, que se muestra en la barra de título personalizada. Este valor es esencial para configurar correctamente la apariencia visual del botón en la barra de título personalizada, proporcionando una experiencia de usuario más atractiva y coherente con el estilo del RPG.\n     *\u002F\n    public Icon getSymbol() {\n\n        return symbol;\n    }\n}\n","app.game.rpg.ui.components.buttons.RPGTitleBarButtonType.java",[434,3926,3927,3933,3937,3944,3951,3958,3962,3972,3982,3986,3990,3995,3999,4011,4015,4029,4041,4053,4065,4069,4073,4078,4082,4091,4095,4099,4104,4108,4120,4124,4136,4140,4156,4172,4196,4200,4204,4208,4213,4217,4226,4230,4241,4245,4252,4256],{"__ignoreMap":518},[555,3928,3929,3931],{"class":557,"line":558},[555,3930,562],{"class":561},[555,3932,3520],{"class":565},[555,3934,3935],{"class":557,"line":569},[555,3936,573],{"emptyLinePlaceholder":572},[555,3938,3939,3941],{"class":557,"line":576},[555,3940,579],{"class":561},[555,3942,3943],{"class":565}," jiconfont.IconCode;\n",[555,3945,3946,3948],{"class":557,"line":592},[555,3947,579],{"class":561},[555,3949,3950],{"class":565}," jiconfont.icons.font_awesome.FontAwesome;\n",[555,3952,3953,3955],{"class":557,"line":597},[555,3954,579],{"class":561},[555,3956,3957],{"class":565}," jiconfont.swing.IconFontSwing;\n",[555,3959,3960],{"class":557,"line":613},[555,3961,573],{"emptyLinePlaceholder":572},[555,3963,3964,3966,3968,3970],{"class":557,"line":618},[555,3965,579],{"class":561},[555,3967,2360],{"class":565},[555,3969,586],{"class":585},[555,3971,589],{"class":565},[555,3973,3974,3976,3978,3980],{"class":557,"line":658},[555,3975,579],{"class":561},[555,3977,582],{"class":565},[555,3979,586],{"class":585},[555,3981,589],{"class":565},[555,3983,3984],{"class":557,"line":690},[555,3985,573],{"emptyLinePlaceholder":572},[555,3987,3988],{"class":557,"line":695},[555,3989,1226],{"class":1225},[555,3991,3992],{"class":557,"line":716},[555,3993,3994],{"class":1225}," * Enum RPGTitleBarButtonType define los tipos de botones que se pueden utilizar en la barra de título personalizada de la ventana principal de nuestro RPG. Cada tipo de botón tiene un icono asociado que se muestra en la barra de título, y se puede personalizar con diferentes colores y estilos.\n",[555,3996,3997],{"class":557,"line":735},[555,3998,1236],{"class":1225},[555,4000,4001,4003,4006,4009],{"class":557,"line":740},[555,4002,600],{"class":561},[555,4004,4005],{"class":561}," enum",[555,4007,4008],{"class":606}," RPGTitleBarButtonType",[555,4010,610],{"class":565},[555,4012,4013],{"class":557,"line":759},[555,4014,573],{"emptyLinePlaceholder":572},[555,4016,4017,4020,4022,4026],{"class":557,"line":777},[555,4018,4019],{"class":585},"    CLOSE",[555,4021,639],{"class":565},[555,4023,4025],{"class":4024},"sU2Wk","\"WINDOW_CLOSE\"",[555,4027,4028],{"class":565},"),\n",[555,4030,4031,4034,4036,4039],{"class":557,"line":782},[555,4032,4033],{"class":585},"    MINIMIZE",[555,4035,639],{"class":565},[555,4037,4038],{"class":4024},"\"WINDOW_MINIMIZE\"",[555,4040,4028],{"class":565},[555,4042,4043,4046,4048,4051],{"class":557,"line":814},[555,4044,4045],{"class":585},"    RESTORE",[555,4047,639],{"class":565},[555,4049,4050],{"class":4024},"\"WINDOW_RESTORE\"",[555,4052,4028],{"class":565},[555,4054,4055,4058,4060,4063],{"class":557,"line":846},[555,4056,4057],{"class":585},"    MAXIMIZE",[555,4059,639],{"class":565},[555,4061,4062],{"class":4024},"\"WINDOW_MAXIMIZE\"",[555,4064,655],{"class":565},[555,4066,4067],{"class":557,"line":851},[555,4068,573],{"emptyLinePlaceholder":572},[555,4070,4071],{"class":557,"line":870},[555,4072,1262],{"class":1225},[555,4074,4075],{"class":557,"line":889},[555,4076,4077],{"class":1225},"     * Icono asociado al tipo de botón, que se muestra en la barra de título personalizada. Este icono se genera utilizando la biblioteca IconFontSwing y el conjunto de iconos FontAwesome, lo que permite una apariencia visual atractiva y coherente con el estilo del RPG.\n",[555,4079,4080],{"class":557,"line":894},[555,4081,1272],{"class":1225},[555,4083,4084,4086,4088],{"class":557,"line":912},[555,4085,1277],{"class":561},[555,4087,1280],{"class":561},[555,4089,4090],{"class":565}," Icon symbol;\n",[555,4092,4093],{"class":557,"line":930},[555,4094,573],{"emptyLinePlaceholder":572},[555,4096,4097],{"class":557,"line":935},[555,4098,1262],{"class":1225},[555,4100,4101],{"class":557,"line":968},[555,4102,4103],{"class":1225},"     * Constructor para crear un tipo de botón con un icono asociado. El constructor recibe un símbolo como parámetro, que se utiliza para generar el icono correspondiente utilizando la biblioteca IconFontSwing y el conjunto de iconos FontAwesome. Este proceso permite que cada tipo de botón tenga un icono visualmente distintivo que se muestra en la barra de título personalizada.\n",[555,4105,4106],{"class":557,"line":1001},[555,4107,1346],{"class":1225},[555,4109,4110,4112,4114,4117],{"class":557,"line":1006},[555,4111,1351],{"class":1225},[555,4113,1354],{"class":561},[555,4115,4116],{"class":1357}," symbol",[555,4118,4119],{"class":1225}," El símbolo que se utiliza para generar el icono asociado al tipo de botón. Este parámetro es esencial para configurar correctamente el icono que se mostrará en la barra de título personalizada, proporcionando una experiencia de usuario más atractiva y coherente con el estilo del RPG.\n",[555,4121,4122],{"class":557,"line":1025},[555,4123,1272],{"class":1225},[555,4125,4126,4129,4131,4134],{"class":557,"line":1044},[555,4127,4128],{"class":606},"    RPGTitleBarButtonType",[555,4130,2761],{"class":565},[555,4132,4133],{"class":1357},"symbol",[555,4135,1399],{"class":565},[555,4137,4138],{"class":557,"line":1049},[555,4139,573],{"emptyLinePlaceholder":572},[555,4141,4142,4145,4148,4151,4154],{"class":557,"line":1067},[555,4143,4144],{"class":565},"        IconFontSwing.",[555,4146,4147],{"class":606},"register",[555,4149,4150],{"class":565},"(FontAwesome.",[555,4152,4153],{"class":606},"getIconFont",[555,4155,3332],{"class":565},[555,4157,4158,4161,4163,4166,4169],{"class":557,"line":1085},[555,4159,4160],{"class":565},"        IconCode iconCode ",[555,4162,630],{"class":561},[555,4164,4165],{"class":565}," FontAwesome.",[555,4167,4168],{"class":606},"valueOf",[555,4170,4171],{"class":565},"(symbol);\n",[555,4173,4174,4176,4179,4181,4184,4187,4190,4193],{"class":557,"line":1090},[555,4175,1404],{"class":585},[555,4177,4178],{"class":565},".symbol ",[555,4180,630],{"class":561},[555,4182,4183],{"class":565}," IconFontSwing.",[555,4185,4186],{"class":606},"buildIcon",[555,4188,4189],{"class":565},"(iconCode, ",[555,4191,4192],{"class":585},"20",[555,4194,4195],{"class":565},", Color.WHITE);\n",[555,4197,4198],{"class":557,"line":1123},[555,4199,1483],{"class":565},[555,4201,4202],{"class":557,"line":1155},[555,4203,573],{"emptyLinePlaceholder":572},[555,4205,4206],{"class":557,"line":1499},[555,4207,1262],{"class":1225},[555,4209,4210],{"class":557,"line":1504},[555,4211,4212],{"class":1225},"     * Función para obtener el icono asociado al tipo de botón. Esta función devuelve el icono que se muestra en la barra de título personalizada, lo que permite que cada tipo de botón tenga una apariencia visual distintiva y coherente con el estilo del RPG.\n",[555,4214,4215],{"class":557,"line":1516},[555,4216,1346],{"class":1225},[555,4218,4219,4221,4223],{"class":557,"line":1528},[555,4220,1351],{"class":1225},[555,4222,2135],{"class":561},[555,4224,4225],{"class":1225}," El icono asociado al tipo de botón, que se muestra en la barra de título personalizada. Este valor es esencial para configurar correctamente la apariencia visual del botón en la barra de título personalizada, proporcionando una experiencia de usuario más atractiva y coherente con el estilo del RPG.\n",[555,4227,4228],{"class":557,"line":1541},[555,4229,1272],{"class":1225},[555,4231,4232,4234,4237,4239],{"class":557,"line":1554},[555,4233,621],{"class":561},[555,4235,4236],{"class":565}," Icon ",[555,4238,3791],{"class":606},[555,4240,2243],{"class":565},[555,4242,4243],{"class":557,"line":1559},[555,4244,573],{"emptyLinePlaceholder":572},[555,4246,4247,4249],{"class":557,"line":1591},[555,4248,2173],{"class":561},[555,4250,4251],{"class":565}," symbol;\n",[555,4253,4254],{"class":557,"line":1602},[555,4255,1483],{"class":565},[555,4257,4258],{"class":557,"line":1613},[555,4259,1158],{"class":565},[423,4261,4262,4263,4266,4267,4269],{},"En este código, hemos creado el enum ",[434,4264,4265],{},"RPGTitleBarButtonType"," que define los tipos de botones que se pueden utilizar en la barra de título personalizada de la ventana principal de nuestro RPG. Cada tipo de botón tiene un icono asociado que se muestra en la barra de título, y se puede personalizar con diferentes colores y estilos. El constructor del enum recibe un símbolo como parámetro, que se utiliza para generar el icono correspondiente utilizando la biblioteca IconFontSwing y el conjunto de iconos FontAwesome. Además, hemos agregado una función ",[434,4268,3791],{}," que devuelve el icono asociado al tipo de botón, lo que permite configurar correctamente la apariencia visual del botón en la barra de título personalizada.",[530,4271,4272],{},"En este caso se ha utilizado la biblioteca IconFontSwing para generar los iconos de los botones de la barra de título personalizada, lo que permite una apariencia visual atractiva y coherente con el estilo del RPG. Sin embargo, también se podrían utilizar otras bibliotecas o recursos gráficos para personalizar los iconos de los botones según las necesidades del proyecto. Es importante tener en cuenta que la elección de la biblioteca o recurso gráfico para los iconos de los botones puede afectar la apariencia visual y la experiencia de usuario de la barra de título personalizada, por lo que se recomienda seleccionar cuidadosamente los recursos gráficos que se utilizarán en el proyecto.",[544,4274,4275],{},[510,4276,4279],{"className":548,"code":4277,"filename":4278,"language":551,"meta":518,"style":518},"package app.game.rpg.ui.components.listeners;\n\nimport javax.swing.*;\nimport java.awt.*;\nimport java.awt.event.MouseAdapter;\nimport java.awt.event.MouseEvent;\n\npublic class RPGWindowDragListener extends MouseAdapter {\n\n    \u002F**\n     * Punto inicial para el arrastre de la ventana, utilizado para permitir que el usuario mueva la ventana arrastrando la barra de título.\n     *\u002F\n    private Point initialClick;\n\n    \u002F**\n     * Referencia al JFrame padre para controlar las acciones de minimizar y cerrar la ventana.\n     *\u002F\n    private final JFrame parentFrame;\n\n    \u002F**\n     * Constructor para crear un listener que permite arrastrar la ventana al hacer clic y arrastrar en la barra de título personalizada.\u003Cbr\u002F>\n     * Este listener se utiliza para permitir que el usuario mueva la ventana arrastrando la barra de título personalizada, proporcionando una experiencia de usuario más fluida y personalizada.\u003Cbr\u002F>\n     * El constructor recibe un JFrame como parámetro, que es esencial para que el listener pueda controlar la posición de la ventana durante el arrastre. Sin esta referencia al JFrame, el listener no podría actualizar la posición de la ventana correctamente.\n     *\n     * @param frame El JFrame al que se le aplicará el listener para permitir el arrastre de la ventana. Este parámetro es esencial para que el listener pueda controlar la posición de la ventana durante el arrastre.\n     *\u002F\n    public RPGWindowDragListener(JFrame frame) {\n\n        parentFrame = frame;\n    }\n\n    \u002F**\n     * Función que se ejecuta cuando el usuario presiona el mouse en la barra de título personalizada. Esta función captura la posición inicial del clic, que se utilizará como referencia para calcular el desplazamiento de la ventana durante el arrastre.\n     *\n     * @param e El evento de mouse que contiene información sobre la posición del clic y otros detalles relacionados con la interacción del usuario.\n     *\u002F\n    @Override\n    public void mousePressed(MouseEvent e) {\n        initialClick = e.getPoint();\n    }\n\n    \u002F**\n     * Función que se ejecuta cuando el usuario arrastra el mouse después de presionar en la barra de título personalizada. Esta función calcula la nueva posición de la ventana basándose en el desplazamiento del mouse desde la posición inicial capturada en el método mousePressed.\n     *\n     * @param e El evento de mouse que contiene información sobre la posición actual del mouse y otros detalles relacionados con la interacción del usuario.\n     *\u002F\n    @Override\n    public void mouseDragged(MouseEvent e) {\n        Point current = e.getLocationOnScreen();\n        parentFrame.setLocation(current.x - initialClick.x, current.y - initialClick.y);\n    }\n}\n","app.game.rpg.ui.components.listeners.RPGWindowDragListener.java",[434,4280,4281,4288,4292,4302,4312,4319,4326,4330,4345,4349,4353,4357,4361,4367,4371,4375,4379,4383,4391,4395,4399,4404,4409,4414,4418,4429,4433,4445,4449,4457,4461,4465,4469,4474,4478,4490,4494,4500,4517,4532,4536,4540,4544,4549,4553,4564,4568,4574,4589,4603,4624,4628],{"__ignoreMap":518},[555,4282,4283,4285],{"class":557,"line":558},[555,4284,562],{"class":561},[555,4286,4287],{"class":565}," app.game.rpg.ui.components.listeners;\n",[555,4289,4290],{"class":557,"line":569},[555,4291,573],{"emptyLinePlaceholder":572},[555,4293,4294,4296,4298,4300],{"class":557,"line":576},[555,4295,579],{"class":561},[555,4297,2360],{"class":565},[555,4299,586],{"class":585},[555,4301,589],{"class":565},[555,4303,4304,4306,4308,4310],{"class":557,"line":592},[555,4305,579],{"class":561},[555,4307,582],{"class":565},[555,4309,586],{"class":585},[555,4311,589],{"class":565},[555,4313,4314,4316],{"class":557,"line":597},[555,4315,579],{"class":561},[555,4317,4318],{"class":565}," java.awt.event.MouseAdapter;\n",[555,4320,4321,4323],{"class":557,"line":613},[555,4322,579],{"class":561},[555,4324,4325],{"class":565}," java.awt.event.MouseEvent;\n",[555,4327,4328],{"class":557,"line":618},[555,4329,573],{"emptyLinePlaceholder":572},[555,4331,4332,4334,4336,4338,4340,4343],{"class":557,"line":658},[555,4333,600],{"class":561},[555,4335,603],{"class":561},[555,4337,3034],{"class":606},[555,4339,2410],{"class":561},[555,4341,4342],{"class":606}," MouseAdapter",[555,4344,610],{"class":565},[555,4346,4347],{"class":557,"line":690},[555,4348,573],{"emptyLinePlaceholder":572},[555,4350,4351],{"class":557,"line":695},[555,4352,1262],{"class":1225},[555,4354,4355],{"class":557,"line":716},[555,4356,2490],{"class":1225},[555,4358,4359],{"class":557,"line":735},[555,4360,1272],{"class":1225},[555,4362,4363,4365],{"class":557,"line":740},[555,4364,1277],{"class":561},[555,4366,2501],{"class":565},[555,4368,4369],{"class":557,"line":759},[555,4370,573],{"emptyLinePlaceholder":572},[555,4372,4373],{"class":557,"line":777},[555,4374,1262],{"class":1225},[555,4376,4377],{"class":557,"line":782},[555,4378,2468],{"class":1225},[555,4380,4381],{"class":557,"line":814},[555,4382,1272],{"class":1225},[555,4384,4385,4387,4389],{"class":557,"line":846},[555,4386,1277],{"class":561},[555,4388,1280],{"class":561},[555,4390,2481],{"class":565},[555,4392,4393],{"class":557,"line":851},[555,4394,573],{"emptyLinePlaceholder":572},[555,4396,4397],{"class":557,"line":870},[555,4398,1262],{"class":1225},[555,4400,4401],{"class":557,"line":889},[555,4402,4403],{"class":1225},"     * Constructor para crear un listener que permite arrastrar la ventana al hacer clic y arrastrar en la barra de título personalizada.\u003Cbr\u002F>\n",[555,4405,4406],{"class":557,"line":894},[555,4407,4408],{"class":1225},"     * Este listener se utiliza para permitir que el usuario mueva la ventana arrastrando la barra de título personalizada, proporcionando una experiencia de usuario más fluida y personalizada.\u003Cbr\u002F>\n",[555,4410,4411],{"class":557,"line":912},[555,4412,4413],{"class":1225},"     * El constructor recibe un JFrame como parámetro, que es esencial para que el listener pueda controlar la posición de la ventana durante el arrastre. Sin esta referencia al JFrame, el listener no podría actualizar la posición de la ventana correctamente.\n",[555,4415,4416],{"class":557,"line":930},[555,4417,1346],{"class":1225},[555,4419,4420,4422,4424,4426],{"class":557,"line":935},[555,4421,1351],{"class":1225},[555,4423,1354],{"class":561},[555,4425,2527],{"class":1357},[555,4427,4428],{"class":1225}," El JFrame al que se le aplicará el listener para permitir el arrastre de la ventana. Este parámetro es esencial para que el listener pueda controlar la posición de la ventana durante el arrastre.\n",[555,4430,4431],{"class":557,"line":968},[555,4432,1272],{"class":1225},[555,4434,4435,4437,4439,4441,4443],{"class":557,"line":1001},[555,4436,621],{"class":561},[555,4438,3034],{"class":606},[555,4440,2555],{"class":565},[555,4442,2558],{"class":1357},[555,4444,1399],{"class":565},[555,4446,4447],{"class":557,"line":1006},[555,4448,573],{"emptyLinePlaceholder":572},[555,4450,4451,4453,4455],{"class":557,"line":1025},[555,4452,2665],{"class":565},[555,4454,630],{"class":561},[555,4456,2670],{"class":565},[555,4458,4459],{"class":557,"line":1044},[555,4460,1483],{"class":565},[555,4462,4463],{"class":557,"line":1049},[555,4464,573],{"emptyLinePlaceholder":572},[555,4466,4467],{"class":557,"line":1067},[555,4468,1262],{"class":1225},[555,4470,4471],{"class":557,"line":1085},[555,4472,4473],{"class":1225},"     * Función que se ejecuta cuando el usuario presiona el mouse en la barra de título personalizada. Esta función captura la posición inicial del clic, que se utilizará como referencia para calcular el desplazamiento de la ventana durante el arrastre.\n",[555,4475,4476],{"class":557,"line":1090},[555,4477,1346],{"class":1225},[555,4479,4480,4482,4484,4487],{"class":557,"line":1123},[555,4481,1351],{"class":1225},[555,4483,1354],{"class":561},[555,4485,4486],{"class":1357}," e",[555,4488,4489],{"class":1225}," El evento de mouse que contiene información sobre la posición del clic y otros detalles relacionados con la interacción del usuario.\n",[555,4491,4492],{"class":557,"line":1155},[555,4493,1272],{"class":1225},[555,4495,4496,4498],{"class":557,"line":1499},[555,4497,1749],{"class":565},[555,4499,1752],{"class":561},[555,4501,4502,4504,4506,4509,4512,4515],{"class":557,"line":1504},[555,4503,621],{"class":561},[555,4505,1760],{"class":561},[555,4507,4508],{"class":606}," mousePressed",[555,4510,4511],{"class":565},"(MouseEvent ",[555,4513,4514],{"class":1357},"e",[555,4516,1399],{"class":565},[555,4518,4519,4522,4524,4527,4530],{"class":557,"line":1516},[555,4520,4521],{"class":565},"        initialClick ",[555,4523,630],{"class":561},[555,4525,4526],{"class":565}," e.",[555,4528,4529],{"class":606},"getPoint",[555,4531,713],{"class":565},[555,4533,4534],{"class":557,"line":1528},[555,4535,1483],{"class":565},[555,4537,4538],{"class":557,"line":1541},[555,4539,573],{"emptyLinePlaceholder":572},[555,4541,4542],{"class":557,"line":1554},[555,4543,1262],{"class":1225},[555,4545,4546],{"class":557,"line":1559},[555,4547,4548],{"class":1225},"     * Función que se ejecuta cuando el usuario arrastra el mouse después de presionar en la barra de título personalizada. Esta función calcula la nueva posición de la ventana basándose en el desplazamiento del mouse desde la posición inicial capturada en el método mousePressed.\n",[555,4550,4551],{"class":557,"line":1591},[555,4552,1346],{"class":1225},[555,4554,4555,4557,4559,4561],{"class":557,"line":1602},[555,4556,1351],{"class":1225},[555,4558,1354],{"class":561},[555,4560,4486],{"class":1357},[555,4562,4563],{"class":1225}," El evento de mouse que contiene información sobre la posición actual del mouse y otros detalles relacionados con la interacción del usuario.\n",[555,4565,4566],{"class":557,"line":1613},[555,4567,1272],{"class":1225},[555,4569,4570,4572],{"class":557,"line":1625},[555,4571,1749],{"class":565},[555,4573,1752],{"class":561},[555,4575,4576,4578,4580,4583,4585,4587],{"class":557,"line":1637},[555,4577,621],{"class":561},[555,4579,1760],{"class":561},[555,4581,4582],{"class":606}," mouseDragged",[555,4584,4511],{"class":565},[555,4586,4514],{"class":1357},[555,4588,1399],{"class":565},[555,4590,4591,4594,4596,4598,4601],{"class":557,"line":1642},[555,4592,4593],{"class":565},"        Point current ",[555,4595,630],{"class":561},[555,4597,4526],{"class":565},[555,4599,4600],{"class":606},"getLocationOnScreen",[555,4602,713],{"class":565},[555,4604,4605,4608,4611,4614,4616,4619,4621],{"class":557,"line":1647},[555,4606,4607],{"class":565},"        parentFrame.",[555,4609,4610],{"class":606},"setLocation",[555,4612,4613],{"class":565},"(current.x ",[555,4615,2032],{"class":561},[555,4617,4618],{"class":565}," initialClick.x, current.y ",[555,4620,2032],{"class":561},[555,4622,4623],{"class":565}," initialClick.y);\n",[555,4625,4626],{"class":557,"line":1652},[555,4627,1483],{"class":565},[555,4629,4630],{"class":557,"line":1658},[555,4631,1158],{"class":565},[423,4633,3063,4634,3067,4637,4640,4641,4643,4644,4647,4648,4651],{},[434,4635,4636],{},"RPGWindowDragListener",[434,4638,4639],{},"MouseAdapter"," para permitir que el usuario arrastre la ventana al hacer clic y arrastrar en la barra de título personalizada. El constructor de la clase recibe un ",[434,4642,474],{}," como parámetro, que es esencial para que el listener pueda controlar la posición de la ventana durante el arrastre. La función ",[434,4645,4646],{},"mousePressed"," captura la posición inicial del clic, mientras que la función ",[434,4649,4650],{},"mouseDragged"," calcula la nueva posición de la ventana basándose en el desplazamiento del mouse desde la posición inicial capturada. Este listener proporciona una experiencia de usuario más fluida y personalizada al permitir que el usuario mueva la ventana arrastrando la barra de título personalizada.",[530,4653,4654],{},"Es importante tener en cuenta que este listener solo permite arrastrar la ventana al hacer clic y arrastrar en la barra de título personalizada. Si se desea permitir el arrastre de la ventana desde otras áreas de la ventana, se podrían agregar listeners adicionales para capturar los eventos de mouse en esas áreas específicas. Además, es fundamental asegurarse de que el listener esté correctamente registrado en la barra de título personalizada para que funcione correctamente.",[418,4656,4658],{"id":4657},"conclusión","Conclusión",[423,4660,4661,4662,4664,4665,3067,4667,4669],{},"En esta sección, hemos implementado la barra de título personalizada para la ventana principal de nuestro RPG utilizando Java Swing. Hemos creado un enum ",[434,4663,4265],{}," para definir los tipos de botones que se pueden utilizar en la barra de título personalizada, cada uno con un icono asociado generado utilizando la biblioteca IconFontSwing y el conjunto de iconos FontAwesome. Además, hemos creado la clase ",[434,4666,4636],{},[434,4668,4639],{}," para permitir que el usuario arrastre la ventana al hacer clic y arrastrar en la barra de título personalizada. Estas implementaciones proporcionan una experiencia de usuario más fluida y personalizada al permitir que el usuario interactúe con la ventana de manera más intuitiva y visualmente atractiva. Es importante tener en cuenta que estas implementaciones son solo una parte de la personalización de la interfaz de usuario de nuestro RPG, y se pueden agregar más funcionalidades y personalizaciones según las necesidades del proyecto. En la próxima sección, continuaremos con la implementación de otros componentes de la interfaz de usuario para mejorar aún más la experiencia de usuario en nuestro RPG.",[4671,4672,4673],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}",{"title":518,"searchDepth":569,"depth":569,"links":4675},[4676,4677,4678,4679,4680,4681,4682,4685],{"id":420,"depth":569,"text":421},{"id":428,"depth":569,"text":429},{"id":460,"depth":569,"text":461},{"id":504,"depth":569,"text":505},{"id":535,"depth":569,"text":536},{"id":1168,"depth":569,"text":1169},{"id":2287,"depth":569,"text":2288,"children":4683},[4684],{"id":2298,"depth":576,"text":2299},{"id":4657,"depth":569,"text":4658},"En esta sección comenzaremos a diseñar la interfaz gráfica de nuestro RPG utilizando Swing, creando una ventana principal y los componentes básicos para la gestión de personajes.","md",null,{"editButton":42},{"title":289,"description":4686},"dxYLCYWOLssB39bUlVax7y28Km_Pe8Atep9O3EFmHFQ",[4693,4695],{"title":285,"path":286,"stem":287,"description":4694,"children":-1},"Cómo usar delegadores en Swing para manejar eventos y mejorar la interacción de tus interfaces.",{"title":293,"path":294,"stem":295,"description":4696,"children":-1},"En esta segunda parte, continuaremos desarrollando la interfaz de usuario para nuestro RPG, enfocándonos en la implementación de Paneles, Botones y otros elementos interactivos.",1779479575482]