{"id":87960,"date":"2026-05-21T22:38:32","date_gmt":"2026-05-22T03:38:32","guid":{"rendered":"https:\/\/niixer.com\/?p=87960"},"modified":"2026-05-21T22:44:37","modified_gmt":"2026-05-22T03:44:37","slug":"knights-quest","status":"publish","type":"post","link":"https:\/\/niixer.com\/index.php\/2026\/05\/21\/knights-quest\/","title":{"rendered":"Knight&#8217;s Quest: Desarrollo de un plataformas 3D en Godot"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<p><em>Knight&#8217;s Quest<\/em>&nbsp;es un videojuego de plataformas en 3D desarrollado en&nbsp;<strong>Godot Engine 4.x<\/strong>. El protagonista es un caballero que debe recolectar monedas esparcidas por un nivel flotante, inspir\u00e1ndose en mec\u00e1nicas cl\u00e1sicas de juegos como&nbsp;<em>Super Mario 3D<\/em>. Para los modelos tridimensionales se utilizan&nbsp;<strong>paquetes de assets de KayKit<\/strong>, incluyendo el personaje, las monedas, las plataformas y los elementos decorativos. Todo el trabajo de&nbsp;<strong>cinem\u00e1tica, sistemas de c\u00e1mara, iluminaci\u00f3n y l\u00f3gica de juego<\/strong>&nbsp;se implementa de forma manual, sin recurrir a plugins externos o sistemas automatizados.<\/p>\n\n\n\n<p>El presente documento detalla el proceso completo de desarrollo, organizado en fases secuenciales. Cada fase incluye los pasos t\u00e9cnicos ejecutados, las decisiones de dise\u00f1o adoptadas y las referencias a las figuras que ilustran el estado del proyecto en cada etapa.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Fase 1: Fundamentos y configuraci\u00f3n del entorno<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.1 Instalaci\u00f3n de Godot Engine y creaci\u00f3n del proyecto<\/h3>\n\n\n\n<p>El primer paso consiste en descargar&nbsp;<strong>Godot Engine 4.x<\/strong>&nbsp;desde el sitio web oficial. Se selecciona la versi\u00f3n estable para el sistema operativo de desarrollo (Windows 10\/11). Una vez descargado, se extrae el contenido en una carpeta local y se ejecuta el archivo ejecutable.<\/p>\n\n\n\n<p>Dentro del administrador de proyectos de Godot, se crea un nuevo proyecto con las siguientes caracter\u00edsticas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Nombre del proyecto<\/strong>:&nbsp;<em>Knight&#8217;s Quest<\/em><\/li>\n\n\n\n<li><strong>Ruta de almacenamiento<\/strong>:&nbsp;<code>C:\/GodotProjects\/KnightsQuest<\/code><\/li>\n\n\n\n<li><strong>Renderizador<\/strong>: Compatibility (para mayor compatibilidad) o Forward+ (para efectos visuales avanzados)<\/li>\n\n\n\n<li><strong>Template<\/strong>: 3D<\/li>\n<\/ul>\n\n\n\n<p>Tras la creaci\u00f3n, el proyecto se abre y se muestra la escena vac\u00eda predeterminada, que contiene una c\u00e1mara (<code>Camera3D<\/code>) y una luz (<code>DirectionalLight3D<\/code>).<\/p>\n\n\n\n<p><strong>Figura 1.<\/strong>&nbsp;<em>Ventana principal de Godot Engine con el proyecto &#8220;Knight&#8217;s Quest&#8221; reci\u00e9n creado.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"566\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura1-2-1024x566.jpeg\" alt=\"Ventana principal de Godot Engine con el proyecto &quot;Knight's Quest&quot; reci\u00e9n creado.\" class=\"wp-image-87993\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura1-2-1024x566.jpeg 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura1-2-300x166.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura1-2-768x424.jpeg 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura1-2-1536x849.jpeg 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura1-2.jpeg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">1.2 Configuraci\u00f3n del suelo con CSGBox3D<\/h3>\n\n\n\n<p>Para que el caballero tenga una superficie sobre la cual desplazarse, se construye un suelo utilizando un nodo&nbsp;<strong>CSGBox3D<\/strong>. Este nodo pertenece a la familia CSG (Constructive Solid Geometry), que permite modelar geometr\u00eda b\u00e1sica directamente dentro del editor.<\/p>\n\n\n\n<p><strong>Procedimiento:<\/strong><\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>En el \u00e1rbol de escenas, se hace clic en el icono de &#8220;m\u00e1s&#8221; (A\u00f1adir nodo).<\/li>\n\n\n\n<li>Se busca y selecciona&nbsp;<code>CSGBox3D<\/code>.<\/li>\n\n\n\n<li>Se renombra el nodo como&nbsp;<code>Suelo<\/code>.<\/li>\n\n\n\n<li>En el inspector, se ajusta la propiedad&nbsp;<code>Size<\/code>&nbsp;a&nbsp;<code>(20, 1, 20)<\/code>&nbsp;para crear una plataforma ancha y plana.<\/li>\n\n\n\n<li>Se activa la opci\u00f3n&nbsp;<code>Use Collision<\/code>&nbsp;para que el suelo genere autom\u00e1ticamente una forma de colisi\u00f3n.<\/li>\n<\/ol>\n\n\n\n<p><strong>Figura 2.<\/strong>&nbsp;<em>Nodo CSGBox3D configurado como suelo, con dimensiones 20x1x20.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"285\" height=\"281\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura2.jpeg\" alt=\"Nodo CSGBox3D configurado como suelo, con dimensiones 20x1x20.\" class=\"wp-image-87991\"\/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">1.3 Navegaci\u00f3n en la vista 3D<\/h3>\n\n\n\n<p>Para facilitar la colocaci\u00f3n de objetos, se domina el sistema de navegaci\u00f3n de la vista 3D de Godot:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Rotar la vista<\/strong>: Manteniendo presionado el bot\u00f3n derecho del mouse y arrastrando.<\/li>\n\n\n\n<li><strong>Pan (desplazamiento lateral)<\/strong>: Manteniendo presionado el bot\u00f3n central del mouse y arrastrando.<\/li>\n\n\n\n<li><strong>Zoom<\/strong>: Usando la rueda del mouse.<\/li>\n\n\n\n<li><strong>Movimiento con teclado<\/strong>: Manteniendo presionado el bot\u00f3n derecho del mouse y usando las teclas&nbsp;<strong>WASD<\/strong>&nbsp;para desplazarse por la escena.<\/li>\n<\/ul>\n\n\n\n<p>Esta navegaci\u00f3n permite inspeccionar el suelo desde cualquier \u00e1ngulo y preparar el escenario para recibir al personaje.<\/p>\n\n\n\n<p><strong>Figura 3.<\/strong>&nbsp;<em>Vista 3D del editor mostrando el suelo desde una perspectiva angular.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"565\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura3-1024x565.jpeg\" alt=\"Vista 3D del editor mostrando el suelo desde una perspectiva angular de Knight's Quest\" class=\"wp-image-87990\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura3-1024x565.jpeg 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura3-300x166.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura3-768x424.jpeg 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura3-1536x848.jpeg 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura3.jpeg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">1.4 Adici\u00f3n del WorldEnvironment<\/h3>\n\n\n\n<p>La escena 3D por defecto carece de iluminaci\u00f3n ambiental y cielo, lo que resulta en una apariencia plana y oscura. Para corregir esto, se a\u00f1ade un nodo&nbsp;<strong>WorldEnvironment<\/strong>.<\/p>\n\n\n\n<p><strong>Procedimiento:<\/strong><\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Se a\u00f1ade un nodo&nbsp;<code>WorldEnvironment<\/code>&nbsp;al \u00e1rbol de escenas.<\/li>\n\n\n\n<li>En el inspector, se crea un nuevo recurso&nbsp;<code>Environment<\/code>&nbsp;haciendo clic en &#8220;Nuevo Environment&#8221;.<\/li>\n\n\n\n<li>Se configura la propiedad&nbsp;<code>Background<\/code>:\n<ul class=\"wp-block-list\">\n<li>Se selecciona&nbsp;<code>Sky<\/code>&nbsp;como modo de fondo.<\/li>\n\n\n\n<li>Se crea un nuevo recurso&nbsp;<code>Sky<\/code>.<\/li>\n\n\n\n<li>Se asigna un&nbsp;<code>PanoramaSkyMaterial<\/code>&nbsp;o&nbsp;<code>ProceduralSkyMaterial<\/code>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Se ajusta la propiedad&nbsp;<code>Ambient Light<\/code>:\n<ul class=\"wp-block-list\">\n<li><code>Color<\/code>: Blanco suave&nbsp;<code>(0.8, 0.8, 0.8)<\/code>.<\/li>\n\n\n\n<li><code>Energy<\/code>:&nbsp;<code>0.7<\/code>&nbsp;para una iluminaci\u00f3n global tenue pero suficiente.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>Este entorno mejora dr\u00e1sticamente la visibilidad de los objetos y prepara la escena para recibir luces m\u00e1s detalladas.<\/p>\n\n\n\n<p><strong>Figura 4.<\/strong>&nbsp;<em>Inspector del nodo WorldEnvironment mostrando la configuraci\u00f3n de Sky y Ambient Light.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"489\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura4-1024x489.jpeg\" alt=\"Inspector del nodo WorldEnvironment mostrando la configuraci\u00f3n de Sky y Ambient Light en Knight's Quest\" class=\"wp-image-87998\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura4-1024x489.jpeg 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura4-300x143.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura4-768x367.jpeg 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura4-1536x733.jpeg 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura4.jpeg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Para la implementacion final, se hizo uso de la imagen <strong>enviroment<\/strong>, la cual es una imagen pensada para cambiar todo el entorno del juego, usa una separacion de lo se vera en 3d en el suelo y en el cielo.<\/p>\n\n\n\n<p><strong>Figura 5.<\/strong>&nbsp;Imagen enviroment usada en el juego<em>.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"512\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/environment-1024x512.png\" alt=\"Fondo del nivel de Knight's Quest\" class=\"wp-image-88040\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/environment-1024x512.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/environment-300x150.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/environment-768x384.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/environment-1536x768.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/environment.png 1774w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Fondo del nivel de Knight&#8217;s Quest<\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Fase 2: Programaci\u00f3n b\u00e1sica y movimiento de objetos para <em>Knight&#8217;s Quest<\/em><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">2.1 Creaci\u00f3n de un script simple y funci\u00f3n _ready()<\/h3>\n\n\n\n<p>Para verificar que el sistema de scripting funciona correctamente, se a\u00f1ade un script a un nodo temporal. Se utiliza la funci\u00f3n&nbsp;<code>_ready()<\/code>, que se ejecuta autom\u00e1ticamente una sola vez cuando el nodo y todos sus hijos han sido completamente cargados en el \u00e1rbol de escenas.<\/p>\n\n\n\n<p><strong>C\u00f3digo de prueba:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">extends Node3D\n\nfunc _ready():\n    print(\"Sistema de script funcionando correctamente\")<\/pre>\n\n\n\n<p>Al ejecutar la escena (F6), el mensaje aparece en la consola de salida, confirmando que el entorno de programaci\u00f3n est\u00e1 listo.<\/p>\n\n\n\n<p><strong>Figura 6.<\/strong>&nbsp;<em>Consola de salida de Godot mostrando el mensaje de verificaci\u00f3n.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"564\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura5-1024x564.jpeg\" alt=\"Consola de salida de Godot mostrando el mensaje de verificaci\u00f3n.\" class=\"wp-image-87999\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura5-1024x564.jpeg 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura5-300x165.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura5-768x423.jpeg 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura5-1536x847.jpeg 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura5.jpeg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">2.2 Manipulaci\u00f3n manual de la posici\u00f3n (transformaciones)<\/h3>\n\n\n\n<p>El movimiento de objetos en Godot se realiza modificando la propiedad&nbsp;<code>position<\/code>&nbsp;de cualquier nodo heredado de&nbsp;<code>Node3D<\/code>. Esta propiedad es un&nbsp;<code>Vector3<\/code>&nbsp;con componentes&nbsp;<code>(x, y, z)<\/code>.<\/p>\n\n\n\n<p>Para demostrarlo, se selecciona el CSGBox3D del suelo y se escribe un peque\u00f1o script que lo desplaza en el eje X:<\/p>\n\n\n\n<p><strong>C\u00f3digo de ejemplo:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">extends CSGBox3D\n\nvar velocidad = 2.0\n\nfunc _process(delta):\n    position.x += velocidad * delta<\/pre>\n\n\n\n<p>El uso de&nbsp;<code>delta<\/code>&nbsp;(el tiempo transcurrido entre frames) asegura que el movimiento sea fluido e independiente de la tasa de frames. El operador&nbsp;<code>+=<\/code>&nbsp;incrementa el valor actual de&nbsp;<code>position.x<\/code>.<\/p>\n\n\n\n<p><strong>Figura 7.<\/strong>&nbsp;<em>Script aplicado al suelo mostrando la l\u00f3gica de movimiento con operador +=.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"268\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura6-1024x268.jpeg\" alt=\"Script aplicado al suelo mostrando la l\u00f3gica de movimiento con operador +=.\" class=\"wp-image-88000\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura6-1024x268.jpeg 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura6-300x79.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura6-768x201.jpeg 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura6.jpeg 1190w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.3 Implementaci\u00f3n de f\u00edsica con RigidBody3D<\/h3>\n\n\n\n<p>Para introducir f\u00edsicas realistas, se crea un objeto independiente usando&nbsp;<strong>RigidBody3D<\/strong>. A diferencia de otros cuerpos, este reacciona autom\u00e1ticamente a la gravedad, colisiones y fuerzas.<\/p>\n\n\n\n<p><strong>Procedimiento:<\/strong><\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Se a\u00f1ade un nodo&nbsp;<code>RigidBody3D<\/code>&nbsp;renombrado como&nbsp;<code>CajaPrueba<\/code>.<\/li>\n\n\n\n<li>Se a\u00f1ade un nodo hijo&nbsp;<code>CollisionShape3D<\/code>&nbsp;con una forma&nbsp;<code>BoxShape3D<\/code>&nbsp;del tama\u00f1o adecuado.<\/li>\n\n\n\n<li>Se a\u00f1ade un nodo hijo&nbsp;<code>MeshInstance3D<\/code>&nbsp;con un&nbsp;<code>BoxMesh<\/code>&nbsp;para representaci\u00f3n visual.<\/li>\n\n\n\n<li>En el inspector del&nbsp;<code>RigidBody3D<\/code>, se ajustan:\n<ul class=\"wp-block-list\">\n<li><code>Mass<\/code>:&nbsp;<code>1.0<\/code><\/li>\n\n\n\n<li><code>Friction<\/code>:&nbsp;<code>0.5<\/code><\/li>\n\n\n\n<li><code>Bounce<\/code>:&nbsp;<code>0.3<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>Al ejecutar la escena, la caja cae por gravedad, rebota ligeramente y se detiene sobre el suelo. Este comportamiento demuestra el motor de f\u00edsicas integrado.<\/p>\n\n\n\n<p><strong>Figura 8.<\/strong>&nbsp;<em>Jerarqu\u00eda de nodos del RigidBody3D con CollisionShape3D y MeshInstance3D.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"427\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura7-1024x427.jpeg\" alt=\"Jerarqu\u00eda de nodos del RigidBody3D con CollisionShape3D y MeshInstance3D en Knight's Quest\" class=\"wp-image-88002\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura7-1024x427.jpeg 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura7-300x125.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura7-768x320.jpeg 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura7-1536x640.jpeg 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura7.jpeg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fase 3: Construcci\u00f3n del personaje jugable (caballero)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">3.1 Estructura del CharacterBody3D formando <em>Knight&#8217;s Quest<\/em><\/h3>\n\n\n\n<p>El caballero se implementa mediante un nodo&nbsp;<strong>CharacterBody3D<\/strong>, que proporciona un control preciso sobre el movimiento sin estar completamente gobernado por la f\u00edsica como un&nbsp;<code>RigidBody3D<\/code>.<\/p>\n\n\n\n<p><strong>Jerarqu\u00eda de nodos:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Caballero<\/code>&nbsp;(CharacterBody3D)\n<ul class=\"wp-block-list\">\n<li><code>CollisionShape3D<\/code>&nbsp;(forma de&nbsp;<strong>CapsuleShape3D<\/strong>)<\/li>\n\n\n\n<li><code>MeshInstance3D<\/code>&nbsp;(modelo 3D importado desde KayKit)<\/li>\n\n\n\n<li><code>SpringArm3D<\/code>&nbsp;(para la c\u00e1mara en tercera persona)\n<ul class=\"wp-block-list\">\n<li><code>Camera3D<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>La&nbsp;<code>CapsuleShape3D<\/code>&nbsp;se elige sobre&nbsp;<code>BoxShape3D<\/code>&nbsp;porque se aproxima mejor a la silueta de un personaje humanoide, facilitando el paso por espacios angostos.<\/p>\n\n\n\n<p><strong>Figura 9.<\/strong>&nbsp;<em>\u00c1rbol de nodos del personaje Caballero mostrando la estructura completa.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"535\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura8-1024x535.jpeg\" alt=\"\u00c1rbol de nodos del personaje Caballero mostrando la estructura completa.\" class=\"wp-image-88013\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura8-1024x535.jpeg 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura8-300x157.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura8-768x401.jpeg 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura8-1536x803.jpeg 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura8-390x205.jpeg 390w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura8.jpeg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.2 Importaci\u00f3n de assets desde KayKit<\/h3>\n\n\n\n<p>Para el modelo visual del caballero, las monedas y los elementos decorativos se utilizan los&nbsp;<strong>paquetes de assets gratuitos de KayKit<\/strong>, disponibles en el sitio oficial de KayKit (kaykit.games). Se descargan los paquetes &#8220;Character Pack&#8221;, &#8220;Platformer Pack&#8221; y &#8220;Coins Pack&#8221; en formato&nbsp;<code>.glb<\/code>&nbsp;(glTF).<\/p>\n\n\n\n<p><strong>Procedimiento de importaci\u00f3n:<\/strong><\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>En el panel&nbsp;<code>FileSystem<\/code>&nbsp;de Godot, se crea la carpeta&nbsp;<code>assets\/models\/<\/code>.<\/li>\n\n\n\n<li>Se arrastran los archivos&nbsp;<code>.glb<\/code>&nbsp;desde el explorador del sistema a la carpeta.<\/li>\n\n\n\n<li>Godot procesa autom\u00e1ticamente los archivos, generando los recursos internos.<\/li>\n\n\n\n<li>Se selecciona el modelo del caballero y, en el inspector, se habilita&nbsp;<code>Import As Skeleton<\/code>&nbsp;para mantener las animaciones (si las hubiera).<\/li>\n<\/ol>\n\n\n\n<p>El modelo del caballero se asigna a la&nbsp;<code>MeshInstance3D<\/code>&nbsp;hija del&nbsp;<code>CharacterBody3D<\/code>.<\/p>\n\n\n\n<p><strong>Figura 10.<\/strong>&nbsp;<em>Panel FileSystem mostrando los assets de KayKit importados.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"525\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura9-1024x525.jpeg\" alt=\"Panel FileSystem mostrando los assets de KayKit importados para Knight's Quest\" class=\"wp-image-88014\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura9-1024x525.jpeg 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura9-300x154.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura9-768x394.jpeg 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura9-1536x787.jpeg 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura9.jpeg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.3 Configuraci\u00f3n del movimiento manual (cinem\u00e1tica)<\/h3>\n\n\n\n<p>El movimiento del caballero se implementa manualmente mediante c\u00f3digo GDScript, sin usar plugins de cinem\u00e1tica predefinidos. El script se adjunta al nodo&nbsp;<code>Caballero<\/code>.<\/p>\n\n\n\n<p><strong>Script completo de movimiento:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">class_name Player<br>extends CharacterBody3D<br><br>const SPEED = 6.0<br>const JUMP_VELOCITY = 7<br>@export var sens_horizontal: float = 0.003<br>@export var sens_vertical: float = 0.003<br><br># Animaciones<br>@onready var animation_player: AnimationPlayer = $Knight\/AnimationPlayer<br>@onready var knight: Node3D = $Knight<br><br># C\u00e1mara<br>@onready var camera_pivot: Node3D = $pivot<br>@onready var camera: Camera3D = $pivot\/Camera3D<br><br>var max_up := deg_to_rad(60)<br>var min_down := deg_to_rad(-60)<br>var pitch := 0.0<br>var camera_yaw: float = 0.0<br><br># Estado de animaci\u00f3n<br>var current_animation: String = \"\"<br>var is_jumping: bool = false<br><br>func _ready() -&gt; void:<br>\tInput.mouse_mode = Input.MOUSE_MODE_CAPTURED<br>\t<br>\tif not camera:<br>\t\tcamera = $pivot2\/Camera3D<br>\t\tcamera_pivot = $pivot2<br>\t<br>\tif camera:<br>\t\tcamera.current = true<br>\t\tif camera == $pivot\/Camera3D and $pivot2\/Camera3D:<br>\t\t\t$pivot2\/Camera3D.current = false<br>\t\telif camera == $pivot2\/Camera3D and $pivot\/Camera3D:<br>\t\t\t$pivot\/Camera3D.current = false<br>\t<br>\tif not animation_player:<br>\t\tprint(\"Error: No se encontr\u00f3 AnimationPlayer en Knight\")<br>\telse:<br>\t\tplay_animation(\"Player\/Idle_A\")<br><br>func _input(event):<br>\tif event is InputEventMouseMotion and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:<br>\t\tcamera_yaw -= event.relative.x * sens_horizontal<br>\t\tpitch -= event.relative.y * sens_vertical<br>\t\tpitch = clamp(pitch, min_down, max_up)<br>\t\t<br>\t\tcamera_pivot.rotation = Vector3(pitch, camera_yaw, 0.0)<br><br>func _physics_process(delta: float) -&gt; void:<br>\t# Gravedad<br>\tif not is_on_floor():<br>\t\tvelocity += get_gravity() * delta<br>\t\t<br>\t\tif velocity.y &gt; 0 and not is_jumping:<br>\t\t\tplay_animation(\"Player\/Jump_Start\")<br>\t\t\tis_jumping = true<br>\t\telif velocity.y &lt;= 0 and is_jumping:<br>\t\t\tplay_animation(\"Player\/Jump_Full_Long\")<br>\telse:<br>\t\tif is_jumping:<br>\t\t\tplay_animation(\"Player\/Jump_Land\")<br>\t\t\tis_jumping = false<br>\t\t\tawait get_tree().create_timer(0.2).timeout<br>\t\t\tif is_on_floor():<br>\t\t\t\tupdate_movement_animation()<br><br>\t# Salto<br>\tif Input.is_action_just_pressed(\"ui_accept\") and is_on_floor():<br>\t\tvelocity.y = JUMP_VELOCITY<br>\t\tplay_animation(\"Player\/Jump_Start\")<br>\t\tis_jumping = true<br><br>\t# Movimiento relativo a la c\u00e1mara<br>\tvar input_dir := Input.get_vector(\"izquierda\", \"derecha\", \"adelante\", \"atras\")<br>\t<br>\tvar cam_basis = Basis(Vector3.UP, camera_yaw)<br>\tvar direction := (cam_basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()<br>\t<br>\tif direction != Vector3.ZERO:<br>\t\tvelocity.x = direction.x * SPEED<br>\t\tvelocity.z = direction.z * SPEED<br>\t\t<br>\t\tvar target_angle = atan2(direction.x, direction.z)<br>\t\tknight.global_rotation.y = lerp_angle(knight.global_rotation.y, target_angle, 0.2)<br>\telse:<br>\t\tvelocity.x = move_toward(velocity.x, 0, SPEED)<br>\t\tvelocity.z = move_toward(velocity.z, 0, SPEED)<br>\t<br>\t# Actualizar animaci\u00f3n<br>\tif is_on_floor() and not is_jumping:<br>\t\tupdate_movement_animation()<br>\t<br>\tmove_and_slide()<br><br>func update_movement_animation():<br>\tvar is_moving = abs(velocity.x) &gt; 0.1 or abs(velocity.z) &gt; 0.1<br>\t<br>\tif is_moving:<br>\t\tif Input.is_action_pressed(\"sprint\"):<br>\t\t\tplay_animation(\"Player\/Running_B\")<br>\t\telse:<br>\t\t\tplay_animation(\"Player\/Walking_B\")<br>\telse:<br>\t\tplay_animation(\"Player\/Idle_A\")<br><br>func play_animation(anim_name: String):<br>\tif not animation_player:<br>\t\treturn<br>\t<br>\tif animation_player.has_animation(anim_name):<br>\t\tif current_animation == anim_name:<br>\t\t\treturn<br>\t\tcurrent_animation = anim_name<br>\t\tanimation_player.play(anim_name)<br>\telse:<br>\t\tvar simple_name = anim_name.replace(\"Player\/\", \"\")<br>\t\tif animation_player.has_animation(simple_name):<br>\t\t\tif current_animation == simple_name:<br>\t\t\t\treturn<br>\t\t\tcurrent_animation = simple_name<br>\t\t\tanimation_player.play(simple_name)<\/pre>\n\n\n\n<p>Se crean acciones de entrada personalizadas (<code>move_left<\/code>,&nbsp;<code>move_right<\/code>,&nbsp;<code>move_forward<\/code>,&nbsp;<code>move_back<\/code>,&nbsp;<code>jump<\/code>) en el&nbsp;<code>Input Map<\/code>&nbsp;(Editor de Proyecto &gt; Controles), asignando teclas WASD y Espacio.<\/p>\n\n\n\n<p><strong>Figura 11.<\/strong>&nbsp;<em>Editor de Input Map mostrando las acciones personalizadas para el caballero.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"460\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura10-1024x460.jpeg\" alt=\"Editor de Input Map mostrando las acciones personalizadas para el caballero.\" class=\"wp-image-88015\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura10-1024x460.jpeg 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura10-300x135.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura10-768x345.jpeg 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura10-1536x690.jpeg 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura10.jpeg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Fase 4: Dise\u00f1o del nivel con CSG y StaticBody3D en <em>Knight&#8217;s Quest<\/em><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">4.1 Creaci\u00f3n de plataformas flotantes<\/h3>\n\n\n\n<p>El nivel de&nbsp;<em>Knight&#8217;s Quest<\/em>&nbsp;se compone de varias plataformas flotantes a distintas alturas. Para construirlas se utilizan nodos&nbsp;<strong>CSGBox3D<\/strong>&nbsp;y&nbsp;<strong>StaticBody3D<\/strong>.<\/p>\n\n\n\n<p><strong>Procedimiento:<\/strong><\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Se a\u00f1ade un nodo&nbsp;<code>StaticBody3D<\/code>&nbsp;como ra\u00edz de cada plataforma.<\/li>\n\n\n\n<li>Se a\u00f1ade un hijo&nbsp;<code>CollisionShape3D<\/code>&nbsp;con forma&nbsp;<code>BoxShape3D<\/code>.<\/li>\n\n\n\n<li>Se a\u00f1ade un hijo&nbsp;<code>CSGBox3D<\/code>&nbsp;(o&nbsp;<code>MeshInstance3D<\/code>&nbsp;con modelo de KayKit) para la representaci\u00f3n visual.<\/li>\n\n\n\n<li>Se ajusta la posici\u00f3n y escala de cada plataforma manualmente usando las herramientas de transformaci\u00f3n del editor.<\/li>\n<\/ol>\n\n\n\n<p>Se crean cinco plataformas con las siguientes coordenadas (en unidades Godot):<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Plataforma<\/th><th class=\"has-text-align-left\" data-align=\"left\">Posici\u00f3n (x, y, z)<\/th><th class=\"has-text-align-left\" data-align=\"left\">Escala (x, y, z)<\/th><\/tr><\/thead><tbody><tr><td>Plataforma 1<\/td><td>(0, 0, 0)<\/td><td>(10, 1, 10)<\/td><\/tr><tr><td>Plataforma 2<\/td><td>(6, 3, 4)<\/td><td>(4, 1, 4)<\/td><\/tr><tr><td>Plataforma 3<\/td><td>(-5, 2, -3)<\/td><td>(5, 1, 5)<\/td><\/tr><tr><td>Plataforma 4<\/td><td>(3, 5, -2)<\/td><td>(3, 1, 3)<\/td><\/tr><tr><td>Plataforma 5<\/td><td>(-4, 4, 5)<\/td><td>(4, 1, 4)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>Figura 12.<\/strong>&nbsp;<em>Vista superior del nivel mostrando la disposici\u00f3n de las cinco plataformas flotantes.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"437\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura11-1024x437.jpeg\" alt=\"Vista superior del nivel mostrando la disposici\u00f3n de las cinco plataformas flotantes de Knight's Quest\" class=\"wp-image-88016\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura11-1024x437.jpeg 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura11-300x128.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura11-768x328.jpeg 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura11-1536x656.jpeg 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura11.jpeg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.2 Aplicaci\u00f3n de texturas y materiales para integrar <em>Knight&#8217;s Quest<\/em><\/h3>\n\n\n\n<p>Para mejorar la est\u00e9tica, se aplican materiales a cada plataforma usando&nbsp;<code>StandardMaterial3D<\/code>. Se crean recursos de material separados para madera, piedra y hierba, utilizando texturas provenientes de los assets de KayKit.<\/p>\n\n\n\n<p><strong>Procedimiento:<\/strong><\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>En el panel&nbsp;<code>FileSystem<\/code>, se crea una carpeta&nbsp;<code>assets\/materials\/<\/code>.<\/li>\n\n\n\n<li>Se hace clic derecho &gt; Nuevo Recurso &gt;&nbsp;<code>StandardMaterial3D<\/code>.<\/li>\n\n\n\n<li>En el inspector, se ajustan las propiedades:\n<ul class=\"wp-block-list\">\n<li><code>Albedo<\/code>&nbsp;&gt;&nbsp;<code>Texture<\/code>: se carga una imagen de textura desde KayKit.<\/li>\n\n\n\n<li><code>Metallic<\/code>:&nbsp;<code>0.1<\/code>&nbsp;para materiales opacos.<\/li>\n\n\n\n<li><code>Roughness<\/code>:&nbsp;<code>0.8<\/code>&nbsp;para superficies rugosas.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Se arrastra el material creado a la propiedad&nbsp;<code>Material<\/code>&nbsp;del nodo&nbsp;<code>MeshInstance3D<\/code>&nbsp;o&nbsp;<code>CSGBox3D<\/code>.<\/li>\n<\/ol>\n\n\n\n<p><strong>Figura 13.<\/strong>&nbsp;<em>Inspector del StandardMaterial3D mostrando la configuraci\u00f3n de textura y rugosidad.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"552\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura12-1024x552.jpeg\" alt=\"Inspector del StandardMaterial3D mostrando la configuraci\u00f3n de textura y rugosidad.\" class=\"wp-image-88017\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura12-1024x552.jpeg 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura12-300x162.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura12-768x414.jpeg 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura12-1536x828.jpeg 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura12.jpeg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Fase 5: Iluminaci\u00f3n manual y sistema de c\u00e1maras para mejor visualizaci\u00f3n en <em>Knight&#8217;s Quest<\/em><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">5.1 Configuraci\u00f3n de luces<\/h3>\n\n\n\n<p>La iluminaci\u00f3n de&nbsp;<em>Knight&#8217;s Quest<\/em>&nbsp;se realiza enteramente de forma manual, sin usar iluminaci\u00f3n precalculada (baked lighting) para mantener la flexibilidad.<\/p>\n\n\n\n<p><strong>Tipos de luces implementadas:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>DirectionalLight3D<\/strong>: Luz principal que simula el sol. Se rota para crear sombras diagonales. Propiedades:\n<ul class=\"wp-block-list\">\n<li><code>Light Energy<\/code>:&nbsp;<code>1.2<\/code><\/li>\n\n\n\n<li><code>Color<\/code>: Amarillo suave&nbsp;<code>(1.0, 0.95, 0.85)<\/code><\/li>\n\n\n\n<li><code>Shadow<\/code>&nbsp;&gt;&nbsp;<code>Enabled<\/code>:&nbsp;<code>true<\/code>,&nbsp;<code>Bias<\/code>:&nbsp;<code>0.1<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>OmniLight3D<\/strong>: Luces puntuales colocadas cerca de las monedas para dar sensaci\u00f3n de brillo. Propiedades:\n<ul class=\"wp-block-list\">\n<li><code>Light Energy<\/code>:&nbsp;<code>0.8<\/code><\/li>\n\n\n\n<li><code>Color<\/code>: Dorado&nbsp;<code>(1.0, 0.8, 0.2)<\/code><\/li>\n\n\n\n<li><code>Attenuation<\/code>&nbsp;&gt;&nbsp;<code>Radius<\/code>:&nbsp;<code>3.0<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>Todas las luces se posicionan manualmente usando las herramientas de transformaci\u00f3n del editor.<\/p>\n\n\n\n<p><strong>Figura 14.<\/strong>&nbsp;<em>Vista de la escena mostrando la posici\u00f3n de la DirectionalLight3D y las OmniLight3D cerca de las monedas.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"534\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura13-1024x534.jpeg\" alt=\"Vista de la escena mostrando la posici\u00f3n de la DirectionalLight3D y las OmniLight3D cerca de las monedas de Knight's Quest\" class=\"wp-image-88018\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura13-1024x534.jpeg 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura13-300x156.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura13-768x400.jpeg 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura13-1536x801.jpeg 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura13.jpeg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5.2 Sistema de c\u00e1mara en tercera persona (SpringArm3D)<\/h3>\n\n\n\n<p>La c\u00e1mara sigue al caballero desde una perspectiva en tercera persona. Para ello se utiliza un nodo&nbsp;<strong><code>camera_pivot<\/code>&nbsp;<\/strong>, que amortigua el movimiento y evita que la c\u00e1mara atraviese paredes.<\/p>\n\n\n\n<p><strong>Jerarqu\u00eda de la c\u00e1mara:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Caballero (CharacterBody3D)<br>\u2514\u2500\u2500 camera_pivot <br>    \u2514\u2500\u2500 Camera3D<\/pre>\n\n\n\n<p><strong>Configuraci\u00f3n del SpringArm3D:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Length<\/code>:&nbsp;<code>4.0<\/code>&nbsp;(distancia de la c\u00e1mara al personaje)<\/li>\n\n\n\n<li><code>Margin<\/code>:&nbsp;<code>0.01<\/code>&nbsp;(para evitar clipping)<\/li>\n\n\n\n<li><code>Collision Mask<\/code>: activar capa 1 para detectar paredes<\/li>\n<\/ul>\n\n\n\n<p><strong>Configuraci\u00f3n de la Camera3D:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Current<\/code>:&nbsp;<code>true<\/code>&nbsp;(c\u00e1mara activa)<\/li>\n\n\n\n<li><code>FOV<\/code>:&nbsp;<code>75.0<\/code>&nbsp;grados<\/li>\n\n\n\n<li><code>Near<\/code>:&nbsp;<code>0.1<\/code>,&nbsp;<code>Far<\/code>:&nbsp;<code>100.0<\/code><\/li>\n<\/ul>\n\n\n\n<p>Adicionalmente, se implementa un script manual que permite rotar la c\u00e1mara alrededor del caballero con el mouse:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">class_name Player<br>extends CharacterBody3D<br><br>@export var sens_horizontal: float = 0.003<br>@export var sens_vertical: float = 0.003<br><br># C\u00e1mara<br>@onready var camera_pivot: Node3D = $pivot<br>@onready var camera: Camera3D = $pivot\/Camera3D<br><br>var max_up := deg_to_rad(60)<br>var min_down := deg_to_rad(-60)<br>var pitch := 0.0<br>var camera_yaw: float = 0.0<br><br>func _ready() -&gt; void:<br>\tInput.mouse_mode = Input.MOUSE_MODE_CAPTURED<br>\t<br>\tif not camera:<br>\t\tcamera = $pivot2\/Camera3D<br>\t\tcamera_pivot = $pivot2<br>\t<br>\tif camera:<br>\t\tcamera.current = true<br>\t\tif camera == $pivot\/Camera3D and $pivot2\/Camera3D:<br>\t\t\t$pivot2\/Camera3D.current = false<br>\t\telif camera == $pivot2\/Camera3D and $pivot\/Camera3D:<br>\t\t\t$pivot\/Camera3D.current = false<br><br>func _input(event):<br>\tif event is InputEventMouseMotion and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:<br>\t\tcamera_yaw -= event.relative.x * sens_horizontal<br>\t\tpitch -= event.relative.y * sens_vertical<br>\t\tpitch = clamp(pitch, min_down, max_up)<br>\t\t<br>\t\t# Asignar rotaci\u00f3n completa de la c\u00e1mara<br>\t\tcamera_pivot.rotation = Vector3(pitch, camera_yaw, 0.0)<\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Figura 15.<\/strong>&nbsp;<em>Jerarqu\u00eda de nodos mostrando el SpringArm3D y Camera3D como hijos del caballero.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"552\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura14-1024x552.jpeg\" alt=\"Jerarqu\u00eda de nodos mostrando el SpringArm3D y Camera3D como hijos del caballero.\" class=\"wp-image-88019\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura14-1024x552.jpeg 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura14-300x162.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura14-768x414.jpeg 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura14.jpeg 1096w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Fase 6: Implementaci\u00f3n de monedas y sistema de recolecci\u00f3n de <em>Knight&#8217;s Quest<\/em><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">6.1 Creaci\u00f3n de la escena Moneda con Area3D<\/h3>\n\n\n\n<p>Cada moneda se implementa como una escena independiente, permitiendo instanciar m\u00faltiples copias en el nivel. La ra\u00edz es un nodo&nbsp;<strong>Area3D<\/strong>, que funciona como detector de superposici\u00f3n (trigger).<\/p>\n\n\n\n<p><strong>Jerarqu\u00eda de la moneda:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Moneda<\/code>&nbsp;(Area3D)\n<ul class=\"wp-block-list\">\n<li><code>CollisionShape3D<\/code>&nbsp;(forma&nbsp;<code>SphereShape3D<\/code>&nbsp;con radio&nbsp;<code>0.4<\/code>)<\/li>\n\n\n\n<li><code>MeshInstance3D<\/code>&nbsp;(modelo de moneda dorada desde KayKit)<\/li>\n\n\n\n<li><code>AnimationPlayer<\/code>&nbsp;(para rotaci\u00f3n continua, opcional)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p><strong>Propiedades del Area3D:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Monitoring<\/code>:&nbsp;<code>true<\/code><\/li>\n\n\n\n<li><code>Monitorable<\/code>:&nbsp;<code>true<\/code><\/li>\n\n\n\n<li><code>Collision<\/code>&nbsp;&gt;&nbsp;<code>Layer<\/code>: capa 2<\/li>\n\n\n\n<li><code>Collision<\/code>&nbsp;&gt;&nbsp;<code>Mask<\/code>: capa 1 (para detectar al caballero)<\/li>\n<\/ul>\n\n\n\n<p><strong>Figura 16.<\/strong>&nbsp;<em>\u00c1rbol de nodos de la escena Moneda con Area3D como ra\u00edz.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"504\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura15-1024x504.jpeg\" alt=\"\u00c1rbol de nodos de la escena Moneda con Area3D como ra\u00edz de Knight's Quest\" class=\"wp-image-88020\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura15-1024x504.jpeg 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura15-300x148.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura15-768x378.jpeg 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura15-1536x756.jpeg 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura15.jpeg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">6.2 Se\u00f1al body_entered y l\u00f3gica de recolecci\u00f3n<\/h3>\n\n\n\n<p>El sistema de recolecci\u00f3n se basa en la se\u00f1al&nbsp;<code>body_entered<\/code>&nbsp;del&nbsp;<code>Area3D<\/code>. Cuando el caballero entra en contacto con el \u00e1rea de la moneda, se ejecuta la l\u00f3gica de suma de puntos y destrucci\u00f3n del objeto.<\/p>\n\n\n\n<p><strong>Script de la moneda:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">extends Area3D\n\nsignal moneda_recolectada(valor: int)\n\n@export var puntos: int = 10\n\nfunc _ready() -&gt; void:\n    body_entered.connect(_on_body_entered)\n\nfunc _on_body_entered(body: Node) -&gt; void:\n    if body is CharacterBody3D and body.name == \"Caballero\":\n        moneda_recolectada.emit(puntos)\n        queue_free()<\/pre>\n\n\n\n<p>En la escena principal, se conecta la se\u00f1al&nbsp;<code>moneda_recolectada<\/code>&nbsp;a un m\u00e9todo que actualiza la interfaz de usuario.<\/p>\n\n\n\n<p><strong>Figura 17.<\/strong>&nbsp;<em>Conexi\u00f3n de se\u00f1ales en el editor mostrando la se\u00f1al moneda_recolectada enlazada al script principal.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"438\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura16-1024x438.jpeg\" alt=\"Conexi\u00f3n de se\u00f1ales en el editor mostrando la se\u00f1al moneda_recolectada enlazada al script principal.\" class=\"wp-image-88021\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura16-1024x438.jpeg 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura16-300x128.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura16-768x329.jpeg 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura16-1536x658.jpeg 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura16-1400x600.jpeg 1400w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura16.jpeg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Fase 7: Interfaz de usuario y sistema de puntuaci\u00f3n<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">7.1 Creaci\u00f3n del HUD con CanvasLayer de <em>Knight&#8217;s Quest<\/em><\/h3>\n\n\n\n<p>La interfaz de usuario se implementa mediante un nodo&nbsp;<strong>CanvasLayer<\/strong>, que garantiza que los elementos UI se dibujen por encima de la vista 3D.<\/p>\n\n\n\n<p><strong>Jerarqu\u00eda del HUD:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>HUD<\/code>&nbsp;(CanvasLayer)\n<ul class=\"wp-block-list\">\n<li><code>Panel<\/code>&nbsp;(fondo semitransparente)\n<ul class=\"wp-block-list\">\n<li><code>Label<\/code>&nbsp;(texto &#8220;Monedas: &#8220;)<\/li>\n\n\n\n<li><code>Label<\/code>&nbsp;(contador num\u00e9rico)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p><strong>Configuraci\u00f3n de la etiqueta:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Fuente: se carga una&nbsp;<code>FontFile<\/code>&nbsp;desde los assets de KayKit.<\/li>\n\n\n\n<li>Alineaci\u00f3n: centro izquierda.<\/li>\n\n\n\n<li>Anchura y altura: ajustadas manualmente.<\/li>\n<\/ul>\n\n\n\n<p><strong>Figura 18.<\/strong>&nbsp;<em>Vista del editor mostrando el HUD con el contador de monedas en la esquina superior izquierda.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"605\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura17-1024x605.jpeg\" alt=\"Vista del editor mostrando el HUD con el contador de monedas en la esquina superior izquierda de Knight's Quest\" class=\"wp-image-88022\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura17-1024x605.jpeg 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura17-300x177.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura17-768x454.jpeg 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura17.jpeg 1347w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7.2 Script de actualizaci\u00f3n de puntuaci\u00f3n<\/h3>\n\n\n\n<p>En el script principal del nivel (nodo ra\u00edz), se declara una variable&nbsp;<code>puntuacion_total<\/code>&nbsp;y se actualiza cada vez que se recolecta una moneda.<\/p>\n\n\n\n<p><strong>Script del nivel:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">extends Node3D\n\nvar puntuacion_total: int = 0\n\nfunc _ready() -&gt; void:\n    actualizar_contador()\n\nfunc _on_moneda_recolectada(puntos: int) -&gt; void:\n    puntuacion_total += puntos\n    actualizar_contador()\n\nfunc actualizar_contador() -&gt; void:\n    $HUD\/Panel\/Contador.text = str(puntuacion_total)<\/pre>\n\n\n\n<p>Cada moneda instanciada en el nivel conecta autom\u00e1ticamente su se\u00f1al&nbsp;<code>moneda_recolectada<\/code>&nbsp;al m\u00e9todo&nbsp;<code>_on_moneda_recolectada<\/code>&nbsp;del nivel.<\/p>\n\n\n\n<p><strong>Figura 19.<\/strong>&nbsp;<em>C\u00f3digo del nivel principal mostrando la funci\u00f3n de actualizaci\u00f3n del contador.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"591\" height=\"236\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura18.jpeg\" alt=\"C\u00f3digo del nivel principal mostrando la funci\u00f3n de actualizaci\u00f3n del contador.\" class=\"wp-image-88028\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura18.jpeg 591w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura18-300x120.jpeg 300w\" sizes=\"auto, (max-width: 591px) 100vw, 591px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Fase 8: Programaci\u00f3n orientada a objetos y recursos de <em>Knight&#8217;s Quest<\/em><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">8.1 Creaci\u00f3n de una clase personalizada para enemigos (extensible)<\/h3>\n\n\n\n<p>Para demostrar el uso de POO, se crea una clase base&nbsp;<code>Enemigo<\/code>&nbsp;que podr\u00eda utilizarse en futuras versiones de&nbsp;<em>Knight&#8217;s Quest<\/em>.<\/p>\n\n\n\n<p><strong>Script de la clase:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">class_name Enemigo\nextends CharacterBody3D\n\n@export var velocidad_movimiento: float = 2.0\n@export var puntos_vida: int = 3\n\nfunc recibir_dano(cantidad: int) -&gt; void:\n    puntos_vida -= cantidad\n    if puntos_vida &lt;= 0:\n        morir()\n\nfunc morir() -&gt; void:\n    queue_free()<\/pre>\n\n\n\n<p>Se registra la clase con&nbsp;<code>class_name Enemigo<\/code>, permitiendo instanciarla f\u00e1cilmente desde cualquier escena.<\/p>\n\n\n\n<p><strong>Figura 20.<\/strong>&nbsp;<em>Script de la clase Enemigo mostrando la palabra clave class_name y la funci\u00f3n recibir_dano.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"364\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura19-1024x364.jpeg\" alt=\"Script de la clase Enemigo mostrando la palabra clave class_name y la funci\u00f3n recibir_dano de Knight's Quest\" class=\"wp-image-88029\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura19-1024x364.jpeg 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura19-300x107.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura19-768x273.jpeg 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura19.jpeg 1034w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">8.2 Uso de Resources para datos de configuraci\u00f3n<\/h3>\n\n\n\n<p>Se crea un recurso personalizado (<code>RecursoMoneda<\/code>) para almacenar datos de configuraci\u00f3n de las monedas, separando la l\u00f3gica de los valores.<\/p>\n\n\n\n<p><strong>Script del recurso:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">extends Resource\nclass_name RecursoMoneda\n\n@export var valor_puntos: int = 10\n@export var sonido_recoleccion: AudioStream\n@export var color_emision: Color = Color.YELLOW<\/pre>\n\n\n\n<p>Luego, cada instancia de moneda carga un recurso diferente, permitiendo monedas con distintos valores o efectos sin modificar el c\u00f3digo.<\/p>\n\n\n\n<p><strong>Figura 21.<\/strong>&nbsp;<em>Inspector mostrando un RecursoMoneda configurado con valor 20 puntos y un sonido personalizado.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"775\" height=\"272\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura20.jpeg\" alt=\"Inspector mostrando un RecursoMoneda configurado con valor 20 puntos y un sonido personalizado\" class=\"wp-image-88030\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura20.jpeg 775w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura20-300x105.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura20-768x270.jpeg 768w\" sizes=\"auto, (max-width: 775px) 100vw, 775px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Fase 9: Integraci\u00f3n final y pulido<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">9.1 Instanciaci\u00f3n de monedas en el nivel de <em>Knight&#8217;s Quest<\/em><\/h3>\n\n\n\n<p>Se colocan manualmente 11 monedas en el nivel, distribuidas sobre las plataformas flotantes. Para ello:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Se arrastra la escena&nbsp;<code>Moneda.tscn<\/code>&nbsp;desde el panel&nbsp;<code>FileSystem<\/code>&nbsp;a la vista 3D.<\/li>\n\n\n\n<li>Se posiciona cada moneda usando las herramientas de transformaci\u00f3n.<\/li>\n\n\n\n<li>Se ajusta la altura de cada moneda (<code>position.y<\/code>) para que flote ligeramente sobre la plataforma.<\/li>\n<\/ol>\n\n\n\n<p>Algunas monedas se colocan en posiciones que requieren saltos precisos, aumentando la dificultad del juego.<\/p>\n\n\n\n<p><strong>Figura 22.<\/strong>&nbsp;<em>Vista del nivel final mostrando la disposici\u00f3n de las 11 monedas sobre las plataformas flotantes.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"516\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura21-1024x516.jpeg\" alt=\"Vista del nivel final mostrando la disposici\u00f3n de las 15 monedas sobre las plataformas flotantes para Knight's Quest\" class=\"wp-image-88031\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura21-1024x516.jpeg 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura21-300x151.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura21-768x387.jpeg 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura21-1536x775.jpeg 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura21.jpeg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">9.2 Ajuste de par\u00e1metros de <em>Knight&#8217;s Quest<\/em><\/h3>\n\n\n\n<p>Se realizan pruebas de juego para equilibrar la experiencia:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Velocidad del caballero<\/strong>: se prueba con valores entre&nbsp;<code>4.0<\/code>&nbsp;y&nbsp;<code>6.0<\/code>. Se selecciona&nbsp;<code>5.5<\/code>&nbsp;como valor \u00f3ptimo.<\/li>\n\n\n\n<li><strong>Altura del salto<\/strong>: se prueba&nbsp;<code>jump_speed<\/code>&nbsp;entre&nbsp;<code>7.0<\/code>&nbsp;y&nbsp;<code>9.0<\/code>. Se selecciona&nbsp;<code>8.0<\/code>.<\/li>\n\n\n\n<li><strong>Gravedad<\/strong>: se mantiene en&nbsp;<code>20.0<\/code>&nbsp;para una ca\u00edda responsiva pero no demasiado r\u00e1pida.<\/li>\n<\/ul>\n\n\n\n<p>Todos estos par\u00e1metros se exponen como&nbsp;<code>@export<\/code>&nbsp;en el script del caballero, permitiendo ajustes sin recompilar.<\/p>\n\n\n\n<p><strong>Figura 23.<\/strong>&nbsp;<em>Inspector del nodo Caballero mostrando las variables exportadas (speed, jump_speed, gravity).<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"308\" height=\"165\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura22.jpeg\" alt=\"Inspector del nodo Caballero mostrando las variables exportadas (speed, jump_speed, gravity).\" class=\"wp-image-88032\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura22.jpeg 308w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/Figura22-300x161.jpeg 300w\" sizes=\"auto, (max-width: 308px) 100vw, 308px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">9.3 Creacion de pantallas de inicio y fin<\/h3>\n\n\n\n<p>Se crean pantallas para el inicio y fin del juego:<\/p>\n\n\n\n<p><strong>Figura 24.<\/strong>&nbsp;<em>Menu de inicio de juego. <\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"584\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/fondoMenu-1024x584.png\" alt=\"Logotipo de Knight's Quest\" class=\"wp-image-88039\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/fondoMenu-1024x584.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/fondoMenu-300x171.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/fondoMenu-768x438.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/fondoMenu-1536x876.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/fondoMenu.png 1661w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Logotipo de Knight&#8217;s Quest<\/figcaption><\/figure>\n\n\n\n<p>Se crea el menu de inicio del juego el cual se conforma de 2 botones, jugar y salir, estos botones son accionados por el script de la escena, los cuales dan paso a la escena inicial o para salir del juego:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">extends Control<br><br>func _on_button_pressed() -&gt; void:<br>\tget_tree().change_scene_to_file(\"res:\/\/ProyectoFinal\/scenes\/juego.tscn\")<br><br><br>func _on_button_2_pressed() -&gt; void:<br>\tget_tree().quit()<\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Figura 25.<\/strong>&nbsp;<em>Escena final del juego.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"584\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/fondoFin-1024x584.png\" alt=\"Pantalla de finalizaci\u00f3n de Knight's Quest\" class=\"wp-image-88038\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/fondoFin-1024x584.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/fondoFin-300x171.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/fondoFin-768x438.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/fondoFin-1536x876.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/fondoFin.png 1661w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Pantalla de finalizaci\u00f3n de Knight&#8217;s Quest<\/figcaption><\/figure>\n\n\n\n<p>La escena final del juego, muestra un mensaje de agradecimiento y proximas actualizaciones.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusiones<\/h2>\n\n\n\n<p>El desarrollo de&nbsp;<em>Knight&#8217;s Quest<\/em>&nbsp;demuestra que Godot Engine, combinado con assets de KayKit y un trabajo manual cuidadoso en cinem\u00e1tica, iluminaci\u00f3n y l\u00f3gica, permite crear un plataformas 3D completo y funcional. Los aspectos t\u00e9cnicos m\u00e1s relevantes son:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Arquitectura modular<\/strong>: El uso de escenas independientes (caballero, moneda, plataformas) facilita la reutilizaci\u00f3n y el mantenimiento.<\/li>\n\n\n\n<li><strong>Control manual de cinem\u00e1tica<\/strong>: El&nbsp;<code>CharacterBody3D<\/code>&nbsp;con script personalizado ofrece un control total sobre el movimiento, esencial para juegos de plataformas precisos.<\/li>\n\n\n\n<li><strong>Detecci\u00f3n mediante \u00e1reas<\/strong>: Las&nbsp;<code>Area3D<\/code>&nbsp;y las se\u00f1ales (<code>body_entered<\/code>) proporcionan un sistema limpio y desacoplado para la recolecci\u00f3n de objetos.<\/li>\n\n\n\n<li><strong>Iluminaci\u00f3n artesanal<\/strong>: Colocar y ajustar manualmente cada luz (<code>DirectionalLight3D<\/code>,&nbsp;<code>OmniLight3D<\/code>) permite crear atm\u00f3sferas personalizadas sin depender de sistemas automatizados.<\/li>\n\n\n\n<li><strong>Escalabilidad mediante POO y Resources<\/strong>: Las clases personalizadas y los recursos permiten expandir el juego (a\u00f1adir enemigos, power-ups, niveles) sin reescribir el c\u00f3digo existente.<\/li>\n<\/ol>\n\n\n\n<p>El resultado final es un juego jugable donde el caballero recorre un nivel flotante, salta entre plataformas y recolecta monedas, con una c\u00e1mara en tercera persona que sigue al personaje y un contador en pantalla que muestra el progreso.&nbsp;<em>Knight&#8217;s Quest<\/em>&nbsp;sirve como base s\u00f3lida para proyectos m\u00e1s ambiciosos en Godot.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Video muestra<\/h2>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Juego 3d Knight Quest\" width=\"800\" height=\"450\" src=\"https:\/\/www.youtube.com\/embed\/ie4zr0uaxOA?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Referencias<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">Kay Lousberg. (s.f.).&nbsp;<em>KayKit - Character Pack : Adventurers<\/em>&nbsp;[Modelos 3D y animaciones].&nbsp;<a href=\"https:\/\/itch.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Itch.io<\/a>.&nbsp;Recuperado el 21 de mayo de 2026, de&nbsp;<a href=\"https:\/\/kaylousberg.itch.io\/kaykit-adventurers\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/kaylousberg.itch.io\/kaykit-adventurers<\/a><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">Godot Engine. (s.f.).&nbsp;*Documentaci\u00f3n de Godot Engine - Versi\u00f3n estable (4.6)*. Recuperado el 21 de mayo de 2026, de&nbsp;<a href=\"https:\/\/docs.godotengine.org\/en\/stable\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/docs.godotengine.org\/en\/stable\/<\/a><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">Gdquest. (2025, 3 de diciembre).&nbsp;<em>Aprende Godot de CERO a PRO (en 5 horas)<\/em>&nbsp;[Video]. YouTube.&nbsp;<a href=\"https:\/\/www.youtube.com\/watch?v=0si7UgBegDk&amp;t=3545s\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.youtube.com\/watch?v=0si7UgBegDk&amp;t=3545s<\/a><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Cr\u00e9ditos <\/strong><\/h3>\n\n\n\n<p><strong>Autor<\/strong>: <a href=\"https:\/\/niixer.com\/?s=Valentina+Rodriguez+Casallas\">Valentina Rodriguez Casallas<\/a> &#8211; <a href=\"https:\/\/niixer.com\/?s=Luis+Esteban+Ria%C3%B1o+Montiel\">Luis Esteban Ria\u00f1o Montiel<\/a><\/p>\n\n\n\n<p><strong>Editor<\/strong>: Mg. Ing. <a href=\"https:\/\/niixer.com\/?s=Carlos+Iv%C3%A1n+Pinz%C3%B3n+Romero\">Carlos Iv\u00e1n Pinz\u00f3n Romero<\/a><\/p>\n\n\n\n<p><strong>C\u00f3digo<\/strong>: UCMV-09<\/p>\n\n\n\n<p><strong>Universidad<\/strong>: <a href=\"https:\/\/www.ucentral.edu.co\/\">Universidad Central<\/a><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Knight&#8217;s Quest&nbsp;es un videojuego de plataformas en 3D desarrollado en&nbsp;Godot Engine 4.x. El protagonista es un caballero que debe recolectar monedas esparcidas por un nivel flotante, inspir\u00e1ndose en mec\u00e1nicas cl\u00e1sicas de juegos como&nbsp;Super Mario 3D. Para los modelos tridimensionales se utilizan&nbsp;paquetes de assets de KayKit, incluyendo el personaje, las monedas,Seguir Leyendo<\/p>\n","protected":false},"author":1975,"featured_media":88039,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[1309],"tags":[4616,4618,1103,4612,4615,4614,4619,4613,4617],"class_list":["post-87960","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-computacion-grafica","tag-characterbody3d","tag-cinematica-manual","tag-computacion-grafica","tag-desarrollo-de-videojuegos-3d","tag-gdscript","tag-godot-engine","tag-kaykit-assets","tag-knights-quest","tag-plataformas-3d"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Knight&#039;s Quest: Desarrollo de un plataformas 3D en Godot &#8211; Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos<\/title>\n<meta name=\"description\" content=\"Descubre Knight&#039;s Quest, un proyecto completo de desarrollo 3D en Godot. Aprende cinem\u00e1tica manual, iluminaci\u00f3n, c\u00e1maras y cosas m\u00e1s.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/niixer.com\/index.php\/2026\/05\/21\/knights-quest\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Knight&#039;s Quest: Desarrollo de un plataformas 3D en Godot &#8211; Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos\" \/>\n<meta property=\"og:description\" content=\"Descubre Knight&#039;s Quest, un proyecto completo de desarrollo 3D en Godot. Aprende cinem\u00e1tica manual, iluminaci\u00f3n, c\u00e1maras y cosas m\u00e1s.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/niixer.com\/index.php\/2026\/05\/21\/knights-quest\/\" \/>\n<meta property=\"og:site_name\" content=\"Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/niixer\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-22T03:38:32+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-22T03:44:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/fondoMenu.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1661\" \/>\n\t<meta property=\"og:image:height\" content=\"947\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"EstebanR\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"EstebanR\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 minutos\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Knight's Quest: Desarrollo de un plataformas 3D en Godot &#8211; Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos","description":"Descubre Knight's Quest, un proyecto completo de desarrollo 3D en Godot. Aprende cinem\u00e1tica manual, iluminaci\u00f3n, c\u00e1maras y cosas m\u00e1s.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/niixer.com\/index.php\/2026\/05\/21\/knights-quest\/","og_locale":"es_ES","og_type":"article","og_title":"Knight's Quest: Desarrollo de un plataformas 3D en Godot &#8211; Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos","og_description":"Descubre Knight's Quest, un proyecto completo de desarrollo 3D en Godot. Aprende cinem\u00e1tica manual, iluminaci\u00f3n, c\u00e1maras y cosas m\u00e1s.","og_url":"https:\/\/niixer.com\/index.php\/2026\/05\/21\/knights-quest\/","og_site_name":"Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos","article_publisher":"https:\/\/www.facebook.com\/niixer\/","article_published_time":"2026-05-22T03:38:32+00:00","article_modified_time":"2026-05-22T03:44:37+00:00","og_image":[{"width":1661,"height":947,"url":"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/fondoMenu.png","type":"image\/png"}],"author":"EstebanR","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"EstebanR","Tiempo de lectura":"18 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/niixer.com\/index.php\/2026\/05\/21\/knights-quest\/#article","isPartOf":{"@id":"https:\/\/niixer.com\/index.php\/2026\/05\/21\/knights-quest\/"},"author":{"name":"EstebanR","@id":"https:\/\/niixer.com\/#\/schema\/person\/c566e7727618968b5daa355b393df932"},"headline":"Knight&#8217;s Quest: Desarrollo de un plataformas 3D en Godot","datePublished":"2026-05-22T03:38:32+00:00","dateModified":"2026-05-22T03:44:37+00:00","mainEntityOfPage":{"@id":"https:\/\/niixer.com\/index.php\/2026\/05\/21\/knights-quest\/"},"wordCount":3020,"publisher":{"@id":"https:\/\/niixer.com\/#organization"},"image":{"@id":"https:\/\/niixer.com\/index.php\/2026\/05\/21\/knights-quest\/#primaryimage"},"thumbnailUrl":"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/fondoMenu.png","keywords":["CharacterBody3D","cinem\u00e1tica manual","Computaci\u00f3n gr\u00e1fica","desarrollo de videojuegos 3D","GDScript","Godot Engine","KayKit assets","Knight's Quest","plataformas 3D"],"articleSection":["Computaci\u00f3n Gr\u00e1fica"],"inLanguage":"es"},{"@type":"WebPage","@id":"https:\/\/niixer.com\/index.php\/2026\/05\/21\/knights-quest\/","url":"https:\/\/niixer.com\/index.php\/2026\/05\/21\/knights-quest\/","name":"Knight's Quest: Desarrollo de un plataformas 3D en Godot &#8211; Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos","isPartOf":{"@id":"https:\/\/niixer.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/niixer.com\/index.php\/2026\/05\/21\/knights-quest\/#primaryimage"},"image":{"@id":"https:\/\/niixer.com\/index.php\/2026\/05\/21\/knights-quest\/#primaryimage"},"thumbnailUrl":"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/fondoMenu.png","datePublished":"2026-05-22T03:38:32+00:00","dateModified":"2026-05-22T03:44:37+00:00","description":"Descubre Knight's Quest, un proyecto completo de desarrollo 3D en Godot. Aprende cinem\u00e1tica manual, iluminaci\u00f3n, c\u00e1maras y cosas m\u00e1s.","breadcrumb":{"@id":"https:\/\/niixer.com\/index.php\/2026\/05\/21\/knights-quest\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/niixer.com\/index.php\/2026\/05\/21\/knights-quest\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/niixer.com\/index.php\/2026\/05\/21\/knights-quest\/#primaryimage","url":"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/fondoMenu.png","contentUrl":"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/fondoMenu.png","width":1661,"height":947,"caption":"Logotipo de Knight's Quest"},{"@type":"BreadcrumbList","@id":"https:\/\/niixer.com\/index.php\/2026\/05\/21\/knights-quest\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/niixer.com\/"},{"@type":"ListItem","position":2,"name":"Knight&#8217;s Quest: Desarrollo de un plataformas 3D en Godot"}]},{"@type":"WebSite","@id":"https:\/\/niixer.com\/#website","url":"https:\/\/niixer.com\/","name":"Portal de noticias de tecnolog\u00eda, ciencia, Android, iOS, Realidad Virtual, Aumentada y Mixta, Videojuegos, computadores, todo lo mas reciente en tecnolog\u00eda","description":"Portal de noticias de tecnolog\u00eda","publisher":{"@id":"https:\/\/niixer.com\/#organization"},"alternateName":"Niixer","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/niixer.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/niixer.com\/#organization","name":"Niixer","alternateName":"Niixer.com","url":"https:\/\/niixer.com\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/niixer.com\/#\/schema\/logo\/image\/","url":"https:\/\/niixer.com\/wp-content\/uploads\/2022\/08\/logo-niixer-sin-fondo-1.png","contentUrl":"https:\/\/niixer.com\/wp-content\/uploads\/2022\/08\/logo-niixer-sin-fondo-1.png","width":140,"height":140,"caption":"Niixer"},"image":{"@id":"https:\/\/niixer.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/niixer\/","https:\/\/www.instagram.com\/niixer.tecnologia\/"]},{"@type":"Person","@id":"https:\/\/niixer.com\/#\/schema\/person\/c566e7727618968b5daa355b393df932","name":"EstebanR","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/dbf84b8f54f1f73f67d812aabafd319b544e18263b605900339a6d14a95884b1?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/dbf84b8f54f1f73f67d812aabafd319b544e18263b605900339a6d14a95884b1?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dbf84b8f54f1f73f67d812aabafd319b544e18263b605900339a6d14a95884b1?s=96&d=mm&r=g","caption":"EstebanR"},"url":"https:\/\/niixer.com\/index.php\/author\/lrianom2\/"}]}},"jetpack_featured_media_url":"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/fondoMenu.png","_links":{"self":[{"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/posts\/87960","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/users\/1975"}],"replies":[{"embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/comments?post=87960"}],"version-history":[{"count":11,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/posts\/87960\/revisions"}],"predecessor-version":[{"id":88062,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/posts\/87960\/revisions\/88062"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/media\/88039"}],"wp:attachment":[{"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/media?parent=87960"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/categories?post=87960"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/tags?post=87960"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}