Domina la interfaz de usuario de Godot: personaliza interfaces con nodos de control | Thomas Yanuziello | Skillshare

Velocidad de reproducción


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Domina la interfaz de usuario de Godot: personaliza interfaces con nodos de control

teacher avatar Thomas Yanuziello, Indie Game Developer

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Lecciones en esta clase

    • 1.

      Promoción

      1:31

    • 2.

      Hola mundo

      8:03

    • 3.

      Constantes y variables

      9:11

    • 4.

      Declaraciones y condiciones

      9:46

    • 5.

      Bucles y operadores

      9:23

    • 6.

      Matrices y bucles para

      10:32

    • 7.

      Stacks y funciones

      10:53

    • 8.

      Combinar y devolver

      9:34

    • 9.

      Árbol de escena y herencia

      10:21

    • 10.

      Abstracción y encapsulación

      10:41

    • 11.

      Polimorfismo

      8:01

    • 12.

      Diccionario

      8:54

    • 13.

      Depuración

      9:08

    • 14.

      Configuración

      3:52

    • 15.

      Etiqueta A

      9:46

    • 16.

      Etiqueta B

      6:10

    • 17.

      Textura recta

      8:54

    • 18.

      Botón A

      9:24

    • 19.

      Botón B

      7:43

    • 20.

      Botón de enlace

      10:05

    • 21.

      Variación del tipo de tema

      4:33

    • 22.

      Panel

      7:30

    • 23.

      Recto de color

      7:23

    • 24.

      Barra de menú

      6:20

    • 25.

      Menú emergente

      10:00

    • 26.

      Señales

      10:32

    • 27.

      Guardar datos

      8:50

    • 28.

      Contador

      8:18

    • 29.

      Edición de línea A

      10:50

    • 30.

      Edición de línea B

      7:46

    • 31.

      Botón de opción

      13:06

    • 32.

      Recipiente dividido horizontal

      3:28

    • 33.

      Contenedor de pestañas

      10:45

    • 34.

      Árbol A

      12:45

    • 35.

      Árbol B

      9:47

    • 36.

      Contenedor de rolla

      12:30

    • 37.

      Botón de radio

      9:52

    • 38.

      Botón de verificación

      4:01

    • 39.

      Deslizador vertical

      5:39

    • 40.

      6 4 Barra de progreso

      7:32

  • --
  • Nivel principiante
  • Nivel intermedio
  • Nivel avanzado
  • Todos los niveles

Generado por la comunidad

El nivel se determina según la opinión de la mayoría de los estudiantes que han dejado reseñas en esta clase. La recomendación del profesor o de la profesora se muestra hasta que se recopilen al menos 5 reseñas de estudiantes.

54

Estudiantes

--

Proyecto

Acerca de esta clase

¿Quieres empezar a crear tu primer juego en el motor de juegos Godot?
¿Se te dificulta usar los nodos de control de la interfaz gráfica de usuario (GUI) de Godot?
¿O quieres desafiarte a crear un juego completo en una sola escena utilizando solo nodos de control?

En este curso, exploraremos todo lo que ofrecen los nodos de control de GUI de Godot para crear un juego completo desde cero.

El principio del curso se centra en cómo escribir scripts y el lenguaje GDScript.
Si ya estás familiarizado con Godot y GDScript, puedes omitir estas lecciones e ir directamente a la conferencia de configuración.

¡Haz clic en el enlace de mi sitio web en mi perfil para unirte a nuestro servidor de Discord!

Conoce a tu profesor(a)

Teacher Profile Image

Thomas Yanuziello

Indie Game Developer

Profesor(a)
Level: All Levels

Valoración de la clase

¿Se cumplieron las expectativas?
    ¡Superadas!
  • 0%
  • 0%
  • Un poco
  • 0%
  • No realmente
  • 0%

¿Por qué unirse a Skillshare?

Mira las galardonadas Skillshare Originals

Cada clase tiene lecciones cortas y proyectos prácticos

Tu membresía apoya a los profesores de Skillshare

Aprende desde cualquier lugar

Ve clases sobre la marcha con la aplicación de Skillshare. Progresa en línea o descarga las clases para verlas en el avión, el metro o donde sea que aprendas mejor.

Transcripciones

1. Promoción: ¿Estás listo para comenzar a construir tu primer juego en el motor de juego Gudo? ¿O quieres saber más sobre cómo usar los nodos de control de interfaz gráfica de usuario de GDO's ¿O quieres desafiarte a ti mismo para construir un juego completo en una sola escena usando solo nodos de control? En este curso, exploraremos todo lo que los nodos de Godo Gui Control tienen para ofrecer construyendo un juego completo desde cero Se recomienda que diseñes tu propio juego para este proyecto. Tu juego debe tener una sola escena y solo usar notas de control Gooey Comenzaremos construyendo una pantalla de título, que contenga un título, una imagen de fondo, un botón de inicio y enlaces de redes sociales, explorando la amplia variedad de opciones que están disponibles para cada tipo de nodo. Luego, haciendo la transición al juego principal, agregando una barra de menú con muchos estilos diferentes de opciones de menú, incluidos iconos, teclas de método abreviado y submenús, escribiendo scripts que puedan crear y administrar los datos y configuraciones del jugador en el lenguaje nativo de scripting de Godo , Avanzando con el desarrollo de mecánicas de juego, específicas de mi diseño, exploraremos el resto de los nodos de control de Gudo'Guy en detalle a medida que avanzamos para que descubras cómo aplicarlos a Si te quedas atascado, nuestro servidor de discordia está lleno de otros estudiantes, aficionados y desarrolladores de juegos profesionales que pueden ayudarte Haz clic en el enlace del sitio web en mi perfil de profesor para unirte. Empecemos a construir nuestro juego. 2. Hola mundo: Hola amigos. necesitarás descargar el GDOGameEngine de gdongine.org Si aún no lo has hecho, necesitarás descargar el GDOGameEngine de gdongine.org . El motor es gratuito, pero puedes donar para apoyar el proyecto si quieres. No hay proceso de instalación. Simplemente puede extraer el archivo zipped y abrirlo. Asegúrese de reubicar el ejecutable a una mejor ubicación. La ventana de lanzamiento inicial es una lista de sus proyectos actuales. Pero si aún no tienes ningún proyecto, te pedirá que explores proyectos de demostración. Podemos ignorar esto y simplemente crear nuestro propio nuevo proyecto ya sea haciendo clic en este botón en la lista de proyectos o en el botón Crear en la parte superior de la ventana. Aquí podemos darle un nombre a nuestro proyecto, que normalmente sería el nombre de tu juego. Voy a poner intro a la programación. El proyecto necesita ser almacenado en el disco duro de nuestra computadora, y crearemos una nueva carpeta con el mismo nombre del proyecto. Por defecto, quiere almacenar todo en la carpeta de documentos, pero sería mejor crear una nueva subcarpeta para los proyectos de Godot El renderizador cambia la forma en que se renderizan ciertos dos objetos D y tres D, pero no vamos a dibujar nada, así que podemos ignorar estas opciones El renderizador también se puede cambiar más tarde. Y la compatibilidad de control de versiones con Github se incluye por defecto si quieres usarlo para hacer copia de seguridad de tu proyecto o compartirlo con otros. Cuando esté listo para comenzar, haga clic en Crear y editar. La ventana de GDOEditor abrirá nuestro proyecto vacío recién creado El editor se divide en cinco muelles principales. Un adelanto de nuestro juego está en el centro. El dock inferior izquierdo contiene un navegador de archivos que muestra el contenido de la carpeta del proyecto que acabamos de crear. Actualmente solo contiene el ícono de Gado. El muelle superior izquierdo contiene el árbol de escenas, una lista de todo lo que hay en nuestra escena actual, que actualmente está vacía, por lo que quiere que creemos una raíz para el árbol de escenas. No vamos a estar dibujando nada, así que no necesitamos especificar si esta escena es dos D o tres D o una interfaz de usuario. Así que sólo podemos seleccionar otro nodo. Hay muchos nodos diferentes que podemos crear, pero solo nos interesa aprender a escribir scripts, así que solo usaremos un nodo predeterminado. Podemos renombrar nuestro nuevo nodo haciendo clic sobre él después de haber sido seleccionado o haciendo clic derecho para abrir su menú contextual y seleccionando renombrar. Nombremos este nodo Lección uno. Al seleccionar cualquier nodo en el árbol de escenas se revelarán sus propiedades en el inspector, que está acoplado al lado derecho de la ventana Podemos ver el nombre del nodo que se selecciona y sus propiedades organizadas en categorías expandibles, pero ninguna de estas propiedades aplicable a lo que estamos haciendo. Antes de hacer otra cosa, debemos guardar nuestra nueva escena, ya sea seleccionando guardar escena en el menú de escena o usando el atajo Control S o Comando S. Esto abre un cuadro de diálogo donde podemos especificar un nombre para nuestra escena con la TSCneTension, y una carpeta y una Vamos a crear una nueva carpeta para la Lección uno y luego guardar la escena en esta carpeta. Ahora podemos ver en la pestaña del sistema de archivos que nuestra nueva carpeta ha sido creada para la lección uno, y contiene la escena Lesson one, que está marcada con el icono de Clapperboard A continuación, adjuntaremos un script al nodo raíz de nuestra escena, ya sea seleccionando el nodo raíz y haciendo clic en el botón del script adjunto o haciendo clic derecho sobre él y seleccionando el script adjunto. El lenguaje es GD Script, que es el lenguaje de programación que vamos a estar aprendiendo Cada script heredará del tipo de nodo al que está asociado por defecto Dado que el nodo raíz es un tipo de nodo predeterminado, nuestro script hereda del nodo No estamos usando una plantilla ni un script incorporado, y podemos especificar dónde se almacenará este script dentro del proyecto. Pongamos esto en la misma carpeta. Lección uno. Al nombrar scripts, es importante no ser arbitrario, sino describir el tipo de objeto o comportamiento que estamos creando a través del script Así que vamos a nombrar este hola. Los scripts tienen la extensión de archivo dotGD. Después haga clic en Crear para crear el script. Esto cambiará nuestra vista previa a la vista de script, mostrando nuestro script hello recién creado. También podemos ver nuestro script en la pestaña del sistema de archivos indicado con un icono de diente, y la lección un nodo raíz tiene el icono de script para mostrarnos que tiene un script adjunto a él, que al pasar el cursor sobre él, nos dirá el nombre del Al hacer clic en este icono también se abre el script si no está abierto ya. Nuestro script solo tiene una línea, que describe su herencia del tipo de nodo básico usando la palabra clave extends. Esto solo significa que nuestro script puede hacer todo lo un nodo puede hacer más cualquier cosa que escribamos aquí. También nos permite anular los comportamientos del nodo que ya existen con nuevos comportamientos propios. Por ejemplo, los nodos tienen una función llamada ready, pero no hace nada. Entonces, si queremos que nuestro script anule este comportamiento de no hacer nada, podemos declarar nuestra propia función del mismo nombre usando la palabra clave funk A continuación, al funk le sigue el nombre de la función, normalmente escrito en minúsculas de serpiente, lo que significa que todas las letras minúsculas separan palabras Muchas de las funciones definidas por los nodos van precedidas de un guión bajo, y el nombre debe ser una coincidencia exacta para anular el comportamiento El nombre de la función debe ir seguido de paréntesis y dos puntos Vamos a repasar por qué más tarde. Al presionar Intro después de esta línea, la siguiente línea se sangra automáticamente en un nivel Así es como GD Script sabe qué líneas están contenidas dentro de la función y dónde termina La línea se resalta en rojo porque no se permite que las funciones estén vacías. Por lo que es una buena idea escribir la palabra pase para darle a las nuevas funciones un cuerpo que no haga nada. Ahora que el error se ha ido, podemos ver este icono de flecha azul aparecer frente a la declaración de función, que es el símbolo de anulación, lo que indica que este script ahora está anulando el comportamiento listo de nuestro nodo En lugar de no hacer nada, queremos que nuestro nodo diga hola, lo que podemos hacer con una declaración de impresión, reemplazando la línea que anteriormente decía pasar. La declaración print se parece a una declaración de función con un nombre seguido de paréntesis porque está llamando a una función incorporada Esta función requiere un argumento, que es lo que va dentro de los paréntesis Y este argumento es lo que se va a imprimir. Usando comillas, podemos escribir lo que queramos, y será impreso por nuestro script cuando el nodo esté listo. Dado que el script se llama hola, el comportamiento que queremos crear es que el nodo diga hola. Con nuestro script listo, podemos ejecutar nuestro juego usando el botón Ejecutar escena actual en la parte superior derecha o usando el atajo F six. Esto mostrará una ventana vacía, ya que nuestro juego no dibuja nada, sino que también abre el quinto dock, mostrando el panel de salida. Y en nuestra salida, podemos ver que nuestro nodo ha impreso las palabras hola mundo cuando estaba listo. Podemos terminar esta simulación cerrando la ventana, haciendo clic en el botón de parada, o usando el atajo F ocho. Podemos cambiar el texto que se imprime para que diga lo que queramos y volver a ejecutarlo para ver que nuestro nodo puede imprimir cualquier cosa que le digamos. Ahora sabemos cómo adjuntar scripts a los nodos y ejecutarlos. En la siguiente lección aprenderemos sobre constantes y variables Te veré en la siguiente lección. 3. Constantes y variables: Hola, amigos. Comenzaremos cada lección creando primero una nueva carpeta para la lección. Después creando una nueva escena en esa carpeta del mismo nombre. Haga doble clic en una escena en la pestaña del sistema de archivos para abrirla. Con múltiples escenas abiertas, podemos cambiar entre ellas haciendo clic en sus pestañas en el documento de vista previa. Hoy, discutiremos las diferencias entre constantes y variables usando días como nuestro marco de referencia Así que vamos a adjuntar un nuevo script al nodo raíz de la escena y ponerle el nombre días. Comencemos con constantes y declaremos una en la parte superior del script usando la palabra clave const, seguida del nombre de nuestra nueva constante, que convencionalmente está escrita en mayúsculas de serpiente Una constante es como un contenedor donde podemos almacenar información, pero esa información nunca se le permite cambiar. Algo que consideraríamos una constante podría ser el número de días de la semana. Como no se puede cambiar, le debe dar un valor de inmediato, razón por la cual tenemos un error. Debemos seguir el nombre con un signo igual, el operador de asignación para darle un valor a la constante. El número de días en la semana es de siete. Es razonable suponer que siempre serán siete y es lo mismo para todos. Por lo tanto, nunca debería necesitar cambiar su valor. Por el contrario, tenemos variables, que también son contenedores para almacenar información, pero las que están diseñadas para ser cambiadas. Podemos declarar una variable la misma manera usando la palabra clave VR, luego dándole un nombre escrito convencionalmente en minúscula serpiente. Esto hace que sea fácil ver la diferencia entre constantes y variables en nuestros scripts Algo que cambia frecuentemente podría ser el valor de hoy. A diferencia de las constantes, se permite que las variables estén vacías. Anulemos la función ready de nuestro nodo base e imprimimos los valores tanto del número de días de la semana como de hoy. Podemos ver que el número de días en la semana es de siete, pero el valor de hoy se imprime como nulo, lo que significa vacío o ningún valor. Arreglemos eso inicializando hoy para que sea jueves. Y podemos hacer que nuestra salida sea más legible agregando algo de contexto, comenzando con algo como hoy es entonces dejar un espacio después es un signo más, luego nuestra variable. En este caso, se está utilizando el signo más para sumar dos piezas de oración juntas Si tratamos de hacer lo mismo con nuestra constante, sin embargo, provocará un error porque nuestra constante es un número, no una palabra. Cuando declaramos nuestra constante, le asignamos un valor de siete, que es un número sin ningún punto decimal, que en matemáticas se llama entero. Entonces nuestra constante tiene un tipo de entero. Hoy, por otro lado, se le asignó un valor de algunos caracteres envueltos entre comillas. En programación, llamamos a esto una cadena. Entonces nuestra variable tiene un tipo de cadena. El operador plus solo se puede usar cuando los tipos de ambos operandos son compatibles Podemos sortear esto usando una función incorporada para cambiar el tipo tal como se está usando aquí a una cadena, pasando la constante como argumento a la función. Esto no cambiará el tipo de la constante original, solo cómo se está utilizando aquí dentro del contexto de la operación append Y podemos seguir agregando más contexto después con otra cadena anexada también, recordando agregar un espacio extra en la parte delantera. Así que ahora podemos imprimir nuestras constantes y variables usándolas en frases fáciles de entender. Después de estas líneas, pretendamos que pasa un día. Podemos agregar contexto adicional a nuestros scripts que nunca serán vistos por los jugadores sino que solo existe para ayudarnos como desarrolladores entender nuestro propio código o código escrito por otros. Estos se llaman comentarios y se crean usando el signo o hashtag OctathorpPound Cualquier texto escrito después de este símbolo se coloreará en gris y no afectará la forma en que se ejecuta el script de ninguna manera. Pueden estar en sus propias líneas o al final de una línea de código. Entonces usemos un comentario para explicar que estamos fingiendo que ha pasado un día entre el código de arriba de esta línea y el código de abajo Cambiaremos el valor de hoy para que sea viernes e imprimiremos otra frase. Hoy es más Hoy, que ahora tiene un valor diferente. Podemos ver que el valor de hoy primero se imprimió como jueves y luego se cambió y se imprime como viernes en la siguiente línea. El comentario no tuvo efecto en el script que se estaba ejecutando. Si tratamos de cambiar el valor de nuestra constante, obviamente, esto provocará un error porque no se permite que se cambien las constantes Si ya no queremos usar algunas líneas de código en nuestro script, podemos cambiarlas fácilmente a comentarios resaltándolas y presionando Control K o Comando K, agregando el símbolo de comentario al frente de cada línea resaltada. Al presionarlo de nuevo se eliminarán los comentarios. Podemos especificar el tipo de variable o constante añadiendo dos puntos después del nombre. Seguido del nombre del tipo, queremos restringir esta constante o variable también. Vamos a restringir nuestra constante para que sea de tipo int y hoy de tipo string. Aparte de cadenas y enteros, hay otros dos tipos primitivos que podemos usar para almacenar información básica Si un número tiene puntos decimales, ya no es un entero y en su lugar un tipo diferente llamado número de punto flotante, que usa el nombre de tipo float. Agreguemos otra variable para la fecha de hoy y le demos un tipo de número de punto flotante con un valor de 12.05, que es la fecha de hoy 5 de diciembre Y el último tipo se llama Boolean usando el nombre abreviado Boole, que puede ser verdadero o Entonces agregaremos otra variable para saber si hoy es feriado o no. Voy a restringir esto para que sea booleano, pero no le voy a dar un valor inicial Agreguemos dos sentencias print más para imprimir los valores de estas variables con contexto. La fecha de hoy es más fecha, y hoy es feriado. Colon plus es un día festivo. Cuando ejecutamos esto ahora, podemos ver nuestra fecha impresa, pero es un feriado dice falso, a pesar de no darle un valor. Esto se debe a que todos los tipos primitivos tienen un valor predeterminado, pero el valor predeterminado solo se puede asignar si especificamos el tipo de variables. Ya que especificamos que es un feriado es un booleano, se le asignó al valor predeterminado para un booleano, El valor predeterminado tanto para un número entero un número de punto flotante son ambos cero, y el valor predeterminado para una cadena es solo una cadena vacía, que no es lo mismo que null, sino una cadena sin caracteres en ella. Si no especificamos el tipo de una variable, su valor predeterminado será nulo, pero se le puede asignar un valor de cualquier tipo, y su tipo puede cambiar en cualquier momento. Eliminemos el tipo de fecha. Entonces dale un nuevo valor del 13 de diciembre e imprímela por segunda vez. La variable comienza a asignarse un valor de un número de punto flotante, es utilizada por la sentencia print, luego se le asigna un valor de cadena antes de volver a imprimirse. Esto está permitido porque GD Script es un lenguaje poco escrito Esto ofrece una mayor flexibilidad a la hora de escribir nuestros scripts, pero también una mayor responsabilidad para evitar errores de compatibilidad de tipos como vimos con el operador plus. Se recomienda que siempre le des un tipo a tus variables, no sólo para evitar errores, sino también para mejorar la eficiencia de ejecutar tus scripts. Si el motor conoce el tipo de tus variables, entonces también sabe exactamente cuánta memoria necesita ocupar. Esto también se aplica al uso constantes en lugar de variables Si el motor sabe que el valor no puede cambiar, entonces se puede usar de manera más eficiente. En la siguiente lección, aprenderemos sobre cómo controlar el flujo de nuestros guiones. Te veré en la siguiente lección. 4. Declaraciones y condiciones: Hola, amigos. Ya me adelanté y creé una nueva escena en una nueva carpeta para esta lección. Hoy aprenderemos a controlar el flujo de nuestros scripts para ejecutar diferentes líneas de código, tomando decisiones sobre si podemos ver o no. Así que vamos a adjuntar un nuevo script al nodo raíz de nuestra escena y ponerle el nombre visión. Comenzaremos nuestro script anulando la definición de nodos base de la función ready El método más básico para controlar el flujo de nuestros scripts es la declaración I, que comienza con la palabra clave I. I va seguida de una declaración condicional que debe ser verdadera o falsa. Por ahora, pongamos verdad, que luego va seguida de dos puntos. Similar a los dos puntos al final de nuestra declaración de función, esto marca el final de la sentencia, y continuando a la siguiente línea, se sangró automáticamente otro nivel Cualquier línea de código que siga a esta sentencia if, que están sangradas solo se ejecutará si la condición de la sentencia if es verdadera Así que vamos a imprimir algo así como que la condición era cierta y luego ejecutemos la escena actual para ver nuestra declaración impresa funcionando. Si cambiamos true a false, podemos ver que la declaración print se omite durante este tiempo Podemos agregar otra línea después de las sentencias if con sangría en el mismo nivel de sangría que la instrucción I simplemente con la palabra clave s seguida Esto crea otro cuerpo condicional que se ejecutará sólo si no se cumplió la condición de la declaración I original. Duplicemos la declaración print y la cambiemos para decir algo diferente. Como la condición era falsa, se ejecutó el bloque se en lugar del bloque I. Y si cambiamos la condición a verdadera, ocurrirá lo contrario. Esto no es muy útil si siempre sabemos que el resultado de la declaración condicional es verdadero o falso, pero podemos reemplazarlo por una variable. Declaremos una variable booleana, que es si la luz está encendida o no en la habitación booleanos se denominan convencionalmente tal manera que implican su uso como condición En este caso, la luz está encendida se implica que es verdadera o falsa en función de cómo se le nombra. Ahora nuestra declaración if puede establecer su condición para que sea si el valor de nuestra variable es igual o no a true. Al comparar dos valores para ver si son iguales, utilizamos un signo doble igual, conocido como el operador igual, que es diferente de un solo signo igual como usamos antes como operador de asignación. Entonces imprimiremos o puedo ver o no puedo ver como resultado de si la luz está o no en ser igual a verdad. Como el valor por defecto de un booleano es false, podemos ver la salida como no puedo Pero si establecemos la variable en true , cambia a puedo ver. Dado que la variable en sí es un booleano, ya sea verdadero o falso, podemos eliminar la operación de comparación por completo y simplemente usar el booleano como condición y obtener exactamente el Podemos revertir el valor de cualquier booleano, es decir, si es verdadero, se vuelve falso o si es falso, se vuelve verdadero usando la palabra clave not Al igual que la función STR que usamos en la lección anterior, esto solo cambia la forma en que se está usando en el contexto local y en realidad no cambia el valor almacenado en la variable. Entonces, si nada, la luz está encendida, entonces no podemos ver y de lo contrario podemos ver Nada también puede ser representado por un signo de exclamación. Cambiemos el valor de las luces encendidas y volvamos a ejecutarlo. Después volveré estos cambios a la forma en que estaban antes Podemos hacer nuestras condiciones mucho más complejas combinando múltiples condiciones juntas usando operadores lógicos. Vamos a crear otra variable llamada Tiene visión oscura. Esta variable implica que deberíamos poder ver aunque la luz no esté encendida. Entonces podemos sumar a nuestras declaraciones if condicionar que sea que la luz esté encendida o que tengamos visión oscura. Y si alguna de estas condiciones es cierta, entonces podemos ver. Sólo si ambas condiciones son falsas, ¿ resultará en que no podamos ver? Y si, en lugar de tener visión oscura, estamos usando gafas de visión nocturna, ya que solo nos permiten ver en la oscuridad pero no en la luz. Cambiando el nombre de la variable, la condición de nuestra declaración I necesita cambiar. Ya que si ambas condiciones son ciertas, entonces no deberíamos poder ver. Sólo si los valores de estas dos condiciones son diferentes, ¿debemos considerar que se cumple la condición a ver? Podemos usar el operador no es igual para verificar si los dos valores no son iguales entre sí. Si está familiarizado con las operaciones lógicas, esto se conoce en otros idiomas como un exclusivo o. Ahora, sólo si o bien la luz está encendida o estamos usando gafas de visión nocturna y no ambas, ¿ podremos ver? A continuación, consideremos que nuestra persona hipotética podría no ser humana y sumar una variable para el número de Is que tienen, que debería representarse como un entero Por ahora, le daremos un valor de dos ojos. Ignorando las otras variables, ¿cuál sería la condición que establecemos para poder ver en base a esta variable Si el número de ojos que tenemos es algo mayor que cero, entonces deberíamos poder ver. También podemos expresarlo usando otro operador, mayor o igual a y cambiar el lado derecho a uno. Por lo que deben tener ojos mayores o iguales a uno. Estos son operadores de comparación que devolverán un resultado booleano comparando el valor de los números en sus lados izquierdo y derecho Podemos concluir lógicamente que debería ser imposible cualquier criatura humana o otra manera tenga un número negativo de ojos El valor de nuestra variable sólo debe ser cero o algo mayor que cero. Y la condición para poder ver realmente se reduce a estas dos opciones ¿Tenemos ojos cero o ojos distintos de cero? Al igual que la variable booleana se puede usar implícitamente como condición, un entero también se puede usar de esta manera con cero siendo considerado una condición falsa y cualquier otra cosa que no sea cero La misma lógica también se aplica a los números de punto flotante. Podemos declarar una variable flotante, llamémosle rango de visión y darle un valor arbitrario de 7.8 metros. Podemos usar nuestros operadores de comparación para determinar si este número es mayor que menor o igual a cierto valor, o podemos usarlo implícitamente en su propia condición con cero siendo considerado falso y cualquier otra cosa considerada verdadera ¿Qué pasa con las cuerdas? Cambiemos las cosas ligeramente y declaremos una variable de cadena para lo que escuchamos y le demos un valor de baches en la noche. Entonces podríamos usar lógicamente esto como una declaración if como si lo que oí no fuera una cadena vacía, entonces podemos decir, escuché algo De lo contrario, no escuché nada. Y al igual que los otros tipos de variables, podemos dejar caer la comparación y usar la propia variable como condición. Con todas las variables, sus valores predeterminados se consideran falsos, y cualquier otra cosa siempre se considera verdadera cuando se usa como condición. Si declaramos una variable sin un tipo, llamémosla como estoy viendo, pero no le demos un valor, entonces ya sabemos que su valor predeterminado será nulo. Incluso sin un tipo o un valor, cualquier variable puede ser utilizada como condición de acoso. Cualquier variable que esté vacía, es decir, su valor es nulo se considera falsa. Si tuviéramos que poblar esta variable con un objeto, entonces su valor como condición se consideraría verdadero Actualmente no tenemos ningún otro objeto con el que jugar, pero siempre podemos usarnos a nosotros mismos. Así que vamos a establecer el valor de lo que estoy viendo para que sea la palabra clave yo. Y esto da como resultado poder ver. En la siguiente lección, usaremos bucles para repetir líneas de código varias veces. Te veré en la siguiente lección. 5. Bucles y operadores: Hola, amigos. Hoy aprenderemos a repetir líneas de código varias veces con bucles imaginando a una dama que se ha enamorado por primera vez sosteniendo una flor Así que vamos a escribir un nuevo guión y ponerle nombre flor. Luego anula la definición de nodos base de la función ready. Nuestra dama imaginada sostiene una flor que tiene varios pétalos, los cuales almacenaremos en una variable y restringiremos su tipo a un entero. Entonces dale un valor de algún número arbitrario, digamos cinco. También declararemos otra variable llamada He Loves Me, como booleana, que creemos con su valor predeterminado de false Podemos comenzar nuestro guión imprimiendo una historia sobre la dama enamorada que sostiene su flor. Ella quita cada pétalo de la flor uno por uno, declarando o él me ama o no me quiere. Primero, necesitamos reducir uno el número de pétalos en la flor. Entonces comenzaremos con la variable número de pétalos, luego usaremos el operador de asignación para asignar la variable nuevo valor. El valor que queremos asignarle es el número que ya tiene menos uno. Entonces queremos cambiar el valor de la variable booleana. A él me quiere ser su opuesto. Entonces él me ama, se le asigna a no Él me ama, revirtiendo el valor de falso verdadero o viceversa. A continuación, podemos imprimir los resultados. Él me ama. Es posible que queramos encapsular esta parte entre comillas, pero si tratamos de poner comillas dentro de nuestra cadena, en su lugar marcará el final de la cadena Algunos caracteres especiales como las comillas se pueden crear dentro de una cadena usando una barra diagonal inversa Si escribimos comillas invertidas, esto ahora representa un carácter de comillas, no el final de la cadena Y podemos incluir otra después de la declaración de Damas. Duplicemos esta línea y cambiemos la declaración para decir, Él no me ama. Otro ejemplo de un carácter especial que podemos escribir usando la barra inversa es la barra inversa misma También podemos combinar las dos líneas anteriores y separarlas con barra diagonal inversa N, que representa una nueva Por lo que se imprimen en dos líneas de salida a partir de una sola declaración de impresión. Ahora tenemos dos posibilidades que queremos imprimir en base al valor de nuestra variable booleana Entonces parecería que deberíamos envolverlos en una declaración if. Si me quiere, entonces imprima esto. Si no me quiere, entonces imprima eso. Pero en los casos en los que si las declaraciones están supeditadas una sola variable booleana para hacer un cambio menor, hay un método más eficiente Entonces volvamos al formato original. Nuestra declaración será él me ama, si me ama, de lo contrario, no me quiere a mí. Esto no es lo mismo que una sentencia if a pesar de usar las mismas palabras clave, pero se llama operación ternaria Dado que no crea un nuevo bloque de código con sangría, realidad se ejecuta de manera más eficiente y se recomienda su uso en casos simples como este De hecho, podemos reducir aún más el tamaño de la variación cambiando solo para que sea un signo de exclamación o un espacio seguido de la palabra no, luego el signo de exclamación Esto funciona para el caso si me ama, pero si cambiamos el valor a true por defecto, entonces solo vemos no en el otro caso. Al igual que las matemáticas, existe un orden específico de operaciones en el que nuestros scripts ejecutarán múltiples operaciones en la misma línea. Ya que tanto el string append el ternario I son ambos operadores, uno debe ser ejecutado antes que el otro, y en este caso, será el string Y al igual que en matemáticas, los brackets son siempre los primeros en ser ejecutados. Por lo que podemos envolver cualquier operación entre paréntesis para asegurarnos de que se ejecutará primero en el orden de las operaciones. Envolviendo nuestra declaración ternaria entre paréntesis, ahora se ejecutará antes de que la cadena anexe y nos dará nuestro resultado esperado Entonces ahora tenemos nuestro bloque de código que necesita repetirse mientras la flor todavía tenga pétalos. Usando la palabra clave WOW, igual que una sentencia if, podemos repetir un bloque de código con sangría siempre que la condición permanezca verdadera La condición en este caso es que el número de pétalos en la flor no sea cero. Sea cual sea el número de pétalos en la flor, se reducirá en uno cada vez. Entonces después de la sentencia print, el flujo lógico de este script volverá al inicio del bucle WoW para verificar nuevamente la condición. Cuando el número de pétalos llega a cero, la condición ya no se cumple y el bucle se rompe, procediendo con el resto del guión, si hay alguno. Entonces, escribamos una breve conclusión de nuestra historia basada en los resultados. Se levanta con lágrimas en los ojos. Pero basado en el valor final de He Loves Me, ella es feliz o triste, e imprimiremos la frase final diferente. Ejecutando esta escena, podemos ver nuestra historia impresa en el panel de salida, y con cinco pétalos, la señora está feliz. Si cambiamos el número de pétalos a seis, entonces obtenemos un resultado diferente ya que el bucle se repitió seis veces en lugar de cinco. Pero, ¿qué pasa si cambiamos a cero el número de pétalos en la flor? El bucle no corre en absoluto, y el amor estaba condenado desde el principio No recomiendo seguir este ejemplo, sino solo ver qué pasa si le damos a la flor un número negativo de pétalos. Si bien esto es realista imposible, en nuestro código, es muy problemático Dado que la condición de nuestro bucle de pared nunca se cumplirá, nunca se romperá, y el guión queda atrapado dentro de él, nunca terminando. Este es un bucle infinito y debe evitarse a toda costa. En este caso, podemos evitar el bucle infinito cambiando nuestra condición para que sea si el número de pétalos es mayor que cero, ya que un número negativo seguirá rompiendo el bucle. Podemos usar otro operador a la hora reducir el número de pétalos como atajo. Eliminando la necesidad de escribir el nombre de nuestra variable dos veces, podemos realizar operaciones matemáticas simples sobre nuestro número de variables usando un operador de asignación especial. En este caso, el operador menos igual puede cambiar esta línea de código a número de pétalos menos igual a uno. Estos atajos existen para todas las operaciones aritméticas básicas más iguales multiplican iguales o dividen iguales, y se pueden usar con cualquier número o variable como el otro operando También existe un operador más para la aritmética básica, el operador de módulo, representado por el signo porcentual El módulo realiza una operación de división, pero no devuelve el cociente como resultado como lo hace el operador de división En cambio, devuelve el resto de la división. Todo este guión, aparte de la historia que se cuenta, realidad solo está determinando si el número de pétalos en la flor es un número par o impar, pero lo está haciendo de la manera más ineficiente posible, contando hacia atrás cada pétalo individual Así que vamos a comentar todo el bucle de pared y en su lugar usar el módulo para acelerar el proceso. Sabiendo que todos los números pares son divisibles por dos, podemos usar número de pétalos módulo dos El único resultado posible como resto de esta división será cero si el número de pétalos es par o uno si el número de pétalos es impar. Entonces nuestro guión podría simplificarse a solo si el número de pétalos módulo dos es igual a uno, entonces la dama está feliz. De lo contrario, está triste. Y como entendemos cómo se interpretan los enteros como condiciones, ni siquiera necesitamos realizar la operación de comparación aquí y solo podemos acortarla a I número de pétalos módulo El resultado de la operación de módulo podría asignarse directamente a la variable booleana para obtener el mismo resultado sin la necesidad de una sentencia if, y el cero o uno se convertirán automáticamente en falso o verdadero Y podríamos ir más allá quitando la variable y simplemente usando la operación de módulo directamente dentro de la declaración turny En la siguiente lección aprenderemos sobre colecciones de variables relacionadas. Te veré en la siguiente lección. 6. Matrices y bucles para: Hola, amigos. Hoy consideraremos cómo podemos organizar grandes cantidades de variables, especialmente cuando contienen información relacionada. Ya he seguido adelante y creé un script llamado censo y anulé la definición de nodos base de la función ready Para nuestro hipotético escenario en esta lección, estamos imaginando a un trabajador del censo que necesita registrar cuántas personas viven en cada casa en una sola carretera Podemos declarar una sola variable para contener toda esta información, Vamos a llamarlo Main Street. Y el tipo de esta variable será una matriz. Una matriz puede contener una lista de variables de cualquiera de los otros tipos. En este caso, el tipo de variables que estamos buscando son enteros, que representan el número de personas que viven en cada casa Podemos especificar el tipo de contenido de una matriz usando corchetes después la matriz type name y poniendo el tipo de contenido dentro de los corchetes. Ahora bien, esta matriz solo puede contener enteros como su contenido. Antes de que podamos acceder al contenido de una matriz, necesita tener un tamaño, el número de variables que están contenidas en su interior. A diferencia de otras variables, los arrays son más complejos y tienen sus propias funciones. Podemos acceder a estas funciones siguiendo el nombre de la variable con un punto, luego el nombre de la función. En este caso, la función resize, que establece el número de direcciones dentro de esta matriz, representando el número de casas en Main Street, que diremos es seis Nuestro pueblo imaginado es un poco inusual ya que los números de las casas en Main Street comienzan en cero. Por lo que nuestro trabajador del censo inicia en la casa en calle principal cero y llama a la puerta para preguntarle al residente del hogar cuántas personas viven en la casa Podemos almacenar un valor en una matriz comenzando por su nombre, luego usando corchetes para marcar la dirección del entero específico, en este caso, dirección cero, luego usando el operador de asignación. Podemos asignar un entero a esa dirección. Entonces digamos que la casa número cero de la calle principal tiene cinco personas viviendo en ella. pasar a la siguiente casa en dirección número uno de la calle principal, alguien contesta el golpe en la puerta y le dice trabajador del censo que hay dos personas viviendo en esa casa. En la casa de al lado, dirección número dos, la casa está en construcción y tiene un letrero de venta, lo que significa que esta casa está claramente desocupada, y nuestro trabajador del censo registra el número de residentes como cero En la calle principal número tres, nadie abre la puerta, a pesar de que hay un automóvil en la calzada y señales de ocupación ¿Qué podríamos considerar que deben registrar los trabajadores del censo como el número de residentes? Podríamos pensar que podría ser cero. Pero, ¿cómo diferenciaríamos entre un número desconocido de ocupantes y una casa desocupada Si consideramos que el número de ocupantes de una casa nunca debe considerarse un número negativo, podríamos usar el número negativo uno para significar que el número de ocupantes de la casa es un valor desconocido Y en la calle principal número cuatro, nuevo, no hay respuesta en la puerta. Pero la casa también parece estar descuidada, y probablemente nadie haya vivido allí desde hace bastante tiempo. Podríamos suponer que el número de ocupantes es cero tal vez usó el mismo valor negativo para un número desconocido de ocupantes o crear códigos de valor más negativos para diferentes situaciones como usar dos negativos para significar probablemente desocupados pero La dirección número cinco Main Street ni siquiera tiene casa, pero es solo un terreno baldío Entonces nuevamente, esto podría representarse con un cero u otro valor negativo para codificar algún tipo de reunión. Imprimamos los resultados del censo y veamos cómo se ven. Podemos ver nuestra matriz representada como una lista separada por comas de números encapsulados entre corchetes Esto hace un trabajo decente al representar el número de personas que viven en cada casa de Main Street. Pero, ¿y si quisiéramos usar estos datos para obtener un número total de ocupantes de todas las casas en Main Street o promedio Si calculáramos la suma de todos estos números, los números desconocidos que se representan como negativos sesgarían los Uno de los mejores beneficios de usar arreglos para almacenar información relacionada de esta manera es lo fácil que es recorrerla. Usando la palabra clave four, escribimos a continuación el nombre de una nueva variable, una que representará cada elemento individual dentro de la matriz, seguido de la palabra clave in, luego el nombre de la matriz. Al igual que las funciones, si las sentencias son bucles wa, esto va seguido de dos puntos y un bloque de código con sangría que se repetirá Estas líneas de código se repetirán una vez por cada una de nuestras seis casas en Main Street, y podemos nombrar a la casa variable, ya que se utilizará para acceder a cada casa individual dentro del bucle. Digamos que primero queremos encontrar el promedio de ocupantes que viven en una casa ocupada Eso significaría sumar todos los números positivos luego dividiendo por el número de casas ocupadas. Entonces necesitaremos tres nuevas variables, una para el número total de ocupantes, otra para el número de casas ocupadas, ambas como números enteros, y un número de punto flotante para el promedio Por cada casa en Main Street, podemos verificar si la casa está ocupada, si el número almacenado en la matriz en esa dirección ahora almacenada en la variable house es algo mayor que cero. Si esto es cierto, entonces el número total de ocupantes en las casas ocupadas se puede incrementar por casa, y el número de casas ocupadas se incrementa Después de que se hayan revisado las seis casas de Main Street, el bucle se rompe, y tenemos nuestros dos números enteros. Así podemos calcular el promedio dividiendo el número total de ocupantes por el número de casas ocupadas Después imprima los resultados. Hay más casas ocupadas, más casas ocupadas en la calle principal, con un promedio de más ocupantes promedio más ocupantes Pero si ejecutamos este código, el promedio se representa como un entero, tres, lo que sabemos que no es correcto, ya que hay un total de siete ocupantes en dos casas ocupadas, el promedio debería ser de 3.5 Esto sucedió porque realizamos una operación de división con dos enteros, y el resultado de la operación también será un entero, aunque lo estemos asignando a una variable de número de punto flotante Godot también proporciona una advertencia contra el uso de enteros en operaciones de división Para resolver esto, podemos cambiar nuestras variables enteras a números de coma flotante en sus declaraciones, o podemos cambiar su tipo localmente antes de realizar la división. De la misma manera que cambiamos enteros en cadenas antes de agregarlos, podemos cambiar un entero en un número de punto flotante antes de realizar una división Cambiar el resultado de la división a un número de coma flotante también. Cambiar el tipo de una variable de esta manera se llama casting. Estamos lanzando un entero a un flotador. Ahora podemos ver los resultados que esperábamos con un promedio de 3.5 ocupantes por casa ocupada Un beneficio de GD Script, ser un lenguaje poco escrito es que no necesitamos especificar los tipos de nuestras variables, incluyendo los tipos contenidos dentro de Si permitimos que nuestra matriz contenga cualquier tipo de variable, podemos cambiar la forma en que nuestro trabajador censal registra la información. Supongamos que la dirección cero sigue siendo la misma con cinco ocupantes Pero la dirección uno también proporcionó los nombres de los dos residentes que allí viven. En lugar de grabar a los ocupantes como número dos, podríamos grabar sus nombres en una cadena Por lo que la dirección número uno de Main Street está ocupada por Jordan y Ashley Smith. La casa número dos estaba desocupada, lo que podríamos representar como un cero Pero también podríamos considerar grabarlo como un booleano y darle un valor de falso para significar que la casa está en construcción y no puede tener ocupantes En el número tres, nadie estaba en casa, pero definitivamente hay gente viviendo ahí. Simplemente no sabemos cuántos. También podríamos almacenar este valor como un booleano y darle un valor de verdad En el número cuatro, realmente parece que ahí no vive nadie. Es posible que queramos comercializar como cero ocupantes. En la dirección número cinco, ya que ahí ni siquiera hay una casa, en realidad podríamos considerar usar null como valor, ya que null representa la ausencia de cualquier valor. Podemos usar la palabra clave null para asignar esto a la matriz en la dirección cinco. Ahora nuestra matriz impresa se ve bastante diferente, que contiene variables de todos los tipos diferentes en lugar de solo números enteros, y podemos discernir más información de Las matrices pueden incluso contener otras matrices como su contenido. Así que vamos a cambiar nuestra lista de nombres de una sola cadena a una matriz de cadenas. Podemos crear esta matriz al mismo tiempo que se le está asignando usando corchetes, luego poblándola con una lista de cadenas separadas por comas como su contenido Entonces, si quisiéramos saber cuánta gente vive en la Dirección uno en Main Street, podríamos imprimirlo como el SIE de un punto de En la siguiente lección, aprenderemos más usos de las matrices para crear colecciones de datos más dinámicas. Te veré en la siguiente lección. 7. Stacks y funciones: Hola, amigos. Hoy seguiremos trabajando con arreglos de diferentes formas configurando un juego de Old made. Ya he seguido adelante y creé un script llamado Old Made y anulé la definición de nodos base de la función ready Para jugar old made, necesitamos una baraja de cartas, que es una colección de variables que podemos contener dentro de una matriz. Dado que al juego de Old Made realmente no le importan los trajes de las cartas, podemos ignorar esa información, y cada elemento de la matriz solo necesita contener el rango de cartas del as al rey como un entero. Para generar nuestro mazo, podemos usar un bucle de cuatro. Pero en lugar de usar los cuatro bucles para iterar a través de una matriz, solo se puede usar para contar a través de nuestros rangos de cartas. Comenzando con cuatro, podemos declarar una variable para representar el rango de una carta, seguida de la palabra clave in, luego especificar un número. Si tuviéramos que considerar a King como un número, sería el rango 13. Por ahora solo vamos a imprimir rango para que podamos ver qué pasa. El bucle cuatro inicia con un valor de rango en cero y cuenta hasta 12, repitiendo este bucle e imprimir sentencia 13 veces. Por el bien de la cordura, podría ser una buena idea considerar que carta número dos esté representada por el rango dos, y así As sería uno, y el rey sería 13 Si bien comenzar un bucle cuatro en cero es realmente útil para iterar a través de matrices, ya que su primer número de índice es cero, no es tan útil en este caso Podemos cambiar la forma en que cuenta un bucle cuatro reemplazando el 13 con una llamada a función, range. Las llamadas a funciones van seguidas de paréntesis que contienen argumentos Los argumentos para esta función son los límites inferior y superior del rango. El límite inferior se incluirá en el rango, pero no se incluirá el límite superior. Entonces el rango 114 contendrá todos los números 1-13, y podemos ver que se imprime en la salida Otra forma de agregar información a una matriz en lugar de usar los corchetes y número de índice es usar una función llamada append Esta función append acepta un argumento del valor que se agrega a la matriz Esto posicionará el valor que se agrega al final de la matriz, donde sea que esté. Y como hay cuatro de cada rango en una baraja de cartas, una por cada palo, deberíamos repetir esta línea de código cuatro veces por cada rango. Podemos hacer esto con otro bucle de cuatro, esta vez comenzando en cero y contando hasta, pero sin incluir cuatro. Al imprimir la baraja, podemos ver que nuestra matriz tiene cuatro de cada número 1-13 para un total de 52 cartas Pero para jugar viejo hecho, queremos quitar a tres de las reinas, o en este caso, 12. Entonces en nuestro bucle de cuatro que está iterando a través de los trajes de cartas, comprobemos si el rango es 12 Y en este caso específico, solo queremos permitir que se agregue 112, usando la palabra clave break para salir instantáneamente de este bucle. Break solo terminará el bucle con más sangría en el que se encuentra actualmente Entonces terminaremos el palo por bucle pero no el rango para bucle. Esto aumentará entonces el rango a 13 y procederá a sumar cuatro trece a la baraja Y probándolo, podemos ver como sólo hay 112. Lo primero que sucede en nuestro juego es barajar la baraja de cartas, que en el guión GD es una sencilla función incorporada de rayse Solo necesitamos llamar a esta función, y podemos ver que las cartas se barajan en nuestro mazo También necesitaremos otra variable, un conjunto de manos de cartas para representar a nuestros jugadores. Cada mano dentro de la matriz de manos necesita contener múltiples tarjetas, por lo que también son matrices, que necesitaremos inicializar antes de poder usarlas. Entonces contando desde cero hasta pero sin incluir cuatro, podemos agregar una nueva mano a la matriz Nuestra mano comienza como una matriz vacía representada por corchetes. Si imaginamos nuestra baraja de cartas, siendo el frente de las cartas el lado con el sonó y el palo, estando el dorso de la carta en blanco, entonces también podríamos imaginar que la baraja está boca abajo El frente de la matriz es la parte inferior de la cubierta, y la parte posterior de la matriz es la parte superior de la cubierta. El proceso de repartir las cartas se puede hacer iterando a través de nuestro mazo, pero en realidad no necesitamos hacer referencia a cartas específicas en absoluto, ya que realmente no importa cuáles sean solo que la carta sea tomada de la parte superior de la baraja y entregada a un jugador Entonces, para quitar una carta de la parte superior de la baraja, podemos llamar a otra función. Este se llama Pop back. No solo devuelve el último elemento de la matriz, sino que también lo elimina de la matriz. Luego queremos agregar esta carta a la mano del jugador, y comenzaremos con el jugador uno, asumiendo que el jugador cero es el crupier. Al igual que podemos usar pop back para eliminar una tarjeta, también podemos agregar una tarjeta con retroceso La carta que estamos empujando en el dorso de la mano del jugador es la misma carta que estamos sacando del dorso de la baraja Así que simplemente podemos poner esta llamada a la función dentro de los corchetes de la llamada a la función y usar su valor de retorno como argumento a la función push. Usar pushback es exactamente lo mismo que append. La función append es un legado de cadenas, ya que generalmente se almacenan como matrices de caracteres, mientras que push y pop provienen de usar pilas o señales como lo estamos haciendo ahora Para repartir nuestra siguiente carta, tendremos que incrementar la mano a la que se reparten Así que vamos a almacenar eso en una variable como un entero y darle un valor inicial de uno. Al reemplazar el de nuestro índice de matriz con nuestra variable, tendremos que incrementarlo uno después de repartir cada carta Pero esto obviamente solo contará hasta 51, y no hay tantas manos. Entonces necesitaremos que este número vuelva a cero cada vez que llegue a cuatro. Esto se puede lograr usando nuestro operador de módulo fiduciario, asignando mano para ser módulo es igual a Pero si queremos permitir que nuestro código funcione con cualquier número de jugadores, sería mejor reemplazar cuatro con el tamaño de nuestra matriz de manos. Para ver dónde estamos hasta ahora, imprima nuestras manos iterando a través la matriz de manos e imprimiendo cada una Después imprima la cubierta. Podemos ver nuestras cuatro matrices, y la cubierta está vacía. Incluso podemos cambiar el número de jugadores y las cartas repartirán al número correcto de manos. Nuestra función ready es cada vez más grande. Podemos organizar mejor nuestro código declarando nuestras propias funciones Separando nuestra lógica en pequeños trozos, tenemos una sección que crea nuestra baraja inicial de cartas, una que crea las manos del jugador y otra que reparte las cartas Usando la palabra clave funk, podemos darle a cada uno de estos bloques de código un nombre seguido de paréntesis y Deck inicializado, inicializar manos y tratar. Entonces la función ready puede llamar a cada una de estas funciones en secuencia. Nuestras funciones también pueden aceptar argumentos, como el número de manos que queremos tener. Pasemos cuatro como argumento. Para escribir nuestra función para aceptar el argumento, necesitamos agregar un parámetro coincidente dentro de los paréntesis de la declaración de función Al igual que declarar una variable, tiene un nombre y opcionalmente también un tipo Ya que estamos usando esto para cambiar el tamaño de una matriz, es una buena idea restringirla para que sea un entero Entonces podemos usar el parámetro dentro la función de la misma manera que usaríamos cualquier otra variable. Lo último que tenemos que hacer para comenzar a jugar sería quitar todas las duplas de la mano de cada jugador. Entonces iterando por cada mano en la matriz de manos, podemos llamar a otra función para eliminar los pares de esa mano, pasando la mano como argumento Dando una definición a esta función, entonces podemos aceptar una mano como parámetro de matriz. Tendremos que iterar a través de la mano con una variable. Vamos a llamarlo tarjeta uno. Pero podemos parar antes de llegar a la última tarjeta. Entonces solo pasaremos de cero hasta el tamaño de la mano menos uno. Entonces podemos iterar una segunda vez la misma manera, pero esta vez, comenzar en la tarjeta después de la tarjeta uno y recorrer todo el camino hasta el final del tamaño de la mano Dentro de estos 24 bucles, carta uno y la carta dos ahora contienen cada par único de cartas en nuestra mano, así que podemos comparar fácilmente las dos cartas para ver si son una coincidencia. Si lo son, se pueden quitar de la mano, empezando por la tarjeta dos. Si primero retiramos la carta uno, entonces el índice de la tarjeta dos cambiaría realmente como resultado, ya que todas las cartas se moverían una posición. Si encontramos una coincidencia, no queremos continuar este bucle ni ninguno de los dos bucles. Pero queremos reiniciar de nuevo todo el proceso. Una forma sencilla de hacer esto sería con un bucle while, una variable booleana para saber si encontramos o no un par con un valor predeterminado de true Si bien se encontró un par, inmediatamente podemos establecerlo en falso. Esto nos permite ingresar al bucle pero no quedarnos aquí a menos que se encuentre un par. En otros idiomas, podrías hacer esto con un bucle do Wile en su lugar Si encontramos un par, podemos establecer la variable en true, luego también romper de ambos bucles reiniciando el bucle Wile Si ambos cuatro bucles completan sin encontrar un par coincidente, par encontrado será falso y el bucle Wa se romperá. Podemos ejecutar repetidamente nuestra simulación y ver que ninguna de las manos de nuestros jugadores contendrá nunca pares coincidentes, y los jugadores están listos para comenzar a jugar su juego del viejo Mad En la siguiente lección, usaremos otra forma de control de flujo. Te veré en la siguiente lección. 8. Combinar y devolver: Hola, amigos. Hoy utilizaremos otra forma de control de flujo para simplificar condiciones complejas. Ya he seguido adelante y creé un script llamado months y anulé la definición de nodos base de la función ready Empecemos declarando una variable para mantener el mes actual y establecerla enero y una segunda variable en enero y una segunda variable para mantener el número de días del mes, que quedará como cero por defecto Podemos imprimir una frase simple que indique que el número de días en enero es de 31. Pero primero, queremos poblar nuestra variable con el número de días basado en el valor del mes Entonces escribamos una función que pueda hacer precisamente eso. Asignar el número de días en el mes a devolver de una función que escribiremos, que aceptará el mes como argumento. Dando una definición a esta función, aceptando el mes como parámetro de tipo string, también necesita un dato más, un tipo de retorno. El tipo de valor devuelto por una función se define después de los paréntesis con un guión y un signo mayor, una flecha, seguido del nombre del tipo En este caso, es un número entero, que representa el número de días en el mes. Si no especificamos un tipo de retorno, el tipo de retorno para cualquier función que escribamos es nulo por defecto. Dentro de nuestra función, necesitamos devolver un entero, lo que significa que debemos declarar un entero en la parte superior de la misma, y tendrá que contener el número de días en el mes. Entonces en la parte inferior de la función, devolveremos el valor que se mantiene en esta variable. Entre estas dos líneas, necesitamos poblar nuestra variable con el número correcto de días basado en el mes Si el mes es enero, entonces el número de días es 31. Anteriormente aprendimos que podemos proporcionar una alternativa con la palabra clave se, pero eso solo nos brinda dos opciones de las 12 que necesitamos. Podemos usar otra palabra clave, si, abreviatura de si para proporcionar otra condición que se verificará si la condición original era falsa. Entonces si el mes es febrero, entonces el número de días es 28. Y podemos repetir esto tantas veces como sea necesario, brindando un caso para cada posibilidad. Pero muchas de estas opciones tienen el mismo resultado, ya sea 30 días o 31 días. Podríamos mejorar enormemente la eficiencia de esta declaración if combinando el resultado más común, 31 días para ser el caso predeterminado y reemplazarlos todos con una sola palabra clave else al final Si el mes no es febrero o cualquier mes con 30 días, entonces el número de días debe ser 31. Todos los casos que resulten en 30 días también se pueden combinar en una sola declaración utilizando el operador u. Si el mes es septiembre o si el mes es abril o si el mes es junio, o si el mes es noviembre, entonces el número de días es 30. Pero la declaración es bastante larga. Con más casos, podría salir de la pantalla. Para declaraciones simples caso por caso como esta, hay una palabra clave más limpia y más fácil de usar que la declaración I llamada match. Coincidir es seguido por el nombre de una variable, dos puntos y luego un bloque de código con sangría Dentro de un bloque de coincidencia, podemos especificar cualquier número de casos específicos para el valor de la variable. Empecemos con febrero. Al caso también le siguen dos puntos y otro bloque de código con sangría Este código solo se ejecutará si el valor del mes es febrero. Podemos agrupar casos juntos en una lista separada por comas. Por lo que nuestra condición de declaraciones I se puede acortar en sólo una lista de cuatro meses. Si el valor del mes es septiembre, abril, junio o noviembre, entonces el número de días se establecerá en 30, y nuestro bloque puede ser reemplazado por un comodín representado con un guión bajo, estableciendo el número de días en 31 si el valor del mes es cualquier otra cosa no especificada anteriormente Esto es lo mismo que usar default en otros idiomas. Cada uno de estos bloques de código se denominan ramas. Y en el script GD, una sentencia de coincidencia sólo ejecutará alguna vez la rama superior cuya condición se cumplió En otros idiomas, esto es similar a una sentencia switch, pero difiere en que las sentencias switch pueden ejecutar más de una rama si se cumplen múltiples condiciones. Debido a esta restricción, no es necesario incluir descansos en las ramas de partido. Si quisiéramos imprimir el número de días en cada mes, probablemente querríamos usar un bucle, pero no podemos simplemente contar o incrementar una cadena como enero para que de alguna manera se convierta en febrero Por lo que es común en código cuando se representan cosas que existen en orden secuencial ponerlas en una lista numerada llamada enumeración Una enumeración en el script GD es solo un grupo de constantes relacionadas Entonces podríamos tener una constante para enero con un valor de uno, otro para febrero con un valor de dos, etcétera Pero usando la palabra clave Enum, podemos nombrar al grupo de constantes, vamos a nombrarlo meses seguidos Dentro de las llaves, podemos agrupar las constantes, y a cada una de ellas se le asignará un número automáticamente en función de su posición en esta lista Cualquier cosa contenida dentro de las llaves no necesita permanecer en una línea y se puede dividir en cualquier formato que prefiera para que sea más legible sangría no importa aquí, pero generalmente al escribir algo encerrado en llaves, la mayoría de los codificadores sangrarán al contenido, por lo que se ve similar a por lo que Si bien prefiero que los tirantes se alineen verticalmente, muchos codificadores prefieren poner el corsé de apertura en la línea de declaración así Al igual que Constance, las entradas de enumeración nombran convencionalmente en mayúsculas de serpiente Ahora que tenemos una enumeración, el mes puede restringirse al tipo de esta enumeración También podemos asignarle un valor de la enumeración, comenzando por su nombre, seguido de un punto, luego la entrada en la lista El mes que se agrega a la salida de la cadena ya no es una cadena en sí misma y se debe convertir en una cadena antes de que pueda ser agregada. El argumento que se pasa al número de días ya no es una cadena y ahora es un mes, y podemos alterar nuestra función para aceptar un mes como parámetro también. Como mes ahora es un mes, no una cadena, necesitaremos cambiar nuestras condiciones para que coincidan usando el nombre de la enumeración seguido de un punto, luego las entradas en la lista Pero cuando imprimimos los resultados, vemos que en lugar de enero, nuestro mes está escrito como el número cero. Mientras que el tipo de nuestra variable es un mes, que es una enumeración, el valor real se trata como un entero, su posición dentro de la enumeración Dado que enero es la primera entrada, su valor como entero es cero. Febrero sería uno, etcétera. Esto nos permite modificar el valor del mes con aritmética simple, por lo que enero más uno se convierte en febrero Si envolvemos este código en un bucle que se repite 12 veces, podemos iterar a través de los 12 meses con facilidad Pero, ¿qué pasa con escribir el nombre del mes como una cadena? Podríamos hacer esto de un par de maneras diferentes. Nuestro tipo de enumeración tiene una propiedad llamada keys, que es todas nuestras entradas como una matriz de cadenas Si indexamos esta matriz usando nuestra variable entera, nos da el nombre de entrada como una cadena que coincide con ese número. Pero siguiendo la convención de nomenclatura de mayúsculas de serpiente, es posible que no queramos imprimir el nombre de esta manera Podríamos cambiar el nombre de todas nuestras claves de enumeración en el caso Pascal, o podríamos declarar una constante que contenga la matriz de cadenas, manteniendo todos nuestros nombres de meses en un formato más presentable Luego usa el mes como índice en esta matriz. Otra cosa que podemos hacer con las enumeraciones es establecer manualmente los valores de las entradas usando el operador de asignación Digamos que queremos que enero sea uno en lugar de cero. El resto de las entradas actualizarán automáticamente sus valores para incrementar a partir de una, por lo que febrero es ahora dos Pero esto ya no coincide con los índices de matriz constante. Entonces, si quisiéramos usar esto para escribir el nombre de los meses, necesitaríamos o bien sumar una entrada vacía para el índice cero, O restar una del mes ya que se está utilizando para indexar la matriz En la siguiente lección, aprenderemos más sobre cómo el motor usa y ejecuta nuestros scripts Te veré en la siguiente lección. 9. Árbol de escena y herencia: Hola, amigos. Hoy aprenderemos sobre cómo el motor utiliza el árbol de escenas para ejecutar nuestros guiones. Todavía no he adjuntado un script al nodo raíz del árbol de escenas, pero en su lugar comenzaremos esta lección agregando más nodos. Pulsando con el botón derecho sobre el nodo raíz, luego seleccionando agregar nodo hijo, siendo solo un nodo normal. Podemos renombrarlo para que sea presidente y pretender que nuestro árbol de escena es la estructura de una empresa. El nodo presidente tiene sangría porque es hijo del nodo raíz de escenas Con un nodo seleccionado, también podemos usar el atajo Control A o Comando A para agregar otro nodo hijo. Vamos a nombrar a este gerente de operaciones, y se le sangra otro nivel porque es hijo del presidente Ahora vamos a adjuntar un nuevo guión al nodo presidente y nombrarlo empleado. Anulando la definición de nodos base de la función ready, podemos simplemente imprimir el nombre de este nodo y append está Este script se puede adjuntar a más de un nodo. Adjuntemos el mismo script al nodo del administrador de operaciones arrastrándolo desde la pestaña del sistema de archivos hasta el árbol de escenas Después corre la escena para ver qué pasa. Podemos ver que el gerente de operaciones está listo, entonces el presidente está listo. Ambos nodos que tienen el script adjunto ejecutan el script, y como tienen diferentes nombres, la salida fue diferente. También podemos ver que el gerente de operaciones estaba listo antes de que el presidente estuviera listo. Para entender por qué, necesitaremos agregar más empleados. El gerente de operaciones supervisará a una serie de operadores Entonces agregaré otro nodo hijo al gerente de operaciones y le nombraré operador uno. A continuación, adjunte el guión del empleado. Podemos hacer clic derecho sobre cualquier nodo excepto el nodo raíz y seleccionar duplicado para crear una copia del mismo. El nombre de los duplicados incluirá automáticamente un número creciente, por lo que podemos tener el operador dos, tres y cuatro, etcétera Dado que el nodo que duplicamos tenía un script adjunto, las copias creadas también tienen el mismo script adjunto. Dado que los operadores tienen el mismo nivel de sangría y son todos hijos del gerente de operaciones, se les llama hermanos, y a los hermanos no se les permite tener el mismo Nuestra empresa debe tener más de un departamento, así que dupliquemos todo el departamento de operaciones duplicando al gerente de operaciones Todos los nodos hijos también están duplicados. Como los operadores no son hermanos directos, se les permite conservar sus nombres originales. Cambiemos el nombre del gerente para que sea gerente de marketing, y solo tendrán dos marketers trabajando en su equipo Los nodos principales también se pueden contraer para ocultar a sus hijos o expandirse para mostrarlos. Todos los empleados de esta empresa tienen el mismo guión de empleado adjunto a ellos. Así que vamos a correr la escena y tener una mejor idea del orden en que se ejecutarán los guiones. Podemos ver que el primer operador es el primero en estar listo, seguido de cada operador en secuencia, y finalmente, el gerente de operaciones. Lo mismo sigue para el departamento de mercadotecnia. Entonces finalmente, el presidente de la compañía es el último en estar listo. ¿Cómo decide Gadot esta orden de ejecución? El motor arranca en la parte superior del árbol de escenas y se abre camino hacia abajo, pero no considera que ningún nodo esté listo hasta que todos sus hijos estén listos. Entonces el presidente no está listo porque el gerente de operaciones no está listo. El gerente de operaciones no está listo porque los operadores no están listos. Los operadores están listos en secuencia, ya que no tienen hijos. Una vez que todos los operadores estén listos, entonces el gerente de operaciones está listo. Pero el presidente aún no está listo porque el presidente tiene otro hijo que no está listo. El gerente de mercadotecnia no estuvo listo hasta que todos los marketers estén listos, y finalmente, el presidente es el último en estar Dado que el nodo raíz no tiene un script adjunto a él, su función ready es la de un nodo predeterminado, que está vacío. Además de listo, hay otras funciones de nodo que podemos anular para ser ejecutadas más tarde después de que un nodo esté listo. El proceso más común es también precedido por un guión bajo El motor hará todo lo posible para ejecutar la función de proceso de cada nodo en el árbol de escenas 60 veces por segundo utilizando la velocidad de fotogramas predeterminada del proyecto. Así proceso utiliza un parámetro llamado Delta, que es un número de punto flotante para representar el número de segundos que han pasado desde el fotograma anterior. Entonces, la mayor parte del tiempo, será uno 60, pero no siempre. No necesitamos usar este parámetro para nada hoy, por lo que podemos continuar el nombre de este parámetro con un guión bajo, así Gudo sabe que no necesitamos usarlo y no debemos molestarlo Pero para anular la función de proceso, debe tener el mismo número y tipos de parámetros. Digamos a nuestros empleados que hagan algún trabajo en cada fotograma imprimiendo una declaración que diga su nombre adjunto a hace trabajo. Al ejecutar esta escena, vemos que todos nuestros empleados están trabajando muy duro, escribiendo sus declaraciones impresas 60 veces por segundo. Esto no es lo mismo que un bucle infinito ya que el trabajo en realidad se está haciendo de la manera en que se pretende y no se rompe nada. Hagamos esto un poco más fácil de entender al permitir que solo cada empleado haga una unidad de trabajo usando una variable Ban ha hecho trabajo con un valor predeterminado de false. En la función de proceso, si el empleado no ha realizado ningún trabajo, entonces hará trabajo y cambiará el valor a true. Una 60 de segundo después, ya que la variable es verdadera, ya no van a funcionar. Pero si declaramos esta variable dentro de la función de proceso, entonces solo existirá dentro la función de proceso y solo para una sola iteración de la misma Siguiente fotograma, cuando la función de proceso se ejecuta la segunda vez, la variable se declara nuevo y todavía por defecto es false Entonces esto no tendrá ningún efecto. Para que nuestra variable persista, necesita existir fuera del contexto de la función de proceso. Entonces lo declararemos fuera la función sin ninguna sangría Las variables declaradas aquí se pueden acceder en cualquier parte de todo el script. Este concepto se llama alcance y es una de las principales razones por las que utilizamos sangría en nuestros Así podemos ver qué variables existen dentro de qué ámbito. Ejecutando la escena ahora, podemos ver a cada uno de nuestros empleados declara que están listos para trabajar. Entonces solo una vez que todos están listos, cada uno hace una unidad de trabajo, pero ahora en un orden diferente. El orden en que los nodos del árbol de escenas ejecutan sus funciones de proceso sigue el orden exacto del árbol de escena de arriba a abajo. Los padres no necesitan esperar a sus hijos como la función lista. Es posible que queramos que todos los empleados de nuestra compañía sean similares pero no exactamente iguales. El trabajo de un gerente no es realmente el mismo que el de un trabajador. Podemos usar la herencia para crear diferentes comportamientos para objetos similares. De la misma manera estamos escribiendo scripts que extienden nodo, pero cambiando cómo se preparan y cómo procesan. Primero, necesitamos darle a este script un nombre que podamos usar como referencia, usando la palabra clave class name, seguido de un nombre que describa el comportamiento del script, generalmente el mismo que el nombre del script, pero escrito en mayúscula Pascal Ahora que el motor sabe que se trata de un empleado, vamos a crear un nuevo guión y nombrar a este gerente. Pero en lugar de heredar del nodo, esta vez podemos heredar del empleado Debido a que nuestro script de gerente extiende al empleado, todo lo escrito en el guión del empleado seguirá aplicándose a este. Pero podemos agregar más o hacer cambios. Un gerente sigue siendo un empleado, pero la forma en que trabajan es diferente. Deberíamos reemplazar el script adjunto a nuestros nodos manager por el nuevo script manager. Anulemos la definición del empleado de la función ready. Entonces, cuando un gerente esté listo, no solo dirán que están listos, sino que dirán que todo su departamento está listo. Para que nuestros dos gerentes puedan dar salida al nombre de sus departamentos, necesitarán una variable para contener el nombre de su departamento como cadena. Pero, ¿cómo podemos poblar esta variable para mantener diferentes valores para diferentes departamentos Si procedemos a nuestra declaración de variables con la etiqueta en la exportación, esta variable será accesible por otras partes del GadoEngine, es decir, el panel inspector Para que una variable sea exportada, debe declararse a nivel de ámbito de script. Seleccionando el gerente de operaciones y el árbol de escenas, ahora hay un campo en el panel inspector donde podemos darle a la variable de departamento un valor de cadena. De esta manera, el gerente de operaciones y el gerente de marketing pueden tener cada uno su propio valor para esta variable que podemos controlar fácilmente. Ejecutando la escena, podemos ver que los nodos que tienen el script de gerentes adjunto ahora declaran que su departamento está listo, mientras que los demás empleados utilizan la definición anterior en el script de empleado. La función de proceso en el script del empleado también es heredada por los gerentes y se ejecuta de la misma manera que antes. Entonces cambiemos la función de proceso de nuestro gerente. Los gerentes dirán algo diferente. Name plus gestiona a los trabajadores para hacer su trabajo. La variable ha hecho trabajo del guión del empleado también fue heredada y no necesita ser declarada aquí para ser utilizada. De hecho, no podemos declarar una variable con ese nombre ya que causaría un conflicto con la variable heredada del mismo nombre. Volvamos a correr la escena y veamos cómo nuestros gerentes ahora hacen su trabajo de manera diferente a otros empleados. En la siguiente lección, aprenderemos más sobre el uso de nodos en el árbol de escenas y principios de diseño orientado a objetos. Te veré en la siguiente lección. 10. Abstracción y encapsulación: Hola, amigos. Hoy exploraremos cómo escribir clases que sean más fáciles de usar y entender. Imaginando un automóvil como nuestro marco de referencia. Vamos a crear dos nodos en nuestra escena, un conductor y un auto como hijo del conductor. A continuación, adjunte un nuevo guión a cada uno del mismo nombre. Los autos son piezas de maquinaria muy complejas, y la mayoría de las personas que los conducen no tienen idea de cómo funcionan realmente. Sólo entienden cómo operar su auto. Comencemos en el guión del auto y le demos un nombre de clase de auto, luego agreguemos una variable para el año del auto como número entero. Otro para la marca del auto como cuerda, y otro para el modelo también como cuerda. Exportando todos estos, configuraré mi auto para que sea un Honda Civic 2007. Al crear una nueva clase, asegúrese de guardar el script antes de intentar usarlo. En el guión del conductor, el conductor necesitará una referencia al automóvil, que podemos almacenar en una variable de tipo auto. Los nodos pueden acceder a otros nodos en el árbol de escenas, mayoría de las veces sus hijos usando otra etiqueta similar a la exportación llamada on ready. Usando la etiqueta on ready, podemos asignar el valor de la variable después de que el nodo esté listo, lo que significa que todos sus hijos también están listos, pero antes de llamar a la función ready de este nodo. Podemos asignarlo al valor de retorno de una función incorporada, Get node, que acepta una ruta de nodo como parámetro. Si especificamos el nombre del nodo hijo entre comillas, ahora tenemos una referencia al nodo hijo almacenada en una variable, y podemos acceder a sus propiedades y funciones, incluidas las del script adjunto. Anulando la definición de la función ready, podemos acceder al nodo del automóvil e imprimir su año, marca y modelo La función ready se ejecuta después de las etiquetas on ready. Existe un atajo para la función get node sea más fácil, el signo de dólar, seguido de la misma ruta de nodo. Et vuelve al guión del auto y agrega otra variable. Éste especificando si el motor está funcionando o no como un booleano Como conductor, sabemos si el motor está funcionando y tenemos control sobre si el motor está funcionando o no, ya que podemos elegir arrancar o detener el motor usando la llave. Por lo que consideraríamos que esta variable es pública. Otra propiedad de nuestro auto podría ser el número de cilindros en el motor como un entero, y lo asignaré para tener un valor de cuatro. Esto es algo que el conductor no necesita saber, no puede acceder fácilmente y nunca se le debe permitir cambiar. Entonces, a diferencia de la variable pública, ésta sería considerada privada, y podemos marcarla como privada procediendo su nombre con un guión bajo En el guión del conductor, podemos establecer el valor de engine is on a true poniendo la llave en el encendido y girándola. Pero primero, deberíamos estar apretando el pedal del freno. Usemos una función para establecer presión que se está aplicando al pedal del freno, que asumiremos es de hasta un máximo de 20 kilogramos de fuerza. Entonces, para arrancar nuestro auto, probablemente deberíamos establecer la presión del freno en algún lugar alrededor de 10 kilogramos. De vuelta en el guión del auto, necesitaremos definir esta función que establece la presión del freno. Al igual que el motor está en variable, esto se llamaría función pública, ya que está siendo utilizada por otro script. Esta función aceptará un número de punto flotante como parámetro que representa la cantidad de presión que se aplica al pedal. Pero, ¿qué hace realmente el auto cuando aplicamos presión al pedal del freno? Desde la perspectiva del conductor, el conductor elige aplicar cierta cantidad de presión al pedal sin saber nunca la posición exacta. Desde la perspectiva del automóvil, la posición del pedal es lo que se mide y se utiliza para detener el automóvil. El automóvil utiliza la posición del pedal de freno para ajustar la cantidad de presión se aplica a las pinzas que sujetan las pastillas de freno contra las ruedas del automóvil, sin mencionar la complejidad de los frenos antibloqueo u otros sistemas Entonces, si realmente estuviéramos programando un auto real, necesitaríamos escribir aquí varias funciones complejas que conviertan la simple acción del conductor aplicando presión al pedal del freno a la compleja mecánica de apretar las pinzas Esto forma parte de las funciones internas del automóvil y no nada que sea controlado o accesible para el conductor a través cualquier medio que no sea aplicar presión al pedal del freno. Por lo que consideraríamos que estas son funciones privadas, ya que sólo están destinadas a ser utilizadas por el propio automóvil. Y podemos marcar nuestras funciones privadas procediendo sus nombres con un guión bajo Observe cómo esto es lo mismo que el proceso y las funciones listas. La forma en que GD Script usa variables y funciones privadas es más parecida a la forma otros lenguajes usan las protegidas en que otros lenguajes usan las protegidas, ya que son accesibles para los herederos , GDScript en realidad no hace cumplir estas reglas de privacidad Sin embargo, GDScript en realidad no hace cumplir estas reglas de privacidad y los scripts aún pueden acceder a miembros privados Estas convenciones existen únicamente para facilitar una mejor estructura y diseño de clases. Otra forma de usar comentarios en GD Script es crear regiones de nuestros scripts que estén relacionadas, usando la palabra clave region seguida del nombre de la región Podemos terminar una región usando la palabra clave y la región. Entonces hagamos una región pública y una región privada en nuestro guión de autos, separando lo que debería ser accesible para el conductor y lo que no debería. Para que las cosas sean simples, digamos que el conductor solo necesita poder encender o apagar el motor, aplicar presión al acelerador, aplicar presión al pedal del freno o girar el volante. Lo que realmente sucede dentro de cualquiera de estas funciones públicas es la mecánica interna del propio automóvil. El conductor no necesita saber cómo funciona ninguno de ellos para operar el automóvil. Por ejemplo, al presionar el acelerador, lo que realmente está sucediendo es que el automóvil abre una válvula de admisión de aire en el motor, dejando entrar más aire y oxígeno en el motor. Por lo que el automóvil necesita usar un sensor para medir la cantidad de flujo de aire y la cantidad de oxígeno que ahora fluye hacia el motor. Luego use eso para ajustar la cantidad de combustible que se inyecta en los cilindros del motor. Todas estas funciones son privadas, ya que no necesitamos saber qué hacen realmente para conducir el automóvil. forma en que nuestro automóvil se mueve estaría en la función de proceso, y necesitaremos otra variable privada llamada fase para representar en cuál de las cuatro fases se encuentra actualmente cada cilindro. En la función de proceso del automóvil, si el motor está funcionando, podemos iterar a través de cada uno de los cilindros del motor Sumando el cilindro y la fase, luego módulo cuatro, obtenemos una fase diferente para cada cilindro. Coincidiendo con este número, podemos decirle a cada cilindro que realice una fase diferente, la carrera de admisión, carrera de compresión, la carrera de combustión o la carrera de escape, aceptando cada uno el cilindro como argumento. Después aumenta la fase y vuelve al ciclo a cero cuando llega a cuatro. Cada una de estas funciones puede entonces controlar las válvulas de admisión, válvulas de escape, inyectores de combustible y bujías de cada cilindro para hacer funcionar el motor La cantidad de fuerza que producen las carreras de combustión de cada cilindro movería entonces el automóvil hacia adelante mientras las pastillas de freno intentan detenerlo y la posición del volante cambia su dirección. La posición del auto se movería entonces por la dirección, velocidad y el tiempo Delta. No te preocupes si nada de esto tiene sentido para ti porque ese es precisamente el punto de esta lección. No hace falta que lo entiendas. Dado que todo esto se encuentra en la región privada del guión, el conductor no necesita saber cómo funciona nada de esto para poder conducir el automóvil. Solo necesitan saber usar la región pública del guión. La separación de lo público y lo privado impone dos importantes principios de programación orientada a objetos encapsulación es la región pública, proporcionando acceso a variables públicas o funciones fáciles de usar y fáciles de entender, y la abstracción es la región privada, ocultando los detalles de sistemas o mecánicos complejos que no necesitan ser entendidos para ser utilizados de manera efectiva Sabrás si tus clases se adhieren a estos principios si puedes ocultar todos los contenidos privados y aún así entender fácilmente cómo está destinado a ser utilizado. Por lo que nuestro conductor ahora puede simular conducir el automóvil accediendo solo a las regiones públicas del guión del auto, desde presionar el freno y arrancar el motor hasta soltar el freno, presionar el acelerador, girar el volante, etcétera Estos principios no solo son importantes para nuestros propios scripts, sino que también nos permiten usar scripts escritos por otros desarrolladores sin comprender completamente cómo funcionan internamente. También hacen que los scripts R sean más flexibles. Imagínese si cambiáramos nuestro auto de gasolina por un auto eléctrico ¿Algo en el guión del conductor tendría que cambiar? Solo habría que cambiar el guión del auto por un guión de automóvil eléctrico, ya que todas las variables y funciones públicas seguirían existiendo en el guión de los autos eléctricos. De igual manera, también podríamos cambiar el script del conductor a un script de piloto automático, uno que solo necesita ser dado un destino y automáticamente podrá operar el automóvil En la siguiente lección, aprenderemos aún más sobre los principios de diseño orientado a objetos. Te veré en la siguiente lección. 11. Polimorfismo: Hola, amigos. Hoy cubriremos el último de los principios de programación orientada a objetos, el polimorfismo Ampliando los conceptos de herencia y abstracción, podemos escribir clases que representan un concepto más abstracto, una colección de clases más específicas que están relacionadas. Usemos animales como ejemplo creando un script llamado animal que extienda nodo, pero no necesitamos adjuntar este script a ningún nodo en el árbol de escenas. Aquí podemos darle al script un nombre de clase, luego definir propiedades y comportamientos que son comunes a todos los animales, como una variable para contener el plural del animal como una cadena, y otra para el nombre para una agrupación de este animal. Y definamos también una función para que el animal se mueva, coma o hable. Si bien podemos definir fácilmente el plural de animal como animales, no hay palabra para un grupo de animales. Tampoco podemos definir cómo se mueve o come un animal sin saber qué tipo de animal es. Por lo que los cuerpos de estas funciones pueden permanecer en blanco. Pero podríamos considerar que algunos comportamientos son lo suficientemente comunes como para que tengan un defecto, como hablar. Si bien hay muchos mamíferos diferentes que hacen una amplia variedad de ruidos, la mayoría de los animales no, incluyendo peces e insectos La mayoría de la gente no los describiría como hablando. Entonces, al decirle a cualquier animal al azar que hable, podríamos considerar que el comportamiento predeterminado es el silencio. Entonces agreguemos algunos animales diferentes a nuestro árbol de escena, empezando por un gato. Ahora podemos usar herencia, como tenemos antes para hacer cualquier número de diferentes escrituras de animales que hereden de animal como gato Luego anularemos la función ready para dar a las variables que se heredan del animal un valor apropiado para un gato. El plural serían gatos, y un grupo de gatos se llama Clouder Las funciones de comportamiento también pueden ser anuladas para cambiar el comportamiento del habla silenciosa a Los gatos caminan sobre cuatro patas para moverse, y voy a decir que comen pescado. El contenido real de estas variables y funciones no son relevantes, pero el foco está en cómo se heredan del concepto abstracto de un animal a una instancia más específica de un gato. Podemos repetir este proceso para hacer muchos más tipos diferentes de animales para agregar a nuestra escena árbol como un pájaro o un pez. Y dando a cada uno un nuevo script heredando del animal, cada uno puede proporcionar sus propios valores únicos para las variables e implementaciones de las funciones que heredaron El plural de ave es aves. Un grupo de aves se llama rebaño. Vuelan para moverse, comen gusanos y gorjean para hablar Voy a tener ventaja en mi guión de peces copiando el contenido del guión de gato. Y el plural de los peces es el pescado. Un grupo de peces se llama escuela. Ellos nadan para moverse. Comen algas, pero no hablan. Entonces, omitiendo la función de hablar, fish utilizará la definición heredada de la escritura animal para hablar Hasta ahora, todo lo que hemos hecho es usar los principios orientados a objetos que ya conocemos para heredar, abstraer y encapsular las propiedades y comportamientos de los animales Pero todo esto nos permite utilizar el polimorfismo tratando a todos los animales como si fueran iguales e intercambiables Primero, agreguemos un script al nodo raíz de nuestra escena y lo llamemos Zoo, heredando del nodo Nuestro zoológico está lleno de diferentes animales, pero no importa cuáles sean esos animales en realidad. Anulando la definición de la función ready para nuestro Zoo, podemos iterar fácilmente a través de nuestra lista de animales y tratarlos a todos como si fueran solo Una manera rápida y fácil de almacenar todos nuestros animales en una sola variable, llamémoslo animales es usar una función de nodo llamada Get children. Esto devuelve una matriz de nodos, todos los nodos hijos de este nodo convenientemente organizados en una matriz en el mismo orden que el árbol de escenas. Debido a que esto depende de los niños, debemos usar la etiqueta en on ready. Como sabemos que todos los animales tienen las mismas propiedades y comportamientos, podemos iterar a través de cada animal en nuestra variedad de animales y decirle a cada uno de ellos que hable Y a pesar de tratarlos a todos como animales, cada uno hablará a su manera única como lo definen sus propios guiones particulares o utilizará la definición heredada del animal si no tiene la suya propia. Podemos crear tantos niveles de herencia como queramos. Así que vamos a crear otro guión abstracto para mamíferos, heredando del animal Los mamíferos son una subcategoría de animales, incluyendo a todos los animales que tienen glándulas mamarias y los utilizan para cuidar a sus crías Estas son propiedades y comportamientos únicos de los mamíferos que no se aplican a otros animales. Así podemos agregar una nueva variable al guión mamífero para el número de glándulas mamarias que tiene este animal y escribir una nueva función llamada enfermera Nuevamente, los contenidos de las funciones no son relevantes para esta lección. Este script también necesitará un nombre de clase para ser heredado. Cambiando al guión del gato, ya que los gatos son mamíferos, y así podemos darle al número de glándulas mamarias un valor para los gatos, que debería ser ocho Y podemos agregar nuevos mamíferos a nuestro zoológico, también, como un mono. Los monos también son mamíferos, pero sólo tienen dos clanes mamarios Volveré a copiar el contenido de otro guión para hacer las cosas más rápidas. El plural de mono es monos. Un grupo de monos se llama tropa. Se mueven trepando árboles. Comen plátanos, y voy a decir que dicen oh. Nuestro guión del zoológico ahora puede aprovechar esta nueva estructura de herencia para aplicar condiciones únicas específicamente para animales que son mamíferos. Podemos usar directamente nombres de clase en declaraciones condicionales para decir, si el animal actual es un mamífero, entonces ejecutaremos algún código extra exclusivamente para mamíferos. Voy a imprimir algunas líneas adicionales que describen a nuestros mamíferos. Y podemos ver que nuestra salida es vez consistente para todos los animales, pero también tiene algo único específicamente para los dos mamíferos. Te puedes imaginar cómo podríamos cambiar nuestra lista de animales en nuestro zoológico para que sean cualquier tipo diferente de animales, y podríamos alterar nuestra estructura de herencia para categorizarlos con la mayor precisión que necesitemos En la siguiente lección, aprenderemos sobre otra recopilación de datos que podemos usar para agrupar información relacionada. Te veré en la siguiente lección. 12. Diccionario: Hola, amigos. Hoy usaremos una alternativa a la matriz que a veces se usa como una clase sin ninguna función llamada diccionario. Imagina una fila de casilleros como la que encontrarías en una preparatoria o un gimnasio Si declaramos una matriz de variables, podríamos considerar que el índice de matriz de cada una es el número de casilleros. Digamos que hay diez casilleros, y podemos acceder a cada casillero individual para poner algo dentro, comenzando en el casillero cero, uno, y así sucesivamente. Lo que pongamos dentro de cada casillero no importa. Puede ser un entero, float, string, booleano, nulo o una instancia de una clase Y podemos imprimir el contenido de las taquillas para verlas. Ahora imagina que cuando metemos algo en una de las taquillas, no solo cerramos la puerta del casillero, sino que también le ponemos un candado de almohadilla. Este candado requiere una combinación de números de tres dígitos para abrirse Anteriormente, si deseamos recuperar el contenido del casillero, solo necesitábamos conocer el número de casilleros, caminar hacia él y sacar el contenido. Ahora podemos ignorar el número de los casilleros, y en su lugar, necesitamos saber la combinación para abrir el candado Digamos que la combinación es 149. Como matriz, asignar algo al número 149 significaría que la matriz tendría que tener 150 casilleros Si cambiáramos el tipo de nuestra matriz a un diccionario, esto seguiría funcionando excepto que no necesitamos establecer un tamaño para el diccionario antes de poder acceder a su contenido. Observe cómo ha cambiado la salida. Los diccionarios están representados por llaves en lugar de corchetes, y cada entrada es un número que representa una clave seguida de un valor de lo que está contenido en el casillero bloqueado por esa clave Tampoco hay entradas en el diccionario para ninguna clave a la que no se le asignó un valor. Como diccionario, este número no es un índice o dirección. Es una llave que utilizamos para abrir una cerradura. Y así como el contenido del casillero puede ser cualquier tipo de datos, las claves que usamos para bloquearlas también pueden ser cualquier tipo de datos con una sola restricción Cada clave debe ser única. De lo contrario, no podemos encontrar el casillero que coincida con la llave. Entonces intentemos cerrar un casillero con otro tipo de candado, uno que use letras en lugar de números. Entonces la clave de esta entrada del diccionario es una cadena, pero su valor es un número. Todo lo contrario de este casillero, cuya clave es un número y el valor es una cadena. Bloqueemos el siguiente casillero con un candado giratorio, que requiere tres números para desbloquearlo, que podríamos almacenar en una matriz. Entonces nuestra clave de entradas de diccionario es una matriz representada por corchetes que contiene una lista separada por comas de tres enteros A lo mejor este número de cerraduras incluye un punto decimal, por lo que la llave es un flotador. Y de alguna manera este casillero está bloqueado por la fotosensibilidad y solo se puede abrir si las luces están apagadas. Entonces su clave es un booleano. Incluso podemos usar clases personalizadas como nuestras claves o valores en diccionarios. Escribamos una nueva clase para key, que no necesitará heredar de nada ya que no se adjuntará a un nodo, ni se heredará Nuestra clase clave necesita un nombre de clase y tenemos una variable que describe sus dientes. La implementación de esta clase no es relevante, pero podemos pretender que es una clave. De vuelta en el script del casillero, podemos almacenar una instancia de nuestra clave en una variable. Vamos a llamarlo clave uno de tipo key asignándolo al nombre de clase de clave Nunu crea una nueva clave, que se asigna a nuestra variable Ahora podemos usar esta clave para crear una entrada en el diccionario. También podemos crear más claves para crear más entradas. Como cada clave que creamos se considera única. La salida ahora muestra las claves como arrecife contadas seguidas de un número largo. Los nombres que hemos usado en otras clases fueron heredados del nodo. Pero como la clave no hereda del nodo, no tiene nombre Ref count es la abreviatura de objeto contado de referencia, y es la clase base para el script GD Si escribimos alguna clase que no herede nada, heredará del arrecife contado y se le asignará un número largo aleatorio Podemos ignorar esto y simplemente entender que nuestras claves son objetos contados de referencia, lo que significa que Gadot está realizando un seguimiento automático de cada instancia única de cada objeto que creamos Pero, ¿qué queremos guardar en los casilleros? Al igual que las matrices pueden contener otras matrices, diccionarios también pueden contener otros diccionarios. Coincidencia de cómo se imprimen los diccionarios, podemos crear nuestros propios diccionarios sobre la marcha usando llaves Cada entrada comienza con una clave seguida dos puntos y luego el valor que coincide con esa clave. El uso común de los diccionarios no es crear nada como este escenario de casillero, sino crear algo más como una clase. Aunque uno sin ninguna función, solo variables. Digamos que este casillero contiene un peluche, que representaremos con un diccionario. Y este peluche pertenece a un conjunto de peluches coleccionables que son similares pero variados a su manera Cada uno de los peluches es un tipo diferente de animal con un color y un nombre. Cada uno de estos pueden ser claves en el diccionario. Digamos que este casillero contiene a Bruno el oso pardo. Y el siguiente casillero contiene a Arthur el Cabra Blanca. Podemos ver nuestro diccionario peluches dentro del diccionario de casilleros. Se da la circunstancia de que el color también es una clase ya definida en Gadot Entonces, en lugar de almacenar nuestros colores como cadenas, se pueden almacenar como colores usando el color del nombre de la clase. Como puede ver, hay muchos colores predefinidos para que los usemos, y podemos decir por cómo se nombran en mayúscula serpiente, que estas son constantes de la clase de color Incluso podríamos fracasar esto y pretender que los peluches contienen una etiqueta NFC o de comunicación de campo cercano, convirtiéndolos en la llave para acceder al casillero. Y podemos poner lo que queramos dentro de la taquilla igual que antes, incluyendo otra felpa Hagamos otro peluche para guardar dentro del casillero, que se desbloquea usando Arthur como llave. Esta vez, es cutie, el elefante gris. Así que al imaginar este escenario, hay un lector NFC cerca de los casilleros, y estamos sosteniendo un plushe con una etiqueta NFC adentro, algo así como lo que podrías encontrar en una sala de escape Si sostenemos el peluche contra el lector, debemos verificar qué casillero coincide con el peluche y desbloquearlo, si algún casillero coincide. Pero si tratamos de acceder a una clave en un diccionario al que no se le ha asignado un valor, causaremos un error. la misma manera que lo haríamos si intentáramos acceder a un índice de matriz fuera de rango. Podemos verificar si un diccionario contiene una entrada que coincide con una clave específica usando la función tiene, luego pasando la clave como parámetro. Esto nos permite verificar si existe una entrada de diccionario antes de intentar acceder a su valor, evitando el error. Si el diccionario no tiene la clave, imprimiré un mensaje diferente. En lugar de definir el mismo diccionario dos veces, sería mejor almacenar en una variable y usar la variable dos veces. En la siguiente lección, exploraremos algunas técnicas diferentes que puedes usar cuando te quedes atascado o necesites más información. Te veré en la siguiente lección. 13. Depuración: Hola, amigos. Hoy repasaremos algunas estrategias diferentes que puedes usar para ayudarte cuando inevitablemente te quedes atascado. Ya adjunté un script al nodo raíz de la escena llamado debug. Probablemente hayas notado la función de autocompletar que está disponible si especificas el tipo de tus variables Esto no solo le permite ver todas las propiedades y funciones de la clase, sino que después de seleccionar una función, también puede ver los tipos de todos los parámetros de funciones para que pueda proporcionar argumentos coincidentes. A, cuando conoces los tipos de todas tus variables, esto hace que los errores de desajuste sean claramente evidentes, y se te avisará del error sin tener que ejecutarlo. Sin tipos estrictos, el motor no sabe qué es lo que no coincide hasta intentar ejecutar la línea Si quieres navegar a través de una clase incorporada como color, podemos acceder fácilmente a la información haciendo clic en cualquiera de los botones en la esquina superior derecha del panel. Online Docs abre una pestaña en tu navegador web predeterminado a la API de GADO que coincide con la versión del editor que estás usando. Aquí encontrarás información básica sobre consejos de GADO para comenzar, tutoriales detallados sobre los conceptos básicos, enlaces a la comunidad donde puedes encontrar recursos adicionales y una referencia completa de clase. Como puedes ver, hay muchas clases. Y seleccionando cualquiera de ellos, podemos ver de qué heredan y qué otras clases son heredadas Cada uno tiene una descripción de lo que hace. Enlaces a tutoriales sobre cómo usarlo, una lista de propiedades y métodos. Cuando hablamos de clases, tendemos a referirnos a las variables como propiedades y a las funciones como métodos. También hay señales, algo que Gadot usa para comunicación automática entre nodos, enumeraciones y constantes, como hemos usado Todos estos tienen sus propias subsecciones y descripciones de cómo utilizarlas. De vuelta en el Editor de GDA, buscar Ayuda abre una ventana en GDA donde se puede ver una lista de cada clase Seleccionando una clase, podemos ver toda la misma información que está disponible el sitio web de GDA en nuestro editor, para que podamos acceder a ella sin conexión Volviendo a nuestro script, incluso podemos acceder a esta información más fácilmente manteniendo presionada la tecla de control o comando que haciendo clic en el nombre de una clase, llevándonos directamente a la información de referencia para esa clase. Lo mismo se puede hacer para funciones y variables específicas. Al hacer clic sobre ellos no solo se abre la página de referencia a la clase, sino que también nos lleva a la función o variable en la que hicimos clic También hay funciones globales que podemos usar, principalmente para realizar operaciones matemáticas como clamp, por ejemplo. Si usamos esta función, podemos ver los parámetros que está esperando y podemos usarla para sujetar nuestra variable para que sea 0-1 Sostener la tecla de control o comando y hacer clic en el nombre de la función global nos permitirá acceder a la referencia de esta función, completa con una descripción y cómo usarla. Todos estos están contenidos dentro de la clase de alcance global. Bien voy a añadir otra variable y otra línea a mi guión. Si ejecutamos nuestra escena, podemos ver el árbol de escenas de la simulación en ejecución a través del panel de escena haciendo clic en el botón remoto. Este no es el mismo árbol de escenas en la pestaña local que construimos para definir la escena, algo así como un plano Este árbol de escenas es el que fue construido por el motor para ejecutar la escena. Seleccionando cualquier nodo, podemos ver sus propiedades en el inspector, y podemos ver que la función ready ya se ha ejecutado ya que los colores tienen valores diferentes. También podemos cambiar los valores de cualquiera de estas propiedades. También podemos usar print para imprimir siempre que queramos ver lo que nuestras variables tienen en cualquier momento. Y ayuda a ser lo más descriptivo posible con tus estados de cuenta impresos, así que no hay confusión sobre de dónde vienen . Pero si cambiamos las cosas y usamos la función de proceso, simplemente cambiaré el color gradualmente con el tiempo, luego agregaré una declaración de impresión aquí. Dado que esta función de proceso se ejecuta 60 veces por segundo, el valor de las sentencias print como herramienta de depuración se ve muy disminuido ya que el registro de salida simplemente va a repetir el mismo mensaje más rápido de lo que posiblemente podamos leerlo o reaccionar ante Podemos pausar la simulación mientras se está ejecutando usando el botón de pausa o presionando F seven. Esto nos permite ver el árbol de escenas remoto tal como está en este momento y revisar el contenido del panel de salida con la simulación en pausa Pero esto todavía no es muy útil, ya que se completarán varios fotogramas entre el momento en que comience la simulación y cuando podamos pausar la misma. Si hacemos clic a la izquierda de cualquier línea de código, podemos agregar un punto de interrupción automático indicado con un círculo rojo Cuando ejecutamos la escena actual, la simulación se detendrá cuando llegue a esta línea antes de ejecutarla. Esto es mucho más útil si queremos que nuestra simulación se ejecute un fotograma a la vez. Ahora podemos ver como cada fotograma el color cambia gradualmente de un fotograma al siguiente. Hagamos que nuestra función de proceso llame a otra función para realizar una tarea sencilla. Simplemente voy a cambiar el color gradualmente reduciendo su valor rojo. Entonces ahora deberíamos ver que el color cambia gradualmente cada fotograma volviéndose menos rojo y más azul. Con el punto de interrupción aún en la primera línea de la función de proceso, ejecutaré la escena Aquí se detiene, y podemos ver que la siguiente línea de código a ejecutar se indica con un triángulo amarillo. Si bien la simulación se pausa así, podemos decirle que ejecute solo una sola línea de código a la vez, en lugar de un fotograma completo seleccionando step over del menú Debug o usando el atajo F ten Esto ejecutará solo la línea de código a la que apunta el triángulo amarillo, luego hacer una pausa de nuevo de inmediato. Entonces podemos ver los cambios realizados solo por esa sola línea de código, y podemos ver el triángulo amarillo apuntando a la siguiente línea esperando ser ejecutados. Podemos seguir ejecutando nuestro script línea por línea si seguimos pisando hasta que termine la función de proceso y el frame esté completo, volviendo a la parte superior de la función de proceso para ejecutarse por segunda vez. Ahora podemos ver cada cambio individual al color a medida su valor azul se incrementa por separado de cuando se disminuye el valor rojo, pesar de que ocurren durante el mismo fotograma. En el caso de las llamadas a funciones, hay otra opción para entrar en la función. Si seleccionamos esta opción o usamos el atajo F 11, la flecha amarilla en su lugar entrará en la función que se llama y ejecutará esa línea a la vez hasta su finalización. Cuando se completa la función, la flecha amarilla vuelve a la función original para continuar ejecutándola. Usando estas herramientas, tenemos una visión muy enfocada de lo que están haciendo nuestras clases y cuándo, cómo se comportan y podemos verlas en cámara tan lenta como necesitamos para averiguar qué está yendo mal en qué momento específico en el tiempo Si no puedes resolver un problema tú mismo, la comunidad GDA es muy servicial y siempre dispuesta a echarle una mano Hay servidores de Discord para desarrolladores de GoDo, incluyendo mi servidor donde mis alumnos se ayudan unos a otros El enlace para unirte está en mi perfil. También hay foros en línea en sitios web como Redit donde también puedes hacer preguntas. Ahora tiene una comprensión básica de la mayor parte de la sintaxis de GDScrip y las herramientas necesarias para explorar estos conceptos más a Cuando estés listo, por favor pídeme un código de descuento para cualquiera de mis cursos de proyecto de juego, buena suerte. 14. Configuración: Hola amigos. Si aún no lo has hecho, necesitarás descargar el GDOGameEngine de Después extrae el contenido de la carpeta con cremallera. Asegúrate de poner esta carpeta descomprimidos algún lugar seguro en tu computadora Abre Gudo cuando estés listo. Ojalá hayas completado la introducción a la programación de series, así que tienes una comprensión básica del editor y cómo escribir guiones Haga clic en el botón más Crear para crear un nuevo proyecto. Nuestro objetivo en este curso es crear un juego completo utilizando solo nodos de interfaz de usuario en una sola escena. Puedes nombrar tu proyecto lo que quieras, como curso UI, juego UI sin nombre, o si tienes un nombre para tu juego, puedes usarlo aquí Godot creará automáticamente una nueva carpeta para su proyecto en documentos, o puede hacer clic en Examinar para cambiar la ubicación Me gusta tener todos mis GDObjects en una subcarpeta Este proyecto no implicará ningún renderizado complejo, por lo que el renderizador no importará, pero usaré la compatibilidad para poder exportar a la Web Y GODO proporciona soporte de control de versiones con él por defecto, lo cual es muy útil, y recomiendo encarecidamente aprender a usarlo para tus proyectos Dado que nuestro juego debe contener solo una escena usando nodos de interfaz de usuario, comencemos creando nuestro nodo raíz como interfaz de usuario. Los nodos de la interfaz de usuario tienen iconos verdes para que sean fácilmente identificables en el árbol de escenas. Podemos renombrar nuestros nodos haciendo clic sobre ellos después de que ya estén seleccionados o haciendo clic derecho sobre ellos y seleccionando renombrar. Vamos a nombrar esta pantalla de título de nodo. Entonces guarda esta escena en nuestro proyecto ya sea a través de la escena del menú principal, guardar escena o usando el atajo Control S o Comando S. A pesar que el nodo raíz se llama pantalla de título, tenemos la intención de hacer todo este juego en una escena Un nombre común usado en este caso para la escena sería principal, así que así llamaré Mcene Y con una sola escena, podemos simplemente dejarla en la carpeta de recursos del proyecto. Si no estás seguro de lo que quiero decir con nodos de interfaz de usuario, selecciona el nodo raíz del proyecto. Entonces echa un vistazo a sus propiedades en el inspector, expande la sección del tema, haz clic en la flecha hacia abajo junto al tema, luego selecciona nuevo tema. Esta escena ahora tiene un tema que cambiará la forma en que se muestran todos sus nodos de control. Da clic en el nuevo tema para abrirlo en el panel inferior. Ampliando este panel para obtener una mejor visión de todos sus contenidos, podemos ver una gran variedad de nodos de interfaz de usuario previsualizados Botones de etiqueta de varios tipos, texto editable, números y controles deslizantes, separadores, una barra de progreso, pestañas, un árbol y una barra de desplazamiento, todo lo cual está contenido en un panel y varios contenedores utilizados para Algunos nodos de control no están incluidos aquí, incluyendo uno que se puede usar para mostrar dos texturas D. Si aún no te has decidido por un juego para tu proyecto, trata de idear algo que podrías intentar hacer usando solo estos componentes. Ya estamos listos para comenzar nuestro nuevo proyecto de juego. En la siguiente sección, crearemos una pantalla de título básica para nuestro juego. Te veré en la siguiente sección. 15. Etiqueta A: Hola, amigos. Con nuestro proyecto iniciado, vamos a comenzar nuestro juego con una pantalla de título básica. Lo más básico que necesitamos para una pantalla de título para nuestro juego sería el título. Comencemos agregando un nuevo nodo al árbol de escenas haciendo clic en el botón más, haciendo clic con el botón derecho en el nodo raíz y seleccionando agregar hijo o usando el atajo Control A o Comando A. Para completar el desafío de usar solo los nodos de la interfaz de usuario, solo usaremos los nodos que están ordenados bajo control. Este control es también del mismo tipo que el nodo raíz de la escena. Podemos ver en la descripción que el control es la clase base para todos los controles de interfaz gráfica de usuario. Estos nodos adaptarán sus posiciones y tamaños en función de sus nodos de control padre. El control más utilizado para mostrar texto se denomina etiqueta indicada con un icono de etiqueta. También podemos ver la herencia de la clase label ya cada tipo de nodo tiene sangría por debajo del tipo del que hereda Cualquier nodo o clase que hereda de otro tendrá todas las mismas propiedades heredadas más sus propias propiedades adicionales Entonces el nodo label es un nodo, pero también es un elemento canvas, un nodo de control y una etiqueta. Cada uno de ellos viene con sus propias propiedades y comportamientos. Podemos ver que el nodo label tiene sangría debajo del nodo raíz ya que es un hijo del mismo El nodo raíz es el padre de la etiqueta, por lo que la etiqueta ajustará su posición y tamaño en función del nodo padre. Veremos lo que eso significa pronto. Cambiemos el nombre del nodo label a title y echemos un vistazo a sus propiedades en el inspector. La primera propiedad es el texto que mostrará la etiqueta. Para que podamos entrar aquí al título del juego. También hay varias opciones para controlar la alineación del texto, ajuste, justificación, separación de párrafos, recorte, elipses y tabuladores Ninguno de estos es realmente aplicable para nuestro título, excepto tal vez mayúsculas si prefiere cambiar todas las letras minúsculas por letras mayúsculas Las propiedades bajo el texto mostrado solo son aplicables para situaciones en las que hay demasiado texto para mostrarlo todo a la vez. Y las opciones de BD están disponibles para los idiomas que se muestran derecha a izquierda en lugar de izquierda a derecha. Nada de esto es importante para el título de nuestro juego. Presionemos Reproducir y veamos nuestro título mostrado. Como no se ha seleccionado ninguna escena para la escena principal de este proyecto, se nos pide configurarla. Pulsa select current para establecer esta escena como la escena principal del juego, y podremos ver nuestra ejecución del juego, mostrando el título en la esquina superior izquierda de la ventana. Presiona el botón de parada para finalizar esta simulación. Esto funciona, pero no es muy bueno. Probablemente queremos mover el título y aumentar su tamaño. Mirando más a fondo las propiedades del nodo label, estas son todas las propiedades del propio nodo label, pero hay más secciones de propiedades si nos desplazamos hacia abajo. La siguiente sección contiene todas las propiedades que el nodo de etiqueta hereda del control Si ampliamos la sección de diseño, luego la sección de transformación, podemos ver las propiedades de tamaño y posición del nodo de etiqueta. Si no puede ver este rectángulo en su vista de dos D, ajústelo hasta que pueda usar la rueda del mouse para desplazarse y hacer zoom. Este rectángulo azul es el área de visualización del juego ya que se renderizará cuando ejecutemos el juego. Observe cómo el eje X rojo se solapa con la parte superior del rectángulo azul haciéndole parecer magenta El eje Y verde se superpone al lado izquierdo, haciéndolo cian, y el punto de origen de la escena está en la esquina superior izquierda Si hacemos clic y arrastramos el título lejos de la esquina superior izquierda, sus valores de posición X e Y en el inspector se actualizan para reflejar su nueva posición. Observe cómo al mover la etiqueta hacia abajo aumenta la posición Y y al moverla hacia arriba la disminuye. Pongamos el título en algún lugar alrededor del centro de la pantalla. Después presiona el botón de reproducción para ver el cambio. El título ahora se muestra en el centro de la pantalla. Pero, ¿qué pasa si cambiamos el tamaño de la ventana? La posición del título viene determinada por su distancia desde la esquina superior izquierda de la ventana. Entonces, si lo hacemos más grande o menor, el título ya no está en el centro de la ventana. Presiona el botón de reinicio para devolver la etiqueta al origen, posición 00. Probablemente hayas notado la X verde en el origen al seleccionar el nodo de etiqueta. Se trata de cuatro anclajes, todos apuntando a la misma posición Cambiemos el modo de diseño del nodo de etiqueta de la posición a los anclajes. Esto agrega otra propiedad llamada anchor presets, que podemos cambiar Si cambiamos los presets de ancla a full wreck, esto es lo mismo que el nodo raíz con un ancla en cada esquina Si seleccionamos el nodo raíz, los anclajes están todos apuntando a diferentes esquinas de la pantalla R seleccione el nodo de etiqueta. El resto de las opciones anclarán la etiqueta a diferentes ubicaciones de la pantalla en esquinas centradas o estiradas en un eje a lo largo de la pantalla. Anclemos el título al centro de la pantalla. Ahora, si presionamos Reproducir, luego redimensionamos la ventana, el título permanece centrado aunque cambie el tamaño de la pantalla También puede personalizar cómo estos anclajes afectan al nodo cambiando los ajustes preestablecidos de anclaje a personalizados Esto nos permite cambiar los puntos de anclaje, definiéndolos como porcentajes del ancho o alto de la pantalla. Dado que los anclajes se muestran apuntando a las esquinas, cada una de estas configuraciones de punto de anclaje afectará a dos anclajes Estoy bien con mantener el título centrado horizontalmente, pero preferiría que se moviera ligeramente hacia arriba hasta aproximadamente un tercio de la pantalla. Ajustando el punto de anclaje superior a un tercio, los anclajes superior izquierdo y superior derecho se mueven hacia arriba. También estableceré el punto de anclaje inferior en un tercio, así que todos los anclajes apuntan a la misma posición Y los desplazamientos de anclaje se pueden usar para desfasar la posición del nodo desde el punto de anclaje por cantidad establecida Esto puede llevar a que el tamaño del nodo sea mayor que el texto, por lo que la propiedad de alineación de la etiqueta afectará dónde se dibuja. Estoy bien con tener la etiqueta centrada en el punto de anclaje, así que restableceré todos mis desplazamientos de ancla a cero La dirección de crecimiento afectará cómo se reposiciona el nodo en relación con el punto de anclaje en función de su tamaño Si se le dice que crezca a la izquierda o a la derecha, arriba o abajo, podemos ver cómo el nodo redimensiona y se reposiciona para acomodar el texto Un título de juego a menudo tendrá una fuente y un tamaño de fuente únicos de cualquier otra cosa en el proyecto. En casos como estos, podemos ignorar el tema que creamos en la primera lección y en su lugar expandir la sección de anulación de tema de las propiedades de control. Antes de que podamos cambiar la fuente, necesitamos importar una fuente al proyecto. Descargué esta fuente de Google Fonts. Podemos importar archivos al proyecto arrastrándolos a la ventana del Editor de Godot Ahora podemos establecer esto como la fuente para el título. También podemos cambiar el tamaño de la fuente. Voy a poner el mío a 49. Los estilos no se utilizan a menudo para las etiquetas, pero para demostrarlo, podemos agregar una caja de estilo plana para agregar un color de fondo a la fuente. Al hacer clic en el cuadro de estilo nos permite cambiar el color entre muchas otras opciones. Como dije antes, esto no es realmente algo que se use a menudo para etiquetas, y pronto repasaremos las cajas de estilo con más detalle. Eliminaré el cuadro de estilo de mi etiqueta de título haciendo clic en el botón de reinicio. En su lugar, agregaré anulaciones de tema para el color de fuente, color de sombra y color de contorno, haciendo que la fuente sea blanca y la sombra transparente A continuación, agregue constantes para los desplazamientos de sombra, contorno y tamaño de contorno de sombra Dado que el título es sólo una línea, el interlineado no tendría ningún efecto. Como se mencionó anteriormente, los nodos de control padre afectan el tamaño y la posición de sus hijos. Como vimos antes, el nodo de la pantalla de título está anclado al rectángulo completo del área de visualización Pero si la redimensionamos, sus hijos volverán a calcular sus tamaños y posiciones para que se ajusten al tamaño y posición de En este caso, el título permanece centrado horizontalmente y un tercio desde la parte superior del área de la pantalla de título. Podemos restablecer esto de nuevo a la forma en que estaba restableciendo los anclajes de la pantalla de título Ahora tenemos el título de nuestro juego mostrado en nuestra pantalla de título. En la siguiente lección, agregaremos un fondo. Te veré en la siguiente lección. 16. Etiqueta B: Hola, amigos. Antes de pasar a las texturas, podemos explorar un poco más de lo que las etiquetas tienen para ofrecer. Ninguno de los cambios realizados en esta lección será seguro para el proyecto, y simplemente volveré al final de la lección anterior antes de continuar Cualquier video titulado B seguirá esta regla, proporcionando solo información adicional sobre el tema anterior, pero se puede omitir Seleccionando el nodo label, tenemos una propiedad llamada label settings. Al igual que el recurso temático de la primera lección, aquí podemos crear un nuevo recurso de configuración de etiquetas, pero solo afectará a esta etiqueta. Al crear este recurso de configuración de etiquetas, ignoraremos las anulaciones de tema y usaremos estas configuraciones en su lugar Aquí podemos cambiar todos los mismos ajustes que están disponibles en el tema, espaciado, fuente, tamaño de fuente, color, contorno y sombra. Et's agrega una segunda línea de texto al título. Si por alguna razón, el tamaño de un nodo de etiqueta es mayor que el texto, las propiedades de alineación determinarán dónde se dibuja el texto, ya sea a la izquierda, centro, derecha o llenando todo el ancho, arriba, abajo, etcétera Si el texto es demasiado largo para caber dentro del ancho designado del nodo de etiqueta, podemos usar el modo Auto rap para cambiar la forma el texto se mueve automáticamente a la siguiente línea. Arbitrario simplemente se cortará en cualquier carácter que se encuentre al final del ancho de la etiqueta Word intentará envolver espacios entre palabras, y word Smart romperá una palabra si no encaja en una sola línea. Si el significado de alguna propiedad no es obvio y desea una explicación más detallada, pasar el mouse sobre el nombre de la propiedad proporcionará una información sobre herramientas Voy a usar algo de Lormipsum como texto de marcador de posición para explicar los siguientes ajustes Los indicadores de justificación se pueden usar para cambiar la forma en que se implementa la alineación del texto de relleno. A partir de la versión 4.4 de Gudo, podrás cambiar el nuevo carácter de línea a lo que quieras El texto de recorte se puede utilizar para evitar que cualquier texto se dibuje fuera de los límites del nodo de etiqueta. Si el texto clip está activado, entonces el comportamiento de desbordamiento del texto se puede cambiar para alterar la forma en que se implementa el recorte Recortar caracteres o palabras incluso añadiendo elipses para reemplazar caracteres o palabras El carácter de puntos suspensivos también se puede cambiar a lo que quieras Normalmente, los caracteres de tabulación en el área de texto se ignoran cuando la etiqueta renderiza el texto, pero también puedes agregar tabuladores a tus etiquetas. Al hacer clic en la matriz de flotación empaquetada 32 para expandirla. Haga clic en el botón más agregar elemento para agregar una tabulación. Después establece el valor como un número decimal. pueden usar múltiples tabulaciones para ordenar la creación de gráficos o columnas dentro del nodo de etiqueta. Volviendo a orm Ipsum para ayudar a demostrar el texto mostrado, si tenemos una gran cantidad de texto en un nodo de etiqueta, entonces podemos personalizar la cantidad de texto que se dibuja usando estas propiedades Las líneas omitidas ocultarán líneas de texto comenzando por el principio, mientras que las líneas máximas visibles ocultarán líneas de texto comenzando por el final Negativo se utiliza para significar ilimitado en este contexto. Los caracteres visibles se pueden utilizar para controlar el número exacto de caracteres que se dibujarán. Esto está directamente ligado a la propiedad de relación visible, que es lo mismo, pero expresada como un porcentaje de todo el texto. Cambiar un valor cambiará el otro automáticamente. Si se están utilizando tanto la visibilidad de caracteres como el ajuste de palabras, entonces la forma en que se implementa el ajuste de palabras se puede cambiar usando el comportamiento de caracteres visibles. Por ejemplo, esta palabra no cabría en la primera línea si estuviera toda dibujada, sino que encaja sólo por el número de caracteres visibles. Cambiando el comportamiento de los caracteres visibles a caracteres después de dar forma, la palabra se envuelve a la segunda línea independientemente de si es o no completamente visible. La configuración de diseño de glifo solo se usa si la dirección de diseño se establece de derecha a izquierda, y la configuración de BD es para idiomas específicamente escritos de derecha a izquierda Ahora volveré el proyecto a la forma en que era antes de esta lección Esas son todas las opciones de etiqueta. En la siguiente lección, pasaremos a la textura Rx. Te veré en la siguiente lección. 17. Textura recta: Hola, amigos. En la lección anterior, agregamos un título a nuestra pantalla de títulos. En esta lección, agregaremos una imagen de fondo. Encontré esta imagen que creo que se adapta muy bien a mi idea de juego en pic.com gratis hecho por UpClac Asegúrese de verificar los requisitos de atribución y licencia de los activos que encuentre en línea antes de usarlos. He descargado esta imagen y la importaremos a Gadot para poder usarla como fondo de mis pantallas de título Para evitar que la carpeta de recursos de mi proyecto se desordene demasiado y se desorganice, crearé una carpeta para Después dentro de esa carpeta, crea otra para diversiones Después arrastra cada archivo a la carpeta correspondiente para que sepa dónde encontrarlos. Para dibujar esta textura, necesitaremos agregar un nuevo nodo hijo a nuestra escena. El nodo que necesitamos usar para dibujar imágenes en pantalla es el nodo destrozado de textura Vamos a renombrar este fondo de nodo. Después poblar su propiedad de textura con la imagen importada Ya no podemos ver el título. La imagen se está dibujando sobre él. Por defecto, cada nodo del árbol de escenas se dibuja de arriba a abajo. Entonces se está dibujando primero el título, luego se está dibujando el fondo sobre él. Podemos reorganizar nuestros nodos fácilmente arrastrándolos. Por lo que el fondo está ordenado por encima del título en el árbol de escenas. De esta manera, el título se dibuja sobre el fondo. Esta imagen es mucho más grande que el área de visualización de nuestro juego. Queremos que la imagen de fondo cubra toda la pantalla, así que cambiaremos sus presets de anclaje a full wrecked Esto mueve la imagen para que quede centrada dentro de los cuatro anclajes, pero sigue siendo demasiado grande. Si cambiamos el modo de expansión del nodo de textura destrozada, podemos decirle que ignore el tamaño de la textura y en su lugar use el tamaño que especifican los anclajes Ahora la imagen cubre toda el área de visualización, aunque la relación de aspecto de la imagen no coincida exactamente con la relación de aspecto del área de visualización. Es difícil de decir con esta imagen, pero ahora está distorsionada, siendo estirada verticalmente Existen otras opciones para forzar a la imagen a cambiar el tamaño para ajustarse al ancho, ignorando la altura de la imagen, adecuada para encajar en una disposición horizontal o ajustar la altura, ignorando el ancho de la imagen, mejor para encajar dentro de una Cualquiera de las opciones proporcionales intenta hacer lo mismo que las opciones anteriores, pero también mantener la relación de aspecto de las imágenes. Con el ancho de ajuste proporcional, la imagen cubre toda el área de visualización mientras mantiene su relación de aspecto. A continuación, tenemos las opciones de modo stretch, por defecto a escala, lo que permitirá que la imagen se estire de cualquier manera que sea necesaria para satisfacer las demandas del modo de expansión y anclajes El modo de mosaico es para imágenes que son más pequeñas que el tamaño proporcionado. Entonces, cambiemos la imagen por el ícono de Gudo. Ahora el área está llena de mosaicos de la imagen. Deshaciendo este cambio, keep ignorará el modo de expansión y obligará la imagen a mantener sus dimensiones originales y alinearla con la esquina superior izquierda Mantener centrado también mantendrá las dimensiones originales de la imagen, pero el centro dentro de su área. Mantener el aspecto permitirá que la imagen se encoja o crezca para caber dentro del área. Volviendo a Ignorar tamaño, ya que las relaciones de aspecto no coinciden, la imagen no cubre toda la pantalla. Mantener el aspecto centrado hace lo mismo, pero también centra la imagen dentro del área. Mantener el aspecto cubierto cambiará el tamaño de la imagen, manteniendo su relación de aspecto, pero se asegurará de que cubra toda el área Entonces ahora se están recortando los bordes izquierdo y derecho de esta imagen Si quieres asegurarte de que se muestre toda la imagen, probablemente usarías mantener el aspecto o mantener el aspecto centrado y cambiar el color de fondo para llenar el área no utilizada. Si no te importa recortar los bordes, usar mantener el aspecto cubierto también es una buena opción para las imágenes de fondo Los alternadores flip horizontal y flip vertical simplemente voltearán la imagen si eso es algo que deseas hacer Presionemos play y veamos cómo se ve. Recuerda que si cambiamos el tamaño de la ventana del juego, los anclajes cambiarán y afectarán la forma en que se dibuja la imagen Y si bien la imagen se escalará para que se ajuste a la ventana, el título sólo se reposicionará, ya que se está dibujando a un tamaño de fuente específico Pero podemos cambiar algunos ajustes para tener más control sobre este comportamiento. En el menú principal, seleccione la configuración del proyecto. Luego busque debajo de la pantalla para ventana. Aquí podemos editar las dimensiones de nuestra ventana gráfica, cambiando las dimensiones de la ventana del juego cuando ejecutamos el juego, y también las dimensiones del rectángulo azul en el editor Es una buena idea establecer esto para que coincida con las dimensiones de su plataforma de publicación objetivo. Los anclajes aún no se han actualizado, pero al seleccionar o cambiar el tamaño de los nodos los obligará a actualizarse, y podemos restablecer sus presets de anclaje a rect completo Yo podemos cambiar si el juego se abre o no en una ventana o en pantalla completa, pero no cambies esta configuración hasta después de que tengas alguna forma de salir de tu juego También puede cambiar dónde se mostrará la ventana en pantalla configurando el tipo de posición inicial en absoluto, luego cambiando las coordenadas de pantalla para la ventana. Y también en qué pantalla se mostrará cambiando el tipo de posición inicial al centro de otra pantalla, luego especificando el índice de pantallas. Estas opciones solo funcionarán en un proyecto exportado, no cuando las ejecutemos en el editor. Podemos hacer que la ventana no tenga bordes. E incluso cambiar si se puede cambiar el tamaño de la ventana o no. Esta es una forma en la que podríamos solucionar el problema, pero no una solución muy flexible. Los ajustes bajo estiramiento proporcionan mejores alternativas. Podemos cambiar el modo stretch de todo el juego de desactivado a objetos de Canvas. Recuerda que todos los nodos de control heredan del elemento Canvas, por lo que todos se estirarán con la ventana Existe otro ajuste para estirar toda la ventana gráfica, que incluirá la salida de tres cámaras D. Al realizar este estiramiento, podemos cambiar si la pantalla del juego mantendrá o no su relación de aspecto. Ignorar permitirá que el juego se aplaste y estire de cualquier manera Mantener el ancho o mantener la altura permitirá que la ventana del juego escale solo tanto como lo permita el ancho o la altura. Expandir permitirá que la pantalla de los juegos crezca y se reduzca, manteniendo aún la relación de aspecto, pero se expandirá para llenar toda la ventana. escala se puede usar para reducir automáticamente todos los artículos de lienzo a la mitad de tamaño o hasta ocho veces su tamaño. Útil para desarrollar plataformas que tienen resoluciones drásticamente diferentes su máquina de desarrollo Y el modo de escala se puede establecer en entero para restringir el escalado a solo dividir o multiplicar por números enteros Esto es particularmente útil para pixel art ya que no causará ninguna distorsión de píxeles, intentando estirar o encoger píxeles en cantidades fraccionarias Los ajustes de orientación de la mano están disponibles para el desarrollo móvil para restringirlos a vertical, horizontal, invertido o usar el sensor del dispositivo para determinar la orientación. Y el modo VSync se puede cambiar para determinar cómo se sincroniza la GPU de la máquina con la frecuencia de actualización de la pantalla Estos ajustes no están disponibles al usar el renderer de compatibilidad y no serán aplicables a nada de lo que hagamos en este proyecto Ahora tenemos una imagen de fondo para nuestra pantalla de título. En la siguiente lección, agregaremos un botón de inicio. Te veré en la siguiente lección. 18. Botón A: Hola, amigos. En la lección anterior, agregamos una imagen de fondo a nuestra pantalla de título, y en esta lección agregaremos un botón de inicio. Añadiendo un nuevo nodo a la pantalla de título, tal como lo hemos hecho antes, esta vez estamos buscando el nodo botón. Similar al nodo de etiqueta, un botón puede contener texto, pero también un icono. Vamos a nombrar los botones de inicio. Después también ponga el mismo texto en el campo de texto, por lo que se mostrará en el botón. También hay un campo de iconos, que podemos poblar con el icono de Gadot para ver cómo funciona El botón se dibuja como un rectángulo redondeado que abarca tanto el texto como el icono proporcionado El toggle plano elimina cualquier textura o color del botón, dibujando solo el texto y el icono. Sin embargo, todavía se puede hacer clic en toda el área de botones, y todavía hay un estilo de enfoque en el botón que se dibujará cuando tenga enfoque Ampliando las secciones de comportamiento del texto y comportamiento del icono, podemos cambiar la alineación del texto y el icono para cambiar la forma en que se muestran en el botón. Estos cambios son mucho más evidentes si el tamaño del botón es mayor de lo necesario para acomodar tanto el texto como el icono. Algunos de los mismos ajustes de comportamiento están disponibles como el nodo de etiqueta para controlar el desbordamiento de texto Envoltura automática. Y recorte si el tamaño del botón es demasiado pequeño para acomodar el texto Y el icono se puede ampliar para llenar el tamaño del botón. Las opciones de BD también están disponibles para idiomas que se escriben de derecha a izquierda. El botón base es una clase de la que heredan todos los botones, incluso botones de otro tipo Repasaremos estos ajustes en la lección de botones B. Por ahora, editemos las propiedades heredadas del control, comenzando por el layout. Me gustaría que mi botón de inicio estuviera por debajo mi título a dos tercios de la altura de la pantalla. Entonces cambiando el modo de diseño de posición a ancla, cambiaré los ajustes preestablecidos de anclaje a personalizados Después mueve el anclaje izquierdo a 0.5 y el anclaje superior a 0.667 El anclaje derecho no puede estar más a la izquierda que el ancla izquierda, por lo que se cambia automáticamente al mismo valor. Asimismo, el anclaje inferior no puede estar por encima del anclaje superior. El botón está actualmente al fondo y a la derecha del ancla, así que voy a cambiar las direcciones de crecimiento a ambos. Luego reinicie los desplazamientos de anclaje para centrar el botón sobre el punto de anclaje Con el botón posicionado, el siguiente paso sería editar sus propiedades de tema. Si quieres que el botón sea único, entonces sería apropiado usar la sección de anulación de tema para este botón. Pero si quieres que varios botones compartan las mismas propiedades del tema, sería mejor solo tener que establecerlos una vez. Seleccionando el nodo raíz, creamos un tema en la primera lección, o puedes crear uno ahora si aún no lo has hecho. Cambiemos la fuente y el tamaño de fuente predeterminados para nuestro tema, y podremos ver los efectos de este cambio en la vista previa del tema. Si bien este tema es una propiedad del nodo raíz, no del botón, realizar cambios en este tema también afectará al botón. Esto se debe a que el tema se transmite a través del árbol de escenas de padre a hijo en otra forma de herencia. Si un nodo usa propiedades de anulación de tema como el título, entonces esta configuración anulará las propiedades heredadas del tema. Echando un vistazo al panel de temas, nuestra vista previa del tema contiene un nodo de botón con las propiedades predeterminadas del tema, excepto que la fuente y el tamaño se han cambiado a la nueva configuración. Al hacer clic en el botón Más, podemos agregar tipos de nodos al botón Me gusta del tema. Esto agrega varias propiedades que podemos agregar al tema y editar. Comenzando en la sección de color, podemos cambiar el color del texto y el icono mientras el botón está en diferentes estados. El color de fuente normal de los botones necesita contrastar con su fondo. Solo usaré el gris claro predeterminado. A menudo un botón deshabilitado tendrá texto gris, a veces incluso transparente. Los botones que se ciernen podrían aclarar el color. Prensado es a veces más oscuro, y también voy a añadir un color de contorno. Todas las mismas opciones de color también están disponibles para el icono, que se multiplicarán por los colores de la textura del icono para producir el resultado. En la sección constante, podemos agregar la cantidad de píxeles que separan el texto y el icono cuando están alineados horizontalmente. Además de un ancho máximo para el icono, la altura del icono se ajustará automáticamente manteniendo su relación de aspecto. Y también podemos especificar el tamaño del contorno para el texto. Aún no hemos cubierto cajas de estilo, pero si se usan cuadros de estilo de diferentes tamaños, puede agregar esta propiedad y establecer su valor en uno para forzar al botón a usar siempre el tamaño de su caja de estilo más grande. Podemos cambiar la fuente para todos los botones si queremos, pero solo usaré mi fuente de tema predeterminada. Sin embargo, haré que el tamaño de fuente para mis botones sea un poco más grande que mi tamaño de fuente predeterminado. En la sección de iconos, podemos especificar un icono predeterminado para usar para todos los botones. El icono establecido en las propiedades de los botones anulará este icono si se proporciona. Entonces, si quieres que la mayoría de los botones tu juego tengan el mismo ícono, lo configurarías aquí. Pero también podrías tener botones especiales con íconos únicos, también. La siguiente sección es para estilos, donde podemos dibujar un fondo diferente para el botón, que no sea el rectángulo curvo negro transparente predeterminado . Empezando por lo normal, así es como se ve el botón cuando no está haciendo nada. Agregándolo al tema, tenemos múltiples opciones de cómo proporcionamos estilos. La textura de estilo boox se utiliza para dibujar imágenes importadas para usar como fondo de botones Tengo estas imágenes de botón las cuales voy a importar a Gadot con la carpeta de activos ya seleccionada De esa manera, se importan automáticamente a esa subcarpeta Haga clic en el cuadro de estilo para abrirlo en el inspector. Luego establece la textura normal en la caja de estilo normal. No quiero modificar la textura de ninguna manera, pero el texto y el icono realmente no encajan bien en la imagen de fondo. Entonces agregaré márgenes de contenido para forzar el ícono y textura lejos de los lados hacia el interior plano del botón. Pasando al estilo prensado, podemos agregar otra textura de caja de estilo. Pero esta vez poblar la textura con la imagen presionada del botón Luego agrega los mismos márgenes de contenido de forma normal. Y repita esto para agregar deshabilitado y rondado. No tengo una textura única para la prensa Hover, pero podemos duplicar rápidamente un cuadro de estilo haciendo clic y arrastrando el de presionado a la ranura Seleccionando el botón en el árbol de escenas, podemos previsualizar cómo se ve el botón cuando está deshabilitado marcando el toggle deshabilitado en las propiedades heredadas del botón base. ejecutar el juego, también podemos ver el cambio de estilo del botón al pasar el cursor sobre él y presionarlo. No obstante, una vez pulsado, el botón ahora tiene foco, lo que le da este borde blanco. Si quieres eliminar esto, puedes proporcionar otra caja de estilo para enfocar. O alternativamente, podemos simplemente agregar una caja de estilo vacía para eliminarla. Este botón aún no hace nada, pero tendremos que esperar otra lección. Ahora tenemos un botón de inicio para una pantalla de título. En la siguiente lección, agregaremos enlaces de redes sociales. Te veré en la siguiente lección. 19. Botón B: Hola, amigos. Antes de seguir adelante, repasaremos algunas características más de los botones. Recuerda que ninguno de los cambios realizados durante esta lección se guardará. Cubrimos la propiedad para discapacitados de la clase botón base, pero hay muchas más propiedades listadas aquí. modo Toggle convertirá el botón en un toggle, lo que significa que una vez que se presiona, permanecerá presionado hasta que se vuelva a presionar. botón pulsado se puede usar para establecer el estado predeterminado del botón mientras se usa como alternancia. Si no es una palanca, el botón no se puede configurar para presionar. Podemos cambiar si se considera que el botón está presionado cuando se suelta el botón del mouse o cuando se presiona por primera vez el botón del mouse. Y también especificar qué botón del ratón se está utilizando para hacer clic en el botón. Si mantener pulsado afuera está activado, entonces hacer clic en el botón y mover el mouse fuera de los límites del botón mantendrá su estado presionado hasta que se suelte el botón del mouse. puede crear un grupo de botones para convertir un botón de alternar en un botón de opción, lo que significa que solo se puede presionar un botón a la vez. Veremos cómo funciona esto cuando lo usemos en una sección posterior. Y por último, al botón se le puede asignar un atajo. Usemos la tecla Enter como atajo para presionar este botón. Ampliando el atajo haciendo clic en él, podemos ver que contiene una lista de eventos, que también necesitamos hacer clic para expandirlo. La lista está vacía, por lo que tiene un tamaño de cero. Pero podemos hacer clic en el botón más agregar elemento para agregar un evento a esta lista. Al hacer clic en el menú desplegable, utilizaremos una tecla de evento de entrada para reaccionar ante el jugador presionando una tecla en su teclado. Al hacer clic en la tecla de evento de entrada para expandirla, aquí hay muchas más propiedades, pero solo necesitamos presionar el botón configure para abrir una ventana de configuración de eventos. Esta ventana está escuchando activamente los eventos de entrada, por lo que al presionar cualquier tecla del teclado la seleccionará automáticamente. También podemos agregar el requisito de que mantengan presionadas otras teclas como Mayús Alt, control, ventanas o detectando automáticamente la tecla de control o comando en función del sistema operativo del usuario. Presionando Bien, llenará la información requerida para nosotros. retroalimentación de acceso directo cambiará si el estilo del botón cambia cuando se usa el acceso directo, y el acceso directo y la información sobre herramientas agregarán automáticamente una información de herramienta al botón que muestra el acceso directo. Dejando ambos puestos, veamos cómo se ve. el cursor sobre el botón, la punta de la herramienta nos dice que Enter es una tecla de método abreviado para presionar este botón Al presionar la tecla enter en el teclado también se presiona el botón. Si desactivamos estas opciones, se elimina la punta de la herramienta, y aunque la tecla enter sigue siendo un atajo, no proporciona retroalimentación visual que se está presionando el botón. Seleccionando el nodo raíz y echando otro vistazo a las opciones de textura de la caja de estilo para nuestro botón. Cambiaré mi textura con el ícono de Gadot por demostración Los márgenes de textura se pueden agregar para crear una rebanada de nueve. Se pueden redimensionar convenientemente nueve texturas de rebanadas con las esquinas de la imagen conservando su tamaño original, estirando los bordes a lo largo de un solo eje y estirando el interior a lo largo ambos ejes para llenar el espacio adicional forma en que se implementan estos estiramientos de ejes se puede cambiar en los ajustes de estiramiento del eje, ya sea estirando la imagen, alicatándola o una combinación de alicatado y estiramiento para intentar eliminar las costuras Los márgenes de expansión se pueden usar para hacer la caja de estilo sea más grande de lo que normalmente debería permitir su área, expandiéndola en cualquiera de las cuatro direcciones. La subregión se utiliza para cortar hojas de sprites en texturas individuales Al hacer clic en el botón Editar región se abre una ventana del editor de regiones. Esta ventana permite hacer clic y arrastrar para elegir la región, ajustando los bordes y esquinas según sea necesario Hay opciones para el ajuste de píxeles para una mayor precisión cuadrícula si su hoja de sprites un tamaño y un espacio uniforme, puede especificar el tamaño de cuadrícula y el desfase para que coincida con la hoja de sprites Luego selecciona una o más celdas de cuadrícula para formar tu textura. O el corte automático encontrará automáticamente las texturas por usted, y solo puede seleccionar una haciendo clic en ella. Modulate también puede multiplicar toda la textura por otro color, ajustándola a un color diferente Esto se usa a menudo para agregar tinte, o si tu textura es completamente en escala de grises, entonces la modulación se puede usar como la principal fuente de color, creando una amplia variedad de cuadros de estilo de colores a partir de una sola textura Otras opciones también están disponibles para crear cuadros de estilo en el editor de temas. Todas las demás opciones de cuadro de estilo también tienen las mismas opciones de margen de contenido que la textura de la caja de estilo. Style boox empty no dibujará nada y no tiene propiedades únicas Mientras que la línea Stylebox dibujará una sola línea horizontal a través de la parte superior del botón Al hacer clic en la línea Stylebox, podemos cambiar el color de la línea Grosor. Cambie a vertical y haga crecer la línea en cualquier dirección. El uso de valores negativos aquí encogerá la línea. Cuadro de estilo plano dibujará un simple rectángulo coloreado. Al hacer clic en la caja de estilo plana, podemos cambiar su color y sesgarla en cualquier dirección Si agregamos un ancho de borde, entonces también podemos cambiar el color del borde. Y mezcla el borde en el fondo del botón. Al alternar el centro de dibujo se eliminará el fondo para dibujar solo el borde Si agregamos radio de esquina, entonces el rectángulo se curvará como lo hizo por defecto. Y podemos cambiar cuántos bordes se calculan para crear las esquinas curvas con la propiedad de detalle de esquina. Podemos agregar una sombra detrás del botón, cambiar su color, tamaño y desplazarlo en ambas direcciones también. Y el anti aliasing se puede desactivar, o podemos cambiar su tamaño para que los bordes se vean más suaves Eso cubre todas las propiedades de los botones y opciones de cuadro de estilo. En la siguiente lección, agregaremos enlaces de redes sociales. Te veré en la siguiente lección. 20. Botón de enlace: Hola, amigos. En la lección anterior, agregamos un botón Inicio a nuestra pantalla de título. En esta lección, agregaremos enlaces de redes sociales. Empecemos por agregar una nueva nota al árbol de escenas. Esta vez, se trata de un botón de Enlace. Nombraremos a este nodo después de la plataforma de redes sociales, en mi caso, Patrón. Después también rellena el campo de texto con la misma información Copiando y pegando el URI deseado en el campo, no se requiere nada más para que el botón Enlace haga exactamente lo que esperamos Ejecutando el juego, podemos dar click en este botón de Enlace para abrir una ventana del navegador al URI que especificamos. La opción de subrayado nos permite cambiar si el texto está siempre subrayado, solo cuando el mouse se cierne sobre él o nunca Las mismas opciones de BD están disponibles para los lenguajes que escriben de derecha a izquierda, y tenemos todas las mismas propiedades heredadas de la clase de botón base si queremos usarlas. Esto funciona, pero no es lo que quiero para mis enlaces de redes sociales. Preferiría tener el icono de la plataforma al lado del texto y tener ambos en los que se pueda hacer clic como un botón Para ello, voy a necesitar un nodo con textura destrozada para mostrar el icono Cambiaré el nombre de este icono de nodo y usaré el icono de Gadot como marcador de posición por ahora No quiero que el icono sea así de grande, así que lo configuraré en modo expandir para ignorar tamaño y el modo stretch para mantener el aspecto. Luego bájalo a un tamaño más razonable. A continuación, en lugar de usar el nodo del botón Enlace para mostrar el texto, usaré el nodo de etiqueta. Voy a cambiar el nombre de este identificador de nodo y poner mi identificador en el campo de texto. Después mueve esto a la derecha del ícono. Necesito agrupar estos dos nodos juntos, hacer que actúen como un solo nodo. Podemos hacer esto usando otro nodo como su padre, como el nodo del botón Enlace. Agrupar seleccionando los dos nodos, podemos arrastrarlos sobre el nodo del botón Enlace para repararlos al botón Enlace Por lo que ahora son hijos del nodo del botón Enlace. Al mover el nodo padre, ambos hijos se mueven junto con él, manteniendo sus posiciones relativas. Si ampliamos el tamaño del nodo del botón Enlace para cubrir a los dos niños, toda esta área se convierte un botón en el que se puede hacer clic que enlaza con la plataforma de redes sociales También podemos anclar el nodo del botón Enlace a cualquier ubicación de la pantalla, y ajustará automáticamente las posiciones relativas de los nodos hijos. Una manera más fácil de ser más exactos con la alineación horizontal de los controles y mantenerlos constantemente espaciados es usar otro nodo de control que sirva exactamente para este propósito. Este nodo se llama contenedor de caja horizontal. Automáticamente organizará todos sus hijos horizontalmente con un espaciado consistente entre ellos, convirtiéndolo en el hijo del botón de enlace, luego el icono y el asa hijos del contenedor de caja horizontal. El icono y el asa ahora tienen su modo de diseño configurado en contenedor. Al estar dentro de un contenedor, el contenedor se encarga de determinar su tamaño y posición. Por lo que estas propiedades están deshabilitadas. Los niños también se ven obligados a colapsar a su tamaño más pequeño permitido, lo que significa que el icono ha sido aplastado a Si cambiamos el modo de expansión para que encaje con proporcional, este modo de expansión es ideal para cajas horizontales, asegurándose de que el ancho de la textura coincida con la altura permitida por el contenedor horizontal. Seleccionemos el nodo raíz para que podamos ver el editor de temas y agregar el contenedor de caja horizontal al tema. Este tipo de nodo tiene solo una propiedad que podemos establecer en la sección constante, que es el número de píxeles que se utilizarán para separar los nodos hijos. Siéntete libre de cambiar este valor y ver qué se ve bien. Al seleccionar el contenedor de caja horizontal, su tamaño era originalmente de 40 por 40 píxeles por defecto y se expandió para cubrir sus hijos horizontalmente, pero la altura sigue siendo 40. Si hacemos clic en el botón de reinicio, el contenedor intentará colapsar tanto como pueda. Dado que el tamaño del texto del nodo de etiqueta exige 31 píxeles de espacio vertical, el contenedor también tiene 31 píxeles de alto. Esta altura también se le da al icono, cuya configuración propia establece su ancho para que coincida con su altura. Como ahora sabemos el tamaño exacto que necesitamos para este icono y manejador, podemos copiar estos números en la propiedad de tamaño mínimo personalizado del botón de enlace, asegurando que siempre abarcará la totalidad de sus hijos. Luego restablece su propiedad size para obligarla a colapsar a este tamaño. Ahora tenemos un botón de enlace de redes sociales que incluye tanto un ícono como un identificador, y se puede hacer clic en la totalidad de ambos Vamos a crear algunas carpetas de activos nuevas, primero para los iconos y otra dentro de esa para los iconos de las redes sociales para los iconos de las redes sociales para mantenerlos separados de otros íconos del juego. Después importa algunos iconos de redes sociales con esta carpeta seleccionada. Luego podemos reemplazar el ícono de Gdo por el ícono apropiado Seleccionando el nodo de botón de enlace, podemos duplicarlo usando Control D o Comando D para agregar más enlaces de redes sociales. Cada duplicado agregará un número creciente al nombre ya que los nodos hermanos no pueden tener el mismo nombre Todos los nodos secundarios también se duplicarán pero conservarán sus nombres originales ya que no son hermanos con sus duplicados Probablemente queremos que estos enlaces estén dispuestos verticalmente. Podemos hacer esto con un contenedor de caja vertical que funciona igual que el contenedor de caja horizontal, pero que organiza a sus hijos verticalmente Entonces agreguemos eso como hijo de la pantalla de título y renombrémosla a sociales. Después grupo seleccionar todos los nodos de botón de enlace y repararlos a este contenedor de caja vertical El contenedor automáticamente los organiza verticalmente para nosotros. Cambiaré el nombre de cada botón de enlace a la plataforma de redes sociales apropiada. Ahora que podemos ver todos nuestros enlaces, cambiemos sus URI. Sus íconos. Y sus asas, si es necesario. Dado que mis botones de tinta son ahora de diferentes anchuras, el contenedor de caja vertical los expandirá a todos al ancho más grande, haciendo que varios de estos botones de enlace mucho más largos de lo que deberían ser Agrupar seleccionando todos los enlaces, podemos cambiar la propiedad de dimensionamiento del contenedor desde este menú emergente en la ventana de vista previa, cambiando su tamaño de contenedor horizontal de relleno a inicio de contracción. Entonces cada botón de enlace colapsará su ancho al tamaño mínimo que establecimos anteriormente. Estas propiedades de dimensionamiento de contenedores también se pueden encontrar en la sección de diseño de las propiedades heredadas del control expandiendo la sección de dimensionamiento de contenedores. Las opciones horizontales y verticales están disponibles, colapsando hacia el principio, centro o final del contenedor o llenándolo completamente en cualquier dirección Anclemos estos enlaces de redes sociales a una esquina de la pantalla donde se ven bien. Voy a poner el mío en la esquina inferior izquierda. No es buena idea tener este tipo de iconos o textos tocando así el borde de la ventana. Por lo general preferimos tener algunos márgenes. Podemos compensar fácilmente la posición del nodo contenedor cambiando sus presets de anclaje a custom, luego ajustando los desplazamientos de anclaje, agregando un valor positivo al lado izquierdo para alejarlo del borde izquierdo de la ventana, y un valor negativo al fondo para moverlo hacia arriba Seleccionando el nodo raíz para que podamos ver el editor de temas, igual que con el contenedor de caja horizontal, podemos agregar contenedores de caja vertical al tema para cambiar el número de píxeles utilizados para separar a sus hijos. Me gustaría que la mayoría de los contenedores de caja vertical en mi proyecto tengan la misma separación uniforme de píxeles que mis contenedores de caja horizontal. Pero usaré una anulación de tema para hacer este contenedor de caja vertical en particular una excepción y duplicaré la separación para extender estos enlaces un poco más. Y podemos cambiar el orden de los enlaces fácilmente haciendo clic y arrastrándolos alrededor para reordenarlos tanto en el árbol de escenas como en el contenedor Ahora tenemos enlaces de redes sociales en nuestra pantalla de título. En la siguiente lección, agregaremos una variación a nuestro tema. Te veré en la siguiente lección. 21. Variación del tipo de tema: Hola, amigos. En la lección anterior, agregamos enlaces de redes sociales a nuestra pantalla de título. En esta lección, agregaremos un tipo de variación de tema. Agreguemos una nueva etiqueta a nuestra escena solo con fines de prueba. Uno sin sobrescritura de tema alguno, a diferencia del título. Usaremos muchos de estos para mostrar todo tipo de texto y números en pantalla más adelante. Seleccionando el nodo raíz para que podamos ver el editor de temas. Podemos agregar un nuevo tipo a nuestro tema, el nodo de etiqueta. Como hemos hecho antes, podemos cambiar las constantes de colores Fuente, tamaño de fuente y estilo, si queremos. Solo usaré la fuente predeterminada y el tamaño de fuente predeterminado que ya configuré para mi tema. Esto crea una apariencia consistente para todo o al menos la mayor parte del texto en nuestro juego. El título es único, utiliza anulaciones de temas para definir sus propias propiedades especiales del tema Si bien me gusta la fuente elegante del título, el texto y el botón de inicio de mi juego , estos enlaces de redes sociales deberían ser muy claros y fáciles de leer, especialmente porque mi nombre es muy difícil por sí solo. Entonces he importado una segunda fuente para usar solo para estos enlaces, Roboto, mientras que el resto del texto para mi juego debería permanecer en la fuente estilizada Podríamos seleccionar cada etiqueta de identificador y usar la sección de anulación de tema para cambiar su fuente como hicimos con el título. Pero, ¿y si queremos cambiarlo o queremos agregar más de estos botones de enlace? Entonces tendríamos que editar cada una de las anulaciones del tema de los nodos para asegurarnos de que todas coincidan Sería mejor usar nuestro tema para configurarlos todos a vez mientras los mantenemos separados de otros nodos de etiquetas. Pero ya hemos agregado el tipo de etiqueta a nuestro tema. Entonces, en los casos en los que queremos establecer un tema para algunos nodos, pero no todos los nodos del mismo tipo, podemos agregar un tipo de variación al tema simplemente escribiendo nuestro propio nombre en este campo. Voy a llamarlo handle, ya que para eso lo voy a estar usando. Este nuevo tipo aún no tiene propiedades porque el editor de temas no sabe cuál es el tipo base. Tenemos que ir a la última página y establecer el tipo base para esta variación. Y el tipo base es el tipo de los nodos que queremos efectuar, label. Podemos escribir el nombre en este campo o hacer clic en el botón más para elegir el tipo base de una lista. Esto agregará todas las mismas propiedades a esta variación de tipo como estaría disponible para un nodo de etiqueta. Entonces podemos agregar los mismos colores, fuente, color de contorno, color de sombra, constantes como tamaño de contorno y offset de sombra, fuente, que voy a cambiar a roboto Y tamaño de fuente, que me gustaría que fuera un poco más grande que el predeterminado en 28. Ninguno de estos cambios ha afectado a ninguna de nuestras etiquetas, el título, el texto o los manejadores. Seleccionando los nodos de mango, incluso podemos agruparlos seleccionar todos juntos. A continuación, expanda la sección temática. A continuación, haga clic en el botón Editar junto al campo de variación y escriba el nombre de nuestra variación de tipo de tema. Así mismo, todos estos nodos de etiquetas ahora usarán la variación del tipo de tema, para que podamos ajustar sus ajustes únicos colectivamente mientras los mantenemos separados de otras etiquetas en el proyecto. Cambiar la fuente y el tamaño de fuente también podría hacer los cuadros horizontales cambien su tamaño para acomodar el texto. Así que ajustaré rápidamente los tamaños mínimos personalizados de mis botones de tinta para que coincidan. Y ahora voy a eliminar este nodo de etiqueta extra ya que no es necesario para la pantalla de título. Ahora tenemos enlaces de redes sociales que son más fáciles de leer. En la siguiente lección, agregaremos un fondo para el juego principal. Te veré en la siguiente lección. 22. Panel: Hola, amigos. En la lección anterior, agregamos una variación del tipo de tema para dar a algunos nodos un tema consistente que difiere del de otros nodos del mismo tipo. En esta lección, agregaremos un fondo básico para nuestro juego principal. Normalmente los juegos tendrían una escena diferente para la pantalla de título y el juego principal, pero en este proyecto, estamos haciendo todo en una escena. Por defecto, el fondo es simplemente gris. Si quieres usar una imagen para tu fondo, usarías un nodo de rec de textura para dibujarlo. No quiero solo una imagen simple, así que comencemos agregando un nuevo nodo a nuestra escena. Esta vez, un panel de nodo y renombrarlo juego. Los paneles realmente no hacen nada más que un nodo de control estándar, excepto que también dibujan un cuadro de estilo. Pongamos sus anclajes a completamente destrozados para que cubra toda la ventana El cuadro de estilo predeterminado para un panel es lo mismo que un botón, solo un rectángulo negro semitransparente con esquinas redondeadas. Antes de importar la imagen para mi panel, crearé una nueva carpeta de activos para estilos y otra dentro de esa para botón. Luego mueve todos mis estilos de botón a esa carpeta. Después otra carpeta para paneles, y voy a tener esa carpeta seleccionada al importar las texturas de estilo de panel. Seleccionando el nodo raíz para que podamos ver el editor de temas, agreguemos panel al tema. Los paneles tienen solo una propiedad de tema, su caja de estilo. Las mismas opciones están disponibles para el panel que había para botones, vacío, línea, plano o textura. Vamos a usar una textura de cuadro de estilo, luego dar clic en ella para abrirla en el inspector y asignar la textura como una que se importó. Con los ajustes predeterminados, la textura se estira para que se ajuste al tamaño del panel, lo que no se ve muy bien. Al cambiar la propiedad de estiramiento de eje a mosaico, la imagen se colocará en mosaico en lugar de estirarse para llenar el espacio asignado Usar el ajuste de baldosas hará tanto el mosaico como el estiramiento de tal manera que toda la región esté cubierta con baldosas enteras en lugar de fracciones Esta imagen está un poco ocupada, puede ser demasiado distrayente, así que usaré la imagen del borde de la cuerda en su lugar Si agregamos algunos márgenes de textura, la imagen se cortará en nueve texturas diferentes que se usarán para construir el cuadro de estilo con las esquinas conservando sus dimensiones exactas de píxeles, los bordes se estiran o alicatarán para conectar las esquinas y el centro se estira o mosaico para llenar el área restante. Ahora que tenemos un fondo básico para nuestra ventana de juego, necesitaríamos tenerlo oculto por defecto cuando el juego se ejecute por primera vez para que podamos ver la pantalla de título, que podemos hacer haciendo clic en el icono del ojo junto a él en el árbol de escenas. Pero como pasaremos la mayor parte de nuestro tiempo desarrollando el juego editando los contenidos de este panel, sería mejor que esto fuera visible para nosotros, y la pantalla de título estuviera oculta en su lugar. Entonces queremos intercambiar el nodo de juego con el nodo de pantalla de título, haciendo que el nodo de juego sea el nodo raíz de escenas. Pulsando con el botón derecho sobre el nodo del juego, selecciona la opción make scene root. El nodo de juego es ahora el nodo raíz con la pantalla de título como hijo del mismo. Por lo que la pantalla de título se dibuja originalmente sobre el juego. Para pasar de la pantalla de título al juego principal, todo lo que necesitamos hacer es ocultar la pantalla de título desactivando su visibilidad. No obstante, ahora el tema del panel ya no se aplica al nodo del panel, ya que el tema es propiedad de la pantalla de título, solo afectaré a la pantalla de título y a sus hijos. Con la pantalla de título seleccionada, expandiendo la sección de tema, podemos hacer clic en la flecha junto al tema y guardarlo como recurso del proyecto. Simplemente lo dejaré en la carpeta de recursos del proyecto y le daré el nombre de la fuente. El comercio gana. Este tema ahora se guarda en la carpeta de recursos de nuestro proyecto. Así podemos seleccionar el nodo de juego, expandir la sección de tema y usar el menú desplegable para cargar este tema. Ahora el tema se está aplicando a todo el proyecto como antes, ya que es una propiedad del nodo raíz. También podemos eliminarlo del nodo de la pantalla de título ya que de todos modos se está heredando a través del árbol de escenas. A continuación, tendremos que adjuntar un script al nodo del juego, ya sea seleccionándolo y haciendo clic en el botón del script adjunto o haciendo clic derecho en el nodo y seleccionando el script adjunto. Nombraremos este script como administrador del juego y crearemos una nueva carpeta para contener todos los scripts de nuestros proyectos. Después crea el script en esa carpeta. El script se escribirá en script GD y heredará del panel, el tipo de nodo al que se está adjuntando Esto cambia automáticamente nuestra vista a la vista script y abre el script que acabamos de crear. Este guión solo necesita activar o desactivar la visibilidad de la pantalla de título. Para ello, necesitaremos una referencia al nodo de la pantalla de título. Al hacer clic derecho en el nodo de la pantalla de título, podemos acceder a este como un nombre único siempre y cuando ningún otro nodo en el árbol de escenas tenga el mismo nombre, que se indicará con un signo de porcentaje. Después haciendo clic y arrastrando este nodo al script, manteniendo presionada la tecla control o comando mientras suelta el mouse, almacenaremos una referencia a este nodo en una variable Procederé el nombre de la variable con un guión bajo para marcarla como privada, lo que significa que solo está destinada a ser utilizada por este script Anulación de la función ready. El icono de flecha azul junto a la función nos dice que esta función está anulando la definición proporcionada en la clase node Esta función se llama cuando el nodo y todos sus hijos están listos, podemos decirle a la pantalla de título que se muestre. Seleccionando el botón de inicio, podemos cambiar el panel inspector al panel de nodos, lo que nos da una lista de todas las señales que este nodo puede emitir. La señal a la que queremos reaccionar es la señal pulsada, que se emitirá cuando se presione el botón. Haga doble clic en la señal o haga clic derecho y seleccione Conectar. Podemos conectar esto al nodo de juego, el cual generará automáticamente una nueva función para nosotros en Start Pressed. El icono de conexión verde a la izquierda de esta función nos dice que una conexión de señal llamará a esta función. Cuando se presiona el botón de inicio, le diremos a la pantalla de título que se oculte. Ejecutando el juego, se muestra la pantalla de título, y cuando hacemos clic en el botón Inicio, se esconde, revelando el panel del juego debajo. Ahora tenemos un fondo para nuestra ventana de juego. En la siguiente lección, agregaremos una transición de desvanecido. Te veré en la siguiente lección. 23. Recto de color: Hola, amigos. En la lección anterior, agregamos un fondo para nuestra ventana principal del juego. En esta lección, agregaremos una transición de desvanecido para cambiar entre la pantalla de título y el juego principal. Actualmente, la pantalla de título se muestra inmediatamente, y al presionar el botón de inicio se corta al panel del juego, lo cual es un poco discordioso. Sería mejor que pasáramos poco a poco, lo que podemos hacer fácilmente con otro nodo El color destrozó el nodo. Vamos a renombrarlo fade. El nodo destrozado de color simplemente llena sus límites con un color sólido, que podemos cambiar en el inspector, por lo que lo pondremos en negro Luego coloca sus anclajes en naufragio completo para que cubra toda la ventana Así es como la mayoría de los juegos comienzan a terminar y cambian de escena con solo una pantalla negra vacía. Podemos ajustar la transparencia conocida como Alfa de este color para volverlo invisible gradualmente con el tiempo y volver al negro sólido nuevamente cuando lo necesitemos. Vamos a ocultarlo para que podamos ver nuestro juego mientras estamos trabajando en él. Adjuntando un script a este nodo, guardándolo en la carpeta de scripts, el propósito del script será desvanecerse dentro y fuera. Cada vez que estamos ajustando un valor a lo largo del tiempo, podemos usar una clase incorporada de Gadot, una preadolescente, que almacenaremos en una variable Añadiendo una función, llamémosla demasiado clara. La función puede devolver una señal que se emitirá cuando se haga. Lo primero que tenemos que hacer es crear una nueva preadolescente. Luego asigne esta preadolescente creada a nuestra variable. Esta es una función de la clase node. Cualquier nodo puede crear una tween. Entonces dígale a la preadolescente que interponga una propiedad. Esta función tiene cuatro parámetros. ¿Qué nodo? Podemos usar la palabra clave self para decir este nodo que el script está unido al nodo fade, ¿qué propiedad? Como cadena encapsulada entre comillas, especificamos el nombre de la propiedad, que es el color. El valor final de la propiedad, que es el color claro. Vamos a escribir eso en mayúsculas por ahora. Y por último, la duración del tiempo. Digamos 1 segundo, por ejemplo. Entonces podremos devolver la señal terminada de la tween, que emitirá la señal automáticamente cuando termine Claro no está definido, así que vamos a darle una definición declarándolo en la parte superior del guión como una constante Una constante es lo opuesto a una variable. Si bien ambos almacenan información, una constante nunca cambia. Convencionalmente se denominan en mayúsculas de serpiente, y podemos asignarle el valor de un color. Luego especifique entre paréntesis cero rojo, cero verde, cero azul y cero Alpha, que es negro, pero también completamente transparente. Cambiando al guión del administrador del juego. Vamos a darle un nombre único al fade y agregarlo al administrador del juego como variable. Se le puede decir que se muestre primero. Entonces después de que se muestre la pantalla de título, podemos desvanecer para despejar para revelar gradualmente el título detrás del fade. Cuando se presiona el botón de inicio, primero podemos desvanecer a negro antes de ocultar la pantalla de título, luego volver a desvanecer para borrar. Pero ocultar la pantalla de título tiene que esperar a que termine el fade to black. Como estamos devolviendo una señal de esta función, podemos usar el comando wait para pausar esta función hasta que se reciba la señal. Así que también necesitamos escribir las dos funciones negras de nuevo en nuestro script fade. Esta función hará exactamente lo mismo que la otra función, pero solo cambiando el valor final al que se está interponiendo la propiedad color En lugar de duplicar todo el código, sería mejor hacer de esta una función privada, que que que ambas funciones públicas la llamen Le nombraremos tween color y cambiaremos el argumento de valor final de la función de propiedad tween a color final Luego agrega el color final como parámetro de la declaración de función. Tanto demasiado claro como demasiado negro ahora pueden devolver el valor de retorno del color tween, pasando claro como argumento o punto de color negro ya que el negro ya está definido para nosotros en la clase de color Si tuviéramos que llamar a la función de dos claros, entonces la función de dos negros, mientras la preadolescentes está actualmente ocupada, puede causar algún comportamiento no deseado Entonces cada vez que esto sea posible, primero debemos verificar si la preadolescente ya ha sido creada y si se está ejecutando Si ambos son ciertos, entonces podemos matar a la preadolescentes antes de crear una nueva, evitando que surja cualquier conflicto, teniendo dos preadolescentes tratando de cambiar la misma propiedad Si no estamos muy seguros de querer usar 1 segundo como duración, posible que también queramos convertir esto en una variable. Vamos a llamarlo duración y establecer su valor en 1 segundo. Luego agregue la etiqueta de exportación al frente de la declaración para permitirnos darle a esta variable un valor diferente en el inspector. Seleccionando el nodo fade en el árbol de escenas, podemos ver que la variable duration tiene un valor de uno, pero podemos cambiarla a lo que queramos. Voy a intentar 2 segundos y ver cómo se ve eso. Al ejecutar el juego, la ventana comienza completamente negra pero se desvanece para despejarse, revelando la pantalla de título detrás de ella Actualmente no podemos hacer clic en el botón Inicio porque en realidad estamos haciendo clic en el rect de color de desvanecido, aunque sea transparente El botón tampoco responde a pasar el cursor sobre él. Seleccionando el nodo fade, necesitamos buscar en las propiedades heredadas del control para la sección mouse y cambiar su propiedad de filtro para ignorar. Ahora las señales del ratón pasarán a través del nodo fade a los nodos debajo de él. Entonces intentemos volver a ejecutar el juego. Si presionamos el botón de inicio, se desvanece a negro, oculta la pantalla de título y se desvanece para despejar una vez más, revelando el panel del juego Ahora tenemos una transición de desvanecido para nuestro juego. En la siguiente sección, empezaremos a trabajar en el juego real. Te veré en la siguiente sección. 24. Barra de menú: Hola, amigos. En la sección anterior, creamos una pantalla de título para nuestro juego que puede hacer la transición al juego principal. En esta sección, empezaremos a trabajar en la construcción del juego real. Comencemos agregando un nuevo nodo al panel del juego, un nodo de barra de menú. Y ordenarlo detrás de la pantalla de título. El nodo de la barra de menú no dibuja nada por sí mismo. Entonces, si quieres una representación visual de la barra de menús, tendrías que poner este nodo dentro de otro panel o naufragio de texturas. Luego usa el cuadro de textura o estilo para dibujar una barra real. Estoy bien sin dibujar una barra real, así que eliminaré este nodo extra. Cómo funciona realmente la barra de menús puede ser un poco confuso. Si alguna vez necesitamos más información sobre cómo funciona algún nodo, siempre podemos verificar su documentación haciendo clic derecho sobre él y seleccionando documentación abierta. Cambiaremos la vista descript y abriremos la documentación para este nodo Podemos leer de la descripción que este nodo creará botones de menú para cada nodo de menú emergente agregado como hijo. Volviendo a dos vistas D, agreguemos un nodo hijo a la barra de menú de tipo menú emergente. Esto no es estrictamente un nodo de control, pero está lo suficientemente cerca. Simplemente agregando el nodo de menú emergente como hijo de la barra de menú, la barra de menú agrega automáticamente un botón de menú con el mismo nombre que el nodo. Vamos a cambiar el nombre de este nodo algo más comúnmente visto en una barra de menú como archivo. También agregaré otro para ajustes y uno más llamado. Es posible que tengas que hacer algunos otros cambios antes de que la barra de menús se actualice. Los botones del menú se superponen con el borde del panel de juego, lo que no se ve muy bien. Sería mejor que se alejara más del borde de la ventana. Podríamos moverlo manualmente usando su posición de transformación o anclajes y desplazamientos de anclaje Pero no me gustaría que ninguno de mis elementos de juego tocara la frontera, así que sería mejor aplicar márgenes por todas partes que se apliquen a todo. El nodo del panel no es un contenedor, por lo que no puede controlar las posiciones o tamaños de sus hijos. Se ignorará la adición de márgenes de contenido a su cuadro de estilo. Entonces agreguemos un contenedor al panel del juego, específicamente uno que agregará márgenes, el contenedor de márgenes. Después haz que el hijo directo del panel de juego con la barra de menú sea hijo del contenedor de margen. Seleccionando el nodo raíz para que podamos ver el editor de temas. Agreguemos contenedor de margen al tema. El contenedor de margen no dibuja nada. Sólo tiene constantes en sus propiedades temáticas. ¿Cuántos píxeles de espacio de margen se agregan a cada lado? Dado que la pantalla de título es un hermano del contenedor de margen, no un hijo, no se verá afectada por los También agreguemos la barra de menú al tema. La barra de menú nos permite cambiar el color de fuente de todos los botones de menú que crea en todos los distintos estados de botones que hemos visto antes. En la sección de constantes, tenemos la separación de píxeles entre los botones del menú y el tamaño del contorno de la fuente Podemos cambiar la fuente y el tamaño de fuente, pero voy a usar mis temas, ajustes predeterminados para esos. No hay iconos, y podemos cambiar los cuadros de estilo para los botones de menú creados por la barra de menús en todos los mismos estados de botón. Para mis botones de menú, usaré el cuadro de estilo vacío como normal y lo copiaré en desactivado y un cuadro de estilo plano para presionar y copiarlo en hover y hover presionado abrir el cuadro de estilo vacío, solo agregaré algunos márgenes de contenido para hacer que el tamaño del botón sea un poco más grande que el texto. Y para el cuadro de estilo plano, agregaré los mismos márgenes de contenido, algunas esquinas redondeadas, y oscureceré el color Entonces haz que la caja estilo hover sea única para que no esté atada a las demás, luego ábrela y cámbiala a un color más claro Veamos cómo se ve esto cuando ejecutamos el juego. Los menús están todos ahí en la barra de menús. Tienen una caja curva de estilo plano en un color más claro cuando se ciernen y más oscuras cuando se presionan Sin embargo, sus menús emergentes están actualmente vacíos. Hay algunas opciones que podemos usar en el inspector para cambiar cómo se comportan los botones de menú. La palanca plana ignorará cuadros de estilo para los botones del menú y simplemente dibujará su texto. Apagar el interruptor al pasar el mouse obligará al jugador a hacer clic en los botones del menú para cambiar entre ellos en lugar de simplemente pasar el mouse Y el menú global preferido permitirá que esta barra de menú sea dibujada por los sistemas operativos Mac como el menú global fuera de la ventana del juego. Entonces, si no quieres que eso suceda, puedes apagarlo aquí. Pero si estás usando el menú global, entonces puedes especificar dónde en el menú global comenzar a agregar tus menús emergentes personalizados con el índice de inicio negativo uno, en este caso, siendo usado para significar automático. Y, por supuesto, las opciones de BD también están disponibles para los idiomas que escriben de derecha a izquierda. Ahora tenemos una barra de menús con varios menús vacíos. En la siguiente lección, llenaremos los menús emergentes con varias opciones Te veré en la siguiente lección. 25. Menú emergente: Hola, amigos. En la lección anterior, agregamos una barra de menú a nuestro juego. En esta lección, agregaremos opciones para los menús desplegables. Seleccionando el nodo del menú emergente y echando un vistazo a las propiedades en el inspector, la parte inferior es una sección expandible llamada items. Aquí podemos agregar cada una de las opciones que estarán disponibles dentro de este menú emergente, como Nuevo juego, guardar, cargar y salir. Estos artículos se pueden reorganizar haciendo clic en las flechas o arrastrando el icono de la hamburguesa Haré una nueva carpeta de activos para los iconos de menú e importaré algunos iconos de menú. Después asigne a cada elemento del menú su propio icono. Para la configuración, agregaré otro elemento y haré que este se pueda marcar como una casilla de verificación Esto sería apropiado para algo que se pueda encender o apagar, como el silencio, por ejemplo. Después agregaré otro menú pop up como hijo de este menú pop up para crear un submenú, que nombraré dificultad. Los elementos de este menú emergente serán mis ajustes de dificultad, cada uno verificable como un botón de radio, lo que significa que solo se puede seleccionar uno a la vez Easy se comprobará por defecto. Fácil, normal y duro. En el menú de ayuda, agregaré un ítem para aproximadamente con otro ícono. Después otro ítem que dice apoyo. Al hacer clic en el interruptor separador, esta opción de menú no será un botón en el que se puede hacer clic, sino un separador entre grupos relacionados de elementos de menú con su nombre sino un separador entre grupos relacionados de elementos de menú con su nombre escrito en este separador como etiqueta Luego agregaré otro elemento debajo del separador que será un enlace a mi Patroon con el ícono de redes sociales Seleccionando el nodo raíz para que podamos ver el editor de temas. Agreguemos menú emergente al tema. El color del acelerador de fuentes se usa para mostrar accesos directos, pero no tenemos la opción de agregarlos en el inspector. Nuestros menús desplegables tampoco tienen títulos, pero el resto de las opciones de color de fuente deberían ser familiares, junto con ajustes adicionales de color de fuente para separadores En la sección constante, nuestros menús desplegables no tienen un botón de cierre, pero la separación horizontal se puede utilizar para agregar espacio entre el icono y el texto de cada elemento. El ancho máximo del icono será útil para limitar el tamaño de los iconos para que coincida con la altura de fuente del texto. No habrá ninguna sangría en estos menús desplegables, pero el relleno puede agregar píxeles adicionales inicio y al final de cada elemento, dando solo un poco más Fuente Tamaño del esquema con el que ya estamos muy familiarizados, que también se puede aplicar a texto y separadores Estos menús pop up no se pueden tamaño y no tienen títulos Pero la separación vertical puede ajustar el número de píxeles que separan cada opción del menú. Hay propiedades para fuente y tamaño de fuente de las opciones de menú, título y separadores Simplemente dejaré todos estos y usaré los valores predeterminados del tema. La página de iconos se puede usar para cambiar los iconos utilizados para casillas de verificación, botones de cierre, botones de opción y submenús He importado algunos iconos nuevos para usar para estos, así que solo los reemplazaré a todos. Estas imágenes son de 16 píxeles cuadrados y no se redimensionarán. Así que asegúrate de estar usando una imagen razonablemente pequeña para estos íconos. A pesar de que nuestros menús desplegables no tienen un botón cerrado, voy a agregar esos dos. En la página de estilos, podemos agregar un cuadro de estilo para el panel de menús desplegables. Usaré una textura de caja de estilo dibujada con la imagen de la placa de acero y le daré márgenes de textura para evitar que los tornillos se estiren. El cuadro de estilo de desplazamiento se dibuja cuando se coloca el cursor sobre la opción de menú Usaré una caja de estilo plana y haré que se vea igual que los botones del menú. Como mi separador tiene texto, puedo usar los cuadros de estilo separador izquierdo y separador etiquetado derecho para cambiar la forma en que se dibuja el separador a la izquierda y derecha del texto de mi separador. Si el separador no tiene texto, entonces se utilizará el cuadro de estilo separador para dibujarlo. Los bordes incrustados no serán utilizados por nuestros menús desplegables. Veamos cómo se ven estos menús pop up cuando ejecutamos el juego. Al hacer clic en cualquiera de nuestros botones de menú, el menú emergente se muestra con el panel. Cada elemento se puede pasar por encima y hacer clic, pero ninguna de las opciones hace nada todavía, y el submenú de dificultad no está ahí Esto no se hace automáticamente. Tenemos que agregarlo a través de un guión. Así que agreguemos un script a nuestro menú emergente de configuración. Guardado en la carpeta de scripts, heredando del menú emergente Agarrando una referencia al submenú de dificultad, todo lo que necesitamos hacer es cuando este nodo esté listo, y por lo tanto sus hijos también están listos, podemos llamar a una función de la clase de menú pop up Agregar elemento de nodo de submenú, que requiere una etiqueta, un nodo de menú emergente y, opcionalmente, el número de índice de donde se insertará el submenú. Solo podemos usar el nombre del nodo para la etiqueta y el propio nodo. Al ignorar el índice, el submenú se agregará al final Agreguemos otro script al menú emergente del archivo para que podamos agregar atajos. Todo lo que tenemos que hacer es exportar variables del tipo atajo para que podamos establecerlas en el inspector. Entonces cuando el nodo esté listo, podremos comprobar si estos atajos tienen un valor antes de configurarlos como los accesos directos a los números de índice de cada elemento en este menú emergente. Podemos poblar cada uno de estos atajos en el inspector con atajos convencionales que esperaríamos Control o Comando N para S nuevo para guardar, L para carga y E para salida. Entonces deberíamos volver al editor de temas y agregar un color de fuente para nuestros nuevos atajos. Ahora cuando ejecutamos el juego, nuestro menú de archivos tiene atajos y nuestro menú de configuración tiene un submenú con botones de radio. Pero el icono del submenú está oculto detrás del texto de los elementos. Desafortunadamente, la forma en que se presentan estos elementos, el ícono del submenú solo será visible si el elemento no es el más largo. Para remediar esto, podríamos escribir algún código para editar manualmente el ancho del panel o podemos cambiar el nombre de algunos de nuestros otros elementos para que sean más largos que el elemento del submenú. Voy a necesitar agregar un poco más de separación horizontal y relleno para acomodar mi gran tamaño de fuente. Et's echa un vistazo a las propiedades de sub menú. Las tres primeras opciones determinarán si el menú emergente se oculta después de hacer clic en una opción. Si desmarcamos la opción ocultar en la selección de elementos verificables, entonces el menú emergente no se ocultará al hacer clic en una casilla de verificación o al cambiar los Esto podría ser útil para la configuración y los menús desplegables de dificultad. Un elemento de estado es similar a una casilla de verificación, pero puede tener más de dos estados y debe crearse a través de un script El retraso emergente del submenú es cuánto tiempo necesita el mouse para pasar el mouse sobre el submenú antes de que aparezca el menú emergente Permitir búsqueda hará que cada opción de menú en el menú emergente se pueda buscar con entrada de teclado mientras se muestra el menú emergente Las otras opciones son para integrar este menú emergente con diferentes menús del sistema operativo. Ejecutando el juego de nuevo, todo está más espaciado, y podemos usar entradas de teclado para buscar en el menú emergente que tiene foco. Ahora tenemos menús desplegables para cada uno de nuestros botones de menú. En la siguiente lección, escribiremos guiones para nuestras opciones de menú. Te veré en la siguiente lección. 26. Señales: Hola, amigos. En la lección anterior, agregamos opciones de menú a nuestra barra de menús. En esta lección, escribiremos guiones que reaccionarán a cada uno de ellos siendo presionados. Comenzando con el menú emergente de archivos, cambia el panel inspector al panel de nodos donde podemos ver todas las señales que este nodo puede emitir. Puede reaccionar a la señal ID presionada conectándola al script del menú emergente del archivo. Por lo que nuestro guión reaccionará a que el jugador seleccione cualquiera de los elementos del menú o presione las teclas de método abreviado. A diferencia del botón, esta señal nos pasa en argumento. Entonces la función generada tiene un parámetro coincidente del mismo tipo, el número ID del elemento que se presionó. De vuelta en la pestaña Inspector, podemos ver los números de identificación de cada elemento si necesitamos conocerlos o editarlos. Dentro de esta función, podemos usar una sentencia de coincidencia para ejecutar código diferente en función de qué elemento se presionó. Y mantener las cosas organizadas simplemente llamando a una función diferente para cada uno. Simplemente imprima declaraciones que digan qué función se llamó por ahora. Después de comenzar un nuevo juego, tendremos que restablecer muchos de nuestros nodos de control de nuevo a sus estados predeterminados, lo que sería un nuestros nodos de control de nuevo a sus estados predeterminados, poco discortante si sucede de Así que vamos a agarrar una referencia al nodo fade. Entonces podemos esperar fundido a negro antes de crear los nuevos datos de guardado y desvanecer de nuevo para borrar después. Es imposible predecir cuántas cosas podrían necesitar reaccionar ante los nuevos datos guardados que se están creando. En lugar de restablecerlos todos aquí, sería mejor emitir una señal Podemos declarar nuestras propias señales al igual que las variables. Vamos a reiniciarlo. Luego emitirlo después de que hayamos creado los nuevos datos de guardado. Cualquier nodo en el árbol de escenas puede conectarse a esta señal y restablecer de nuevo a su estado predeterminado cuando el jugador quiere iniciar una nueva partida. Dado que este proceso no está sucediendo instantáneamente, posible que queramos restringir cuándo se puede llamar. Si, por ejemplo, el jugador comienza a presionar nuevo juego y carga juego en rápida sucesión, esto provocaría un comportamiento no deseado. Declaremos otra variable para saber si este script está ocupado o no como booleano Entonces cuando se presiona cualquier ID, si este script está ocupado, ignorará la entrada. Estableciendo busy en true antes de desvanecerse a negro, luego false después de desvanecerse para borrar, ninguna de estas funciones podrá interferir entre sí después de que se llame a una Cargar el juego será esencialmente lo mismo que comenzar un nuevo juego por ahora. Salir del juego solo necesita ponerse ocupado a verdadero, desvanecerse a negro y luego decirle al árbol de escenas que deje de fumar Esto cerrará la aplicación en cualquier plataforma excepto web. Los juegos web tienden a no tener la opción de salir en absoluto. A continuación, veamos el menú de configuración y conectemos su señal ID presionada al script. Por ahora, solo declararé una variable para mantener el valor actual de mute como booleano, que naturalmente por defecto será false y otra para la dificultad como un entero por defecto en cero. Este menú emergente tiene solo un elemento, el botón de silencio. Entonces solo confirmaré que la idea es cero, luego llamaré a una función para establecer el valor de mute para que sea lo contrario de lo que es actualmente. Dando una definición a esta función, aceptando el valor de mute como booleano, necesitamos establecer la casilla de verificación para que realmente se Al pasar el mouse sobre cualquier propiedad en el inspector al que deseamos acceder a través de un script, podemos ver la ruta de la propiedad, item zero slash Al hacer clic derecho, también podemos copiar esta ruta en el portapapeles Después llamando a la función set, que acepta la ruta de propiedad como primer argumento, podemos pegarlo entre comillas. Seguido del valor, queremos configurarlo en silencio. Esto marcará la casilla de verificación, pero en realidad no silenciará nada. cambiar el panel inferior a audio, podemos ver el editor de bus de audio de Godo, que por defecto solo tiene un bus, el bus Master Audio, cuyo índice de bus es cero La mayoría de los proyectos de juegos tendrán un autobús para música, efectos de sonido y voces en off, por lo que cada uno se puede administrar como De vuelta en nuestro script, podemos acceder a este bus maestro desde un servidor de audio Singleton incorporado Después accede a la función set bus mute pasando el índice bus, que es cero y el valor de mute como argumentos. Repasaremos las clases de Singleton con más detalle en la siguiente lección Conectando la señal ID presionada del submenú al mismo script, podemos establecer el valor de dificultad para que coincida con el ID que se presionó. Ya que están en orden ascendente, esto tiene sentido. Entonces necesitamos establecer la propiedad comprobada de todos los artículos, ya que los botones de opción nunca deben permitir que se verifique más de uno a la vez. Usando un bucle de cuatro, podemos iterar a través de cada elemento en el recuento de elementos de dificultad Entonces esto contará cero, uno, dos. Entonces podemos usar la misma función de conjunto que antes, esta vez en el menú emergente de dificultad, configurando el item zero checked property para que sea si el valor de item es igual o no al ID que se presionó. Pero no queremos establecer solo el ítem cero. Entonces estamos reemplazando cero por ciento S. Esto marca una posición dentro la cadena que será reemplazada por un valor. Siguiendo la cadena con otro signo de porcentaje, entonces el valor para reemplazarlo con esto establecerá el ítem cero verificado, ítem uno verificado y el ítem dos verificado con cero es igual a ID. Uno es igual a ID y dos es igual a ID. Antes de crear el script de ayuda, reunamos rápidamente una ventana simple acerca de agregando un contenedor de panel al juego y renombrémoslo y ordenémoslo para que se dibuje ventana simple acerca de agregando un contenedor de panel al juego y renombrémoslo y ordenémoslo para que sobre los otros elementos del juego. Luego agrega un contenedor de caja vertical, una etiqueta y un botón. La etiqueta podría describir el proyecto, su versión actual y quién lo está desarrollando. El botón se utilizará para cerrar esta ventana y se le puede decir que se encoja al centro en lugar de llenar el ancho del contenedor. Luego anclaremos esto al centro de la pantalla. Conectando la señal pulsada del botón al nodo about, no necesitamos un script adjunto al nodo. Solo podemos elegir la función hide que se define en la clase de control alternando solo los métodos de script Tenerlo oculto por defecto. Y darle un nombre único. Por último, vamos a crear un nuevo script para el menú emergente de ayuda. Y también toma una referencia a la ventana Acerca de y conecta su señal ID presionada al script. Coincidiendo con el ID, recordando que el separador también ocupa un ID, podemos mostrar información sobre nuestro juego o abrir un URI en un navegador web. Usando el SO Singleton, abreviatura de sistema operativo, usando la función Shell Open, luego especificando el sitio web Esto no funcionará para Web Build, sin embargo. Entonces, si el nombre del sistema operativo es HTML cinco, deberíamos usar el JavaScript Bridge Sileton para evaluar lo siguiente Ventana punto ubicación punto href es igual entonces el sitio web. Esto ahora funcionará en cualquier plataforma. Ejecutemos el juego e intentemos presionar nuestros botones. Desde el juego principal, al presionar Control end se desvanece a negro. Vemos la salida del nuevo mensaje del juego, y vuelve a aparecer. Cargando hace lo mismo. Y guardar solo genera el mensaje. Podemos marcar y desmarcar la palanca de silencio, cambiar la dificultad de los botones de radio, abrir la ventana acerca de, cerrarla y abrir mi página Patrion en el navegador web predeterminado Ahora tenemos todas nuestras opciones de menú reaccionan a las interacciones de los jugadores. En la siguiente lección, agregaremos datos de guardado de los jugadores y los administraremos. Te veré en la siguiente lección. 27. Guardar datos: Hola, amigos. En la lección anterior, conectamos todas nuestras opciones de menú con guiones. En esta lección, crearemos los datos guardados del jugador y los administraremos con las opciones del menú. Para administrar un Saffle, necesitaremos crear un nuevo script que describa lo que contiene Vamos a llamarlo algo así como guardar datos y heredar de recurso en lugar de nodo Este recurso no es nada que se dibuje o incluso se agregue al árbol de escenas, sino que solo será una recopilación de datos que describa la información del jugador tal como es necesaria para jugar al juego. Comenzando en la parte superior del script antes de que se extienda, necesitamos darle a este recurso un nombre de clase usando la palabra clave class name con un guión bajo Estos se escriben convencionalmente en el caso Pascal. Luego podemos agregar cualquier variable que queramos a este script. Vamos a agregar si el volumen está silenciado o no, lo que sería un booleano y la dificultad configurando como Y también cualquier otra variable que pueda ser necesaria para jugar el juego, como el oro actual del jugador, por ejemplo. Todos los tipos de variables deben ser primitivas como Boolean, integer, float o string o construidas en clases que contengan solo estos tipos primitivos, como vectores Cualquier información que desee guardar debe tener la etiqueta de exportación. Es posible que desee incluir algunas variables sin la etiqueta de exportación, que no persistirá entre sesiones de juego. Si bien todas estas variables tienen valores predeterminados naturales, también podemos asignarles nuestros propios valores predeterminados. O si queremos incluir algoritmos complejos o generación de números aleatorios, sería mejor anular la función inicializada heredada del objeto Godot automáticamente llamará a esta función por nosotros al crear el recurso, que podamos inicializar cualquiera de las variables que necesitemos Este script debe guardarse antes de que podamos usarlo en otros scripts. A continuación, cambiemos al script del archivo. Dado que el recurso tiene un nombre de clase, podemos declarar una variable usándolo como su tipo. Entonces la nueva opción del menú del juego puede crear un nuevo recurso de ese tipo usando el nombre de la clase seguido del punto Nu. Para salvar nuestro juego, necesitaremos saber dónde guardarlo también en el sistema operativo del jugador, que se almacena mejor en una constante. Vamos a llamarlo path como una cadena. Afortunadamente, Godot resuelve este problema para nosotros al proporcionar el acceso directo usuario colon slash slash, que automáticamente apuntará a una ubicación adecuada en Solo necesitamos nombrar el archivo. Siguiendo el nombre con la extensión de archivo punto TRS generará un archivo de recursos de texto que puede ser leído y editado por cualquier persona en el Bloc de notas Definitivamente una buena idea para depurar y proyectos Indi. Para poder guardar nuestro juego, todo lo que necesitamos hacer es acceder a una clase singleton incorporada, Resource saver, que tiene una función llamada save Esto acepta un recurso y una ruta como argumentos. Cargar el juego es muy parecido a guardar, excepto que asignamos el valor de los datos guardados a otra clase singleton incorporada, resource loader, que tiene una función llamada load, aceptando el mismo argumento path Estos singletons que seguimos usando son solo guiones que contienen clases, no a diferencia de muchos que hemos escrito, sino que son parte del propio motor del juego Gadot Se les llama singletons porque están escritos de tal manera que sólo puede haber una instancia de ellos en cualquier momento Esto los hace muy accesibles porque podemos acceder directamente a la instancia única directamente por el nombre de la clase, como lo hemos hecho aquí sin necesidad de almacenarla en una variable. No necesitamos saber dónde está ni encontrarlo porque el nombre de la clase en sí es una referencia directa a la instancia de la misma, precisamente porque solo hay uno. La mayoría de los scripts que escribimos como desarrolladores no necesitan ser únicos, y en realidad es preferible que no lo sean tomemos el script fade, por ejemplo, no hay razón por la que no pudiéramos poner este script exacto en otro nodo del árbol de escenas y reutilizarlo para un propósito diferente. Pero entonces la necesidad de hacer referencia al nodo al que se une el script almacenándolo en una variable es la única forma de saber a qué script fade estamos tratando de acceder, ya que habría múltiples instancias. Es posible crear nuestras propias clases Singleton en Gadot, pero no necesitaremos hacerlo para este proyecto Desde el script del administrador del juego, vamos a darle un nombre único al nodo de archivo y almacenemos una referencia a él en una variable. Entonces cuando se presiona el botón de inicio, podemos decirle al nodo de archivo que inicie una nueva partida. El script del archivo manejará el final de desvanecimiento por nosotros para que podamos eliminarlo de aquí Establecer el valor predeterminado de busy en true evitará que el jugador acceda a cualquiera de estas funciones desde la pantalla de título, lo que actualmente es posible usando los atajos. Y también debemos desactivar el botón de inicio para evitar que se presione más de una vez. Dándole un nombre único. No necesitamos almacenarlo en una variable ya que solo lo vamos a usar una vez y podemos simplemente establecer su propiedad deshabilitada en true cuando se presiona. En el script de configuración, necesitaremos almacenar una referencia al menú emergente del archivo en una variable para poder acceder al recurso guardar datos, y podemos eliminar estas variables temporales. Al seleccionar el botón Silenciar, tendremos que establecer el valor de mute al contrario de lo que se almacena en los datos guardados. Estableceremos el valor del recurso de guardar datos de archivo para que coincida con el silencio, convirtiéndolo en lo contrario de lo que era anteriormente. De igual manera, cambiar la dificultad también necesitará establecer el valor en los datos de guardado del jugador. Cuando se crea un nuevo dato de guardado o se carga uno, tendremos que establecer estos valores para que coincidan con los datos guardados. Entonces seleccionando el menú emergente del archivo, podemos conectar la señal personalizada que hicimos la última lección al script del menú de configuración para llamar automáticamente a una nueva función. que nos permite establecer el silencio y la dificultad para que coincidan con lo que hay en los datos guardados recién creados o cargados. Vamos a probarlo ejecutando el juego. Usando los atajos de la pantalla de título, se ignoran. Al presionar el botón de inicio, ahora crean nuestros datos iniciales de guardado. Si seleccionamos Guardar en el menú, entonces se crea un archivo guardado en nuestro equipo, que podemos abrir en cualquier editor de texto como Bloc de notas Podemos ver los valores de nuestras variables. De vuelta al juego, podemos cambiar los valores de silencio y dificultad, guardar el juego y ver los cambios inmediatamente en nuestro archivo guardado. Si salimos del juego y empezamos de nuevo, podremos cargar nuestro archivo guardado y ver que se han realizado los cambios a los valores que guardamos. Ahora tenemos todas nuestras opciones de menú funcionando. En la siguiente lección, haremos un seguimiento del oro del jugador. Te veré en la siguiente lección. 28. Contador: Hola, amigos. En la lección anterior, logramos que los jugadores guarden datos. En esta lección, agregaremos un contador a la pantalla para hacer un seguimiento de su oro. Primero pensemos en el diseño general de la pantalla y decidamos dónde poner dicha información. Con la barra de menú ocupando la esquina superior izquierda, creo que tener contadores de recursos de jugadores en la misma línea horizontal que la barra de menú hace un buen uso del espacio extra en la parte superior derecha, dejando el resto de la ventana disponible para el juego principal. Entonces, con el contenedor de margen seleccionado, primero vamos a anclarlo al tamaño completo del panel de juego. Luego agrega un contenedor de caja vertical para organizar la barra de menú encima de los otros componentes que aún no hemos agregado. Al contenedor de caja vertical, agregaremos un contenedor de caja horizontal, que organizará la barra de menú a la izquierda y los contadores de recursos a la derecha. Los propios contadores de recursos, que tienen tanto un icono como un número también serán contenedores de caja horizontales. Nombrémosle a éste oro. Después darle una textura nudo destrozado y un nodo etiqueta como sus hijos Tengo este ícono de moneda de oro usaré para la moneda de mi juego, que rellenaré como la textura para mi icono Al construir una interfaz de usuario como esta, es una buena idea tener tus contadores predeterminados con el número más alto posible que quieras permitir. De esa manera sabes cuánto espacio se necesita asignar para acomodarlo. Creo que aquí 10 millones deberían ser un número suficientemente grande. El contador está actualmente ordenado por el contenedor de cuadro horizontal justo a la derecha de la barra de menú, pero preferiría estar en la esquina superior derecha y cualquier contador de recursos adicionales que pueda agregar para llenar en la izquierda. Seleccionando la barra de menú, podemos decirle que se expanda horizontalmente para llenar tanto espacio como pueda, empujando al resto de los hijos de la caja horizontal que se muevan lo más a la derecha como sea posible. Ahora bien, si duplico mi contador de oro, cada contador se agregará a la derecha, empujando a la izquierda los anteriores. A continuación, agreguemos un guión al nodo oro, que se encargará de asegurarnos de que el número mostrado siempre coincida con el número de oro en los datos de guardado del jugador. Así que vamos a llamarlo contador y guardarlo en la carpeta de scripts. Para acceder a los datos de guardado del reproductor, necesitaremos almacenar una referencia al nodo de archivo en una variable, y para cambiar la propiedad text del nodo label, también lo necesitaremos. Entonces podemos escribir una función que actualice el contador. Todo lo que tenemos que hacer es establecer la propiedad text del nodo label para que sea el valor de file data dot gold como cadena. Siempre que el jugador inicie una nueva partida o cargue su juego, se emitirá la señal de reinicio, cual podremos conectar a esta función para actualizar el contador. A continuación, tendremos que escribir una o dos funciones públicas que cambien el valor. Escribiré dos funciones separadas, una que recibe el recurso, y otra para gastar el recurso, ambas aceptando un parámetro entero por la cantidad. Al recibir, simplemente estableceremos la nueva cantidad del recurso para que sea más la cantidad recibida, luego actualizaremos el contador. Pero es posible que hayamos decidido que debería haber una cantidad máxima que se pueda mostrar. Entonces vamos a hacer cumplir esa restricción aquí. Exportaremos otra variable para la cantidad máxima y le daremos un valor. Entonces podemos hacer cumplir este máximo usando la función mínima. La función mínima devolverá el más pequeño de todos los valores proporcionados. Entonces, ya sea la cantidad del recurso más la cantidad agregada o la cantidad máxima permitida, la que sea menor Al gastar el recurso, primero tenemos que verificar si el jugador tiene suficiente del recurso para gastar la cantidad. Si la cantidad del recurso es menor que la cantidad que se gasta, probablemente no quisiéramos continuar con la transacción y regresar. Si el jugador tiene suficiente, entonces podemos reducir la cantidad por la cantidad y actualizar el contador. Podemos hacer que esta función sea más útil devolviendo un booleano, devolviendo false si el jugador no tiene suficiente o true si Entonces cualquier lógica de juego que llame a esta función puede reaccionar al resultado de intentar gastar este recurso como verdadero o falso. Para propósitos de prueba, vamos a anular la función de entrada, que acepta un evento de entrada como parámetro. Después verifique si se presionaron las teclas arriba o abajo. Si se presionó arriba, haré que el jugador reciba un número aleatorio de oro 1-100 De igual manera, al presionar hacia abajo, gastarán una cantidad aleatoria de oro, e imprimiré el resultado. Al ejecutar el juego, podemos ver que el contador estaba configurado para igualar el valor inicial del oro del jugador. Al presionar hacia abajo, la cantidad se reduce hasta que ya no pueden permitirse gastar más. En cuyo caso, el contador no se reduce y la salida cambia a false. Al presionar hacia arriba aumenta el contador y eventualmente se agota en la cantidad máxima. Esto va a funcionar bastante bien para el oro, pero ¿y si tenemos diferentes recursos que queremos tratar con todas estas mismas funciones? Necesitaríamos un script diferente para cada recurso, lo cual no es muy buen diseño. Así que hagamos este script más flexible y exportemos el nombre del recurso que este contador está realizando un seguimiento como una cadena. Recuerda establecer este valor exportado en el inspector con exactamente la misma ortografía la variable en los jugadores guarda los datos que quieres contar. También cambiaré mi valor máximo de oro de nuevo a lo que debería ser. También tendremos que declarar otra variable para mantener la cantidad a. Ahora, ambas funciones de transacción pueden comenzar con primero obtener la cantidad del recurso de los jugadores guardar datos usando la función G, que acepta el nombre de la propiedad como una cadena. Entonces le daremos el nombre del recurso. Luego realizaremos nuestras transacciones en la variable local en lugar de hacer referencia directa a los jugadores guardar datos Y después de realizar nuestras funciones, podemos establecer la variable en los datos de guardado del reproductor de la misma manera usando la función set, pasando el nombre de la propiedad como una cadena y su nuevo valor. También necesitamos obtener la cantidad actual de los datos de guardado del jugador al actualizar el contador. Ahora podemos duplicar el nodo oro y hacer que rastree un recurso diferente sin cambios en el script, solo cambiando los valores de sus variables exportadas. Et's agregan otro recurso para que los jugadores guarden datos, algo así como robots con un valor inicial de uno. Luego también conéctate a la señal de reinicio para actualizar automáticamente este nuevo contador de recursos. Ahora cuando ejecutamos el juego, ambos contadores están mostrando las cantidades de diferentes recursos contenidos en los datos de guardado de los jugadores. Recuerda eliminar o comentar la función de entrada antes de continuar. Además, la visualización de los contadores debería haberse actualizado después de establecer su valor de cantidad. Ahora tenemos contadores de recursos para nuestro juego. En la siguiente sección, comenzaremos a implementar algunas mecánicas de juego. Te veré en la siguiente sección. 29. Edición de línea A: Hola, amigos. En la sección anterior, creamos una barra de menú para nuestro juego. En esta sección, comenzaremos a implementar algunas mecánicas de juego. Empecemos por colapsar el contenedor de caja horizontal y tal vez cambiarle el nombre de algo más descriptivo como top Luego podemos agregar otro niño al contenedor de caja vertical para llenar el resto del panel de juego. Usaré otro contenedor de margen. Voy a nombrar este buque portacontenedores de margen, ya que lo estaré usando para mostrar información sobre el barco del jugador y expandirlo para llenar el resto del panel de juego verticalmente. Dentro del contenedor de margen, voy a poner un contenedor de caja vertical para organizar unos componentes verticalmente, comenzando con un nodo de etiqueta que simplemente dice mi nave, así el jugador sabe que esta es su nave. Debajo de eso, pondré una textura rect para dibujar una imagen del barco, usaré el icono de Gadot como imagen de marcador de posición, le diré que ignore el tamaño de la imagen y le daré dimensiones personalizadas de 150 píxeles al y le daré dimensiones personalizadas de 150 Y finalmente, un bloque estadístico de las diversas estadísticas de la nave. Similar a un contenedor de caja horizontal o vertical, podemos organizar fácilmente grandes números de nodos de control en una formación de cuadrícula usando un contenedor de cuadrícula. Vamos a nombrar estas estadísticas y darle dos columnas, una para etiquetas y otra para valores. Para las estadísticas, agregaré dos nodos de etiqueta para cada uno, el nombre del barco, el tipo, el número de tripulantes y la cantidad de carga que puede contener. Las etiquetas en el lado izquierdo de la cuadrícula indicando qué tipo de valor es. Las etiquetas del lado derecho se pueden rellenar con información de ejemplo por ahora, pero queremos que esto esté vinculado a información en los datos guardados del jugador. El contenedor de cuadrícula ordenará automáticamente sus hijos en el número de columnas especificadas, manteniendo todas las filas y columnas alineadas. Seleccionando los tres nodos hijos del contenedor de caja vertical, haré que se encojan al centro. Me gustaría que el jugador pudiera cambiar el nombre de su nave, así que cambiemos el nodo de etiqueta de nombre a un nodo de edición de línea. Este nodo permite al jugador editar el texto dentro de él mientras juega el juego. Pondré todo esto dentro de un contenedor de panel para que tenga un bonito borde a su alrededor. Luego dígale al contenedor de caja vertical que se encoja verticalmente al centro del contenedor del panel. Desde esta pantalla, podemos ver claramente la información que necesitaremos para almacenar para cada buque una imagen, nombre, el tipo de barco, tanto el número mínimo como máximo de tripulación y capacidad de carga. Al igual que hicimos con los datos de guardado del jugador, podemos crear un script de recursos para contener esta información. Primero vamos a crear una nueva carpeta de script llamada Resources, y podemos poner el script de guardar datos aquí. Después haga una nueva carpeta para los barcos y cree un nuevo script en esta carpeta llamada ship inheriting from resource Aquí podemos exportar variables tal como hicimos con los jugadores guardando datos para describir un barco, incluyendo una textura dos D para la imagen, una cuerda para el tipo y enteros para la tripulación mínima, tripulación máxima y capacidad de carga Excluiré el nombre del barco ya que no va a estar asociado con el tipo de barco. Asegúrese de guardar este script. Al hacer clic derecho en la carpeta de recursos del barco, ahora podemos crear un nuevo recurso y hacer tantos barcos como queramos. Haré tres barcos, un cortador, una captura y una goleta Al hacer doble clic sobre el recurso, podemos abrirlo en el inspector y editar las variables exportadas, poblando la imagen con una imagen de un cortador, rellenando el tipo, límites de tripulación y variables de capacidad de carga Cada uno de nuestros recursos puede poblar las variables exportadas con sus propios valores únicos, creando una categoría de objetos similares para nuestro juego que todos tienen las mismas propiedades pero con valores diferentes Para organizar mejor mis scripts, voy a crear una subcarpeta para la interfaz de usuario sí Donde colocaré todos mis sub manuscritos, fade y counter Después otra carpeta para gerentes, que contendrá al manager del juego y otro script nuevo que adjuntaré al nodo de barco y lo nombraré administrador de barcos. La responsabilidad del gerente del barco será administrar todo lo que suceda con sus hijos, incluida la actualización de las imágenes y el texto mostrados. Para ello, este guión necesita saber cuáles son todas las naves que existen en el juego. Así que vamos a exportar una matriz de barcos como una variable. Echando un vistazo en el inspector, podemos ver nuestra variedad de barcos y agregarle tres elementos y poblar cada uno con un barco diferente He diseñado mis barcos para que funcionen como mejoras y preferiría que se ordenaran de peor a mejor. Entonces pondré el cortador en el índice cero, seguido de la captura, luego la goleta Ahora, todo lo que necesitamos saber de los datos guardados del jugador es qué barco tiene actualmente el jugador. Esto se puede almacenar fácilmente de manera muy eficiente como solo el índice de matriz del barco. Cambiando al script de guardar datos, agregaré un entero exportado para el número de índice de barco del jugador y lo tendré predeterminado en cero. Mientras esté aquí, también agregaré una cadena para el nombre del barco. De vuelta en el guión del administrador de barcos, para mostrar la información del barco del jugador, necesitaremos una referencia al menú emergente de archivos para acceder a los datos guardados del jugador. Voy a cambiar el nombre de este nodo mi nave Info. Luego toma referencias a los nodos wrec de textura, edición de líneas y etiqueta Voy a cambiar el nombre de cada una de estas variables para que sepa que están describiendo el chip actual del jugador y también en una variable local para contener el número de índice del barco del jugador. escribir una función privada para actualizar la información del barco del jugador, cada nodo establecerá la propiedad apropiada a la de un barco en la matriz, utilizando el número de índice de barco del jugador para indexar la matriz. Mostraré la tripulación mínima y máxima juntos lanzándolos a cuerdas y separándolos con un guión Después también exhibir la capacidad de carga con sus unidades en toneladas. Al iniciar un nuevo juego o cargar, se emitirá la señal de reinicio y podremos conectarnos a esta señal para actualizar automáticamente la información del barco del jugador. A después de recuperar su número de índice de barco de los datos guardados Pero nuestra nave aún no tiene nombre. Generaré aleatoriamente nombres de barcos a partir de una lista declarando primero una constante en la parte superior de mi guión llamada nombres de barcos, que serán una matriz de cadenas Luego rellenaré esta matriz con un montón de nombres de barcos comunes En la función de reinicio en archivo, si el barco no tiene nombre, le asignaré un nombre seleccionado aleatoriamente de esta lista. Indexar la matriz con un entero aleatorio entre cero y el tamaño de la matriz menos uno Lo último que tenemos que hacer es permitir que el nodo de edición de línea cambie el nombre del barco del jugador, lo que se puede hacer conectando su señal de texto enviado al script del administrador de barcos. Esto se omitirá después de presionar la tecla enter. También hay señales para cada vez cambia el texto o cuando se ha alcanzado el límite de tamaño del texto. En nuestra función recién generada, hay dos situaciones posibles que debemos tener en cuenta si el texto de edición de línea está vacío o no. Ya que el nuevo texto nos fue pasado como parámetro, podemos ponerlo fácilmente en una declaración if con true no siendo vacío y falso siendo vacío. Si el nuevo texto no está vacío, podemos asignarlo al nombre del barco del jugador. Pero si está vacío, podemos hacer lo contrario, revertiendo el texto en la línea editar nuevo al valor anterior del nombre del barco Esto evitará que el jugador tenga un barco sin nombre. También es una buena idea decirle al nodo de edición de líneas que libere el enfoque, independientemente del resultado. El nombre del barco se puede leer directamente de los datos guardados del jugador cuando se actualice. Volviendo a la vista de dos D, podemos ver que la información del barco de nuestros jugadores se rellena con información de marcador Cuando ejecutamos el juego, todo se reemplaza automáticamente con la información asociada al barco cortador, y al barco se le asignó un nombre aleatorio de la lista. Podemos dar click en el nodo de edición de línea para cambiar el nombre del barco y presionar Enter para enviar el cambio. Intentar nombrar el barco no se rechaza nada. Salvando el juego, luego comenzando un nuevo juego. El nombre del barco se reemplaza por uno generado aleatoriamente y cargando el juego, se restaura nuestro nombre de barco guardado. Ahora tenemos la información del barco de nuestros jugadores exhibida y podemos editar el nombre del barco. En la siguiente lección, repasaremos las opciones disponibles para las propiedades de edición de líneas y la tematización. Te veré en la siguiente lección. 30. Edición de línea B: Hola, amigos. En la lección anterior, permitimos que el jugador cambiara el nombre de su nave. En esta lección, repasaremos las opciones disponibles para las propiedades de edición de líneas y la tematización. Seleccionando el nodo de edición de líneas, echemos un vistazo a sus propiedades en el inspector. Usando la propiedad text, podemos darle un valor por defecto. Si la propiedad text está vacía, entonces el texto del marcador de posición se muestra en su lugar con un color de fuente diferente Podemos alinear el texto al centro, ¿verdad? O llenar toda la línea espaciará las palabras de manera uniforme. Podemos restringir la longitud del texto ingresado. Es una buena idea probar la cantidad de texto que se puede mostrar cómodamente usando una letra ancha como una M mayúscula o una W. Luego usa eso para juzgar la longitud máxima del texto. Si la edición de línea no es editable, el jugador no podrá hacer clic en ella y editar su contenido Si se habilita expandir a la longitud del texto, el cuadro se expandirá para acomodar el texto dentro de él. Habilitar el menú contextual permitirá al jugador hacer clic derecho en la línea en el nodo para mostrar un menú contextual. Esto lo podemos ver en el editor de temas sin ejecutar el juego. El menú contextual se tematiza automáticamente para que coincida con los menús emergentes de nuestro juego e incluye todas las cosas típicas que esperaríamos ver como cortar, copiar, pegar, seleccionar todo, borrar, deshacer y rehacer, un submenú para cambiar la dirección del texto y opciones para mostrar e insertar caracteres de control Si no quieres incluir este menú contextual, puedes desactivarlo aquí. Para plataformas de consola y móviles, integración de teclado virtual está disponible, y hay múltiples opciones de teclado virtual, específicamente para ingresar números, decimales, números de teléfono, correos electrónicos, contraseñas o URL puede incluir un botón de borrar, que al hacer clic, eliminará todo el texto de la edición de línea Las teclas de método abreviado que se muestran en el menú contextual se utilizarán incluso si el menú contextual no lo es. Estos se pueden desactivar aquí. Existe una opción para deshabilitar el pegado usando el botón Middle Mouse en plataformas Linux También puedes cambiar si el reproductor puede seleccionar texto o no usando el mouse o el teclado. anular la selección de la pérdida de enfoque, se anulará la selección del texto resaltado cuando el nodo de edición de líneas pierda La selección de arrastrar y soltar se puede usar para controlar si el jugador puede o no hacer clic y arrastrar texto dentro de esta edición de línea. Se puede asignar un icono al lado derecho del nodo para indicar mejor al jugador que este texto es editable Un lápiz es común, pero usaré un icono de pluma para que se ajuste a la estética de mi juego. Si hay tanto un icono derecho como un botón de borrar, el botón de borrar se dibujará en lugar del icono derecho cada vez que haya texto a borrar. Flat funciona igual que los botones, eliminando todos los estilos del nodo y solo dibujando el texto y el icono. Dibujar caracteres de Control es la misma opción de alternar que estaba disponible en el menú contextual, permitiendo dibujar caracteres de control. Por último, seleccionar todo en foco seleccionará automáticamente todo el texto cuando el nodo tome el foco por primera vez Bajo la categoría de quilates, podemos decirle al quilate que parpadee y especificar el intervalo de tiempo entre parpadeos La columna de quilates es el índice de caracteres de la ubicación actual del quilate. Podemos verlo si forzamos la edición de líneas para mostrar el quilate incluso sin foco. Si usa la edición de línea para obtener información secreta como una contraseña, podemos activar el secreto, y cada carácter se dibujará como el carácter secreto especificado aquí. Mostrar las opciones de grafema y BD hechas en quilates también están disponibles para sistemas de escritura más complejos fuera del alfabeto romano Para mi juego, tendré el texto del marcador de posición como nombre a tu nave con una longitud máxima de 16 caracteres y permitiré que el cuadro se expanda para acomodar el texto Mantendré el icono de la derecha como pluma, seleccionaré todo el texto en foco y tendré el espacio en blanco de quilates activado Aparte de eso, el resto de las opciones están bien como sus incumplimientos. Seleccionando el nodo raíz para que podamos ver el editor de temas, agreguemos edición de líneas al tema. En la sección de color, podemos cambiar el color del quilate y el botón claro como es normalmente y pulsado. Podemos cambiar el color de fuente del texto normal, texto marcador de posición, texto seleccionado y texto no editable, así como el color de contorno de todos ellos, y el color de la caja que se dibuja detrás del texto así como el color de contorno de todos ellos, y el color de la caja que se dibuja detrás del dibuja detrás En la sección constante, podemos cambiar el ancho del quilate, establecer el ancho mínimo de caracteres para el cuadro de línea **** medido en Ms, y el grosor del contorno de la fuente. Como todo con texto, podemos cambiar la fuente y el tamaño de fuente, pero los dejaré como predeterminados para el tema, y podemos anular el icono utilizado para el botón de borrar. Los colores de los botones claros se utilizarán como modulación en esta textura de icono. Por último, en la sección de estilo, podemos proporcionar cuadros de estilo sobre cómo se ve normalmente la edición de líneas cuando tiene foco y cuándo es de solo lectura. Voy a usar estilo Caja plana para normal. Después haga clic en él para editarlo, agregue mis siete píxeles habituales de esquinas, bordes y márgenes de contenido. Voy a tener el mismo color que el fondo con un color de borde más oscuro. Después duplicaré el cuadro de estilo plano a la opción de enfoque, lo haré único, luego lo abriré para editarlo. Cuando tenga foco, cambiaré el borde a un color más claro y agregaré una sombra. Podemos ver cómo se ven nuestros cambios en la vista previa del tema. Para solo lectura, solo usaré una caja de estilo vacía. También agreguemos el contenedor de cuadrícula a nuestro tema. Al igual que los contenedores de caja horizontal y vertical, el contenedor de cuadrícula solo tiene constantes para sus propiedades de tema, el número de píxeles que separan sus filas y columnas No olvides probar cómo se ven tus cambios ejecutando tu juego. Ahora tenemos nuestro nodo de edición de línea configurado para que coincida con la estética de nuestro juego. Y la siguiente lección permitirá al jugador comprar un nuevo barco. Te veré en la siguiente lección. 31. Botón de opción: Hola, amigos. En la lección anterior, permitimos que el jugador cambiara el nombre de su nave. En esta lección, dejaremos que el jugador compre un nuevo barco. Solo estaré recreando un conjunto muy similar de información a la derecha de este contenedor de panel, mostrando las estadísticas de una mejora de barco que está disponible para su compra, comenzando con un contenedor de caja vertical, que nombraré barcos para la venta, luego pondré ambos en una caja horizontal para organizarlos uno al lado del Con ambas notas secundarias seleccionadas, diciéndoles que se expandan horizontalmente, compartirán el espacio disponible de manera uniforme. Dentro de los barcos a la venta, voy a copiar sobre la etiqueta textura wreck grid container y todos sus nodos de etiqueta Voy a tener naves en venta que se encojan al centro verticalmente para que coincidan con la disposición del lado izquierdo. Cambiando la etiqueta para decir naves en venta. Pero voy a cambiar nombre a costo, cambiar la etiqueta izquierda a una textura rect, y usar mi icono de moneda en lugar de texto para indicar que este es el precio de compra Lo configuraré para que se ajuste proporcional al ancho y mantenga su relación de aspecto para que coincida con la altura del nodo a la derecha. Luego cambia eso de nuevo al nodo de etiqueta normal y llénalo con un número de muestra Después muévalos al fondo de la rejilla. Luego también agregaré un botón al fondo para permitir que el jugador compre este barco. Y encogerlo al centro horizontalmente para que coincida con el diseño. Puede que no tenga mucho sentido tener solo un chip a la venta, así que cambiaré el tipo del barco a un botón de opción. Se trata de un botón que presentará al jugador varias opciones para elegir. Este botón de opción está heredando sus propiedades de tematización del Estoy bien usando mi tema de botón para el botón de compra, pero me gustaría que el botón de opción tuviera un estilo diferente. Seleccionando el nodo raíz para ver el editor de temas, agreguemos el botón de opción al tema. Esto nos permitirá anular las propiedades del tema que hereda el botón de opción del botón La mayoría de las propiedades del tema para el botón Opción son idénticas a las del nodo de botón normal, lo que nos permite cambiar los colores de fuente e icono de todos los estados de botón. Color de contorno de fuente, tamaño de fuente y fuente, y cuadros de estilo para cada uno de los estados de botón, también. Usaré style Box flat para mi botón de opción y haré que se vea igual que el nodo de edición de líneas. Después duplica esta caja de estilo para prensarla, hazla única, cambia el color del borde a un tono más claro. Úselo para pasar el cursor, pasar el cursor presionado y enfocar. Entonces solo usaré una caja de estilo vacía para discapacitados. Podemos ver cómo se ven nuestros cambios en la ventana de vista previa del tema sin ejecutar el juego. En la sección de iconos, podemos cambiar el aspecto de la flecha hacia abajo proporcionando un icono diferente. Al igual que con los menús desplegables, este icono tiene 16 píxeles al cuadrado y no se redimensionará, es importante que el icono con el que lo reemplaces tenga el tamaño adecuado También hay una propiedad de tema para un icono que se dibujará a la izquierda del texto en el botón. Voy a dejar caer otro icono para mostrarte cómo es eso. En la sección constante, hay una propiedad para establecer el tamaño del botón para que coincida con su caja de estilo más grande en caso de que sus cuadros de estilo sean de diferentes tamaños. Esto funcionará cuando mi botón de opción esté deshabilitado, ya que el cuadro de estilo vacío es más pequeño que el resto. El margen de flecha es cuántos píxeles hay entre la flecha hacia abajo y el lado derecho del botón. La separación horizontal es la cantidad de espacio que hay entre el icono del lado izquierdo y el texto del botón. ancho máximo del icono se puede utilizar para limitar el tamaño del icono izquierdo. No tiene ningún efecto en la flecha hacia abajo. Modular flecha, si se le da algún valor distinto a cero, modulamos el icono de flecha con el color de fuente del texto de los botones en todos sus diversos estados de botón Y el tamaño del contorno dibuja un contorno alrededor del texto tal como conocemos. No quiero usar el icono de la izquierda para mi juego, así que lo eliminaré. Seleccionando el nodo de botón de opción, echemos un vistazo a sus propiedades en el inspector. La sección de artículos expandibles funciona igual que la que usamos para construir nuestros menús desplegables. Entonces agregaré un artículo por cada barco en mi juego. cada elemento se le puede asignar un icono si lo desea, deshabilitado o utilizado como separador. El número de identificación se utiliza para identificar qué elemento de la lista está seleccionado actualmente. Con seleccionado como negativo , no se selecciona ningún elemento. Ajustar al artículo más largo dimensionará el botón completo para acomodar mejor el artículo con el texto más largo. Apagado, el botón cambiará de tamaño para que se ajuste al texto de solo el elemento seleccionado Y y el botón Permitir reseleccionar permitirá al jugador seleccionar el mismo ítem que ya está seleccionado, emitiendo nuevamente la señal seleccionada También están disponibles muchas de las mismas opciones, cuales fueron heredadas del botón y del botón Base que ya hemos explorado. Está claro que cada una de mis naves va a necesitar otra propiedad, su precio de compra. Entonces cambiando a ScriptVew, agregaré una variable al script de la nave para el precio del Recuerda guardar el guión. Entonces dale a cada recurso de barco un valor diferente por su precio. Voy a cambiar el nombre de mi botón Por. Conectemos la señal de los botones By presionados al guión del administrador de barcos. Y también la señal seleccionada del ítem desde el botón de opción. También hay una señal que se emitirá cuando un elemento en el menú emergente esté enfocado si lo necesita. Al igual que hicimos con la información del barco de los jugadores, vamos a completar la información en el lado derecho de la pantalla con la información del barco que se selecciona desde el botón de opción en función de su índice Así que tendremos que almacenar referencias al botón de opción de textura destrozada y a los nodos de etiqueta más el botón By Como ordené todos estos nodos en un contenedor de caja horizontal, todas estas rutas ya no son válidas. Podría cambiar el nombre de todos mis nodos para que tengan nombres únicos y usar referencias de nombres únicos, pero simplemente agregaré el contenedor de caja horizontal a la ruta. Podemos copiar casi todas las líneas de código desde la actualización de la información del barco del jugador a la función de valor de tipo seleccionado para actualizar la información sobre el barco en venta, simplemente cambiando el índice de matriz al índice del barco que se seleccionó. Esto solo funcionará si los índices de matriz de la matriz de barcos son los mismos que los números de identificación de los elementos en el menú emergente de botones de opción. Podemos garantizar esto generando los elementos de botones de opción nosotros mismos a partir de este script. Anulando la función ready, podemos iterar a través de cada uno de los barcos en el array ship, luego agregar un ítem al botón de opción, el tipo de Dado que la matriz de envío está indexada desde cero contando hacia arriba, agregando cada artículo al botón de opción, los números de identificación coincidirán exactamente Pero debemos eliminar todos los elementos del botón de opción y hacer que inicie el juego vacío para que esto funcione. Cuando se inicia un nuevo juego o se carga un juego, recuperamos el índice del barco que el jugador ya tiene. No quiero permitir que el jugador compre el mismo barco que ya tienen o uno que sea de menor calidad. Entonces contaré desde cero hasta el tamaño de la matriz de barcos y deshabilitaré cada artículo cuyo número de índice sea menor o igual que el índice de barcos actual del jugador. Luego seleccionaré la siguiente mejora disponible para el jugador si la hay. Si el barco actual del jugador es el último número de índice de la matriz de barcos, no hay más mejoras, así que le diré al botón de opción para seleccionar uno negativo, y todas las opciones se deshabilitarán. De lo contrario, el botón de opción puede seleccionar el artículo cuyo índice sea uno más que el índice de barcos actual del jugador. Como estoy permitiendo que se seleccione uno negativo, esto obviamente no es un índice de matriz válido, así que necesitaré agregar una condición a la función seleccionada del valor on type para acomodarlo. Y en su lugar eliminar toda la información. Lo último que quiero hacer es desactivar el botón de compra si el jugador no tiene suficiente dinero para comprar el barco actualmente seleccionado. Agarrando una referencia al contador de oro del jugador. Simplemente voy a establecer el valor de comprar punto desactivado para que sea lo opuesto al punto dorado tiene suficiente, pasando el valor del chip actualmente seleccionado. Esta función no existe, así que cambiemos al script del contador y lo agreguemos rápidamente. Copiando la definición de gasto, simplemente necesitamos devolver si la cantidad del recurso es mayor o igual a la cantidad en cuestión. Mientras estoy aquí, voy a descomentar la función de entrada para poder hacer trampa para obtener más dinero Por último, al presionar el botón de compra, llamaremos a gold dot spend, pasando el precio del barco actualmente seleccionado para la venta, y poner esto dentro de una declaración I nos permite reaccionar ante si el jugador tiene o no suficiente oro para hacerlo. Esto nunca debería suceder ya que desactivamos el botón de manera preventiva si no tienen suficiente oro, pero está bien tener redundancia Si la transacción se realizó correctamente, estableceremos el índice de barcos actual del jugador el barco seleccionado actualmente. Después actualice la información del barco del jugador y los barcos a la venta, también. De lo contrario, voy a imprimir un mensaje de error para que sepa que esto sucedió. Al configurar el índice seleccionado del botón de opción a través de nuestro script, no se omitirá la señal del ítem seleccionado. Pero podemos llamar fácilmente a nuestra función directamente en su lugar. Pasando el índice seleccionado, solo lo configuramos en. Ejecutando el juego, el jugador comienza con un cortador y la captura se muestra a la venta. Ampliando el botón de opción, al jugador no se le permite comprar otro cortador, sino que también puede ver la goleta Al comprar la captura, se actualiza la información del barco del jugador y se muestra la goleta para la venta Ampliando el botón de opción, la goleta es ahora la única opción Dándome más dinero, volveré a seleccionar la goleta para activar el botón de compra Si lo compramos, ahora ya no hay más barcos a la venta. También debería desactivar el botón de compra si no hay nada que comprar. Ahora tenemos naves a la venta que el jugador puede comprar como actualización. En la siguiente lección, crearemos múltiples páginas diferentes de información entre las que el jugador puede cambiar. Te veré en la siguiente lección. 32. Recipiente dividido horizontal: Hola, amigos. En la lección anterior, permitimos que el jugador comprara barcos más grandes y mejores. En esta lección, permitiremos que el jugador cambie el tamaño de las regiones del panel del juego Esta página de gestión de barcos de mi juego está claramente dividida en dos regiones de información, el barco actual del jugador y los barcos que el jugador puede comprar. Organizados en un contenedor de caja horizontal, ninguno de estos ocupa la totalidad del espacio provisto para ellos, lo que se están expandiendo para dividir el espacio de manera uniforme. En casos como este, hay un nodo de control que podemos usar para darle al jugador más control sobre el layout, permitiéndole redimensionar la división de un espacio entre dos nodos de control, un contenedor dividido Los contenedores divididos pueden ser horizontales o verticales, pero solo pueden tener dos nodos hijos y dividirán el espacio disponible entre ellos y además permitirán al jugador ajustarlo. Si renombro este nodo, todas mis rutas de nodo se romperán. Así que voy a dejar el nombre tal cual. No parece que nada haya cambiado, pero si ejecutamos el juego y pasamos el mouse sobre el centro del panel del juego, ahora hay una barra en la que podemos hacer clic para agarrar y arrastrar hacia la izquierda o hacia la derecha para cambiar el tamaño de cada cada lado solo se le permitirá encogerse hasta el punto en que sus propios nodos de control secundarios no puedan colapsar más. Seleccionando el contenedor dividido horizontal, echemos un vistazo a sus propiedades en el inspector. El desplazamiento de división se puede utilizar para ajustar la posición de la división, siendo cero donde se sentaría naturalmente después del primer nodo de control hijo, el movimiento negativo hacia la izquierda y el positivo hacia la derecha. Colapsado ignorará el desplazamiento de división, colapsará el primer nodo de control hijo y colocará la división inmediatamente después de ella. visibilidad del dragger se puede utilizar para ocultar el arrastrador, haciéndolo inutilizable o ambos ocultarlo y colapsarlo eliminando la separación de píxeles entre los Seleccionando el nodo raíz para que podamos ver el editor de temas, podemos agregar el contenedor dividido horizontal a nuestro tema. En la sección constante, podemos eliminar el comportamiento auto ocultado del capturador cambiando el valor a cero, lo que hará que el capturador grosor mínimo de agarre es el ancho o alto de píxeles del área en la que se puede hacer clic generado para rodear al capturador, ya que los iconos del capturador suelen ser muy delgados, y la separación es el número de píxeles que separan los dos nodos de control secundarios En la sección de iconos, hay tres iconos capturadores diferentes, pero solo necesitamos cambiar el de arriba Los capturadores horizontales y verticales son propiedades del contenedor dividido de clase padre y no serán utilizados por este nodo contenedor dividido horizontal Ejecutando el juego, podemos ver que el agarrador ya no se esconde automáticamente cuando el mouse no lo está tocando El área que separa los dos nodos hijos es más ancha de lo que era antes, igual que el área en la que se puede hacer clic Ahora tenemos nuestro contenedor de margen dividido en dos regiones redimensionables En la siguiente lección, le daremos al jugador varias páginas de información entre las que pueden cambiar. Te veré en la siguiente lección. 33. Contenedor de pestañas: Hola, amigos. En la lección anterior, permitimos que el jugador cambiara el tamaño de parte del juego En esta lección, permitiremos que el juego muestre múltiples páginas diferentes de información. Mi ventana de juego ahora se ve más llena, y no podría apretar más mecánicas sin abrumar al jugador con demasiada información en exhibición de una vez. Para resolver esto, hagamos del nodo que está debajo de la barra de menú un contenedor de pestañas. La descripción nos dice que el contenedor de pestañas creará una pestaña para cada control secundario, mostrando solo una a la vez. Hacer que el nodo de barco sea hijo del contenedor de pestañas. Se convierte en una pestaña dentro del contenedor de pestañas. Agregaré varias pestañas más agregando más hijos al contenedor de pestañas. Todos ellos serán contenedores de margen. Tendré uno para que el jugador maneje la tripulación de su barco, otro para comprar y vender carga, y uno para navegar a otro puerto. Las pestañas generadas por el contenedor de pestañas se pueden reorganizar cambiando el orden de sus hijos Con la reordenación del árbol de escenas, el script del administrador de barcos habrá desconectado su ruta al nodo contador de recursos de oro Puedo arreglar esto dándole al contador un nombre único y usando la anotación del signo de porcentaje en lugar de la ruta del nodo Volviendo a dos vistas D y seleccionando el contenedor de pestañas, echemos un vistazo a las propiedades del contenedor de pestañas en el inspector. Las pestañas están alineadas a la izquierda por defecto, pero se pueden mover hacia la derecha o al centro. También se pueden mover a la parte inferior del contenedor de pestañas. pestaña actual es el número de índice hijo de la pestaña que se está mostrando actualmente. Si hay tantas pestañas que no todas caben a lo largo del contenedor de pestañas, entonces se recortarán las pestañas adicionales y se proporcionarán botones de navegación para que el jugador se desplace por ellas. Si las pestañas de clip están deshabilitadas, entonces el contenedor de pestañas se expandirá para acomodar todas sus pestañas. Al desactivar las pestañas visibles, se ocultará toda la barra de pestañas. Las pestañas aún existen y se pueden usar a través del guión, pero el jugador no podrá hacer clic en ellas. Todas las pestañas en la parte delantera se pueden usar para dibujar todas sus pestañas sobre el contenido en lugar de debajo. Voy a demostrar cómo es esto más tarde. Si arrastrar para reorganizar está habilitado, el jugador puede hacer clic y arrastrar pestañas para reorganizar sus posiciones en la barra de pestañas Si esta configuración está activada y tiene varios contenedores de pestañas visibles y desea que el reproductor pueda hacer clic y arrastrar pestañas de un contenedor de pestañas a otro, entonces puede configurar todos los contenedores de pestañas para que las mismas pestañas reorganicen el ID de grupo para permitir este uso compartido de pestañas Con el valor predeterminado de uno negativo, las pestañas no podrán reubicarse en ningún otro contenedor de pestañas Con las pestañas usadas para el tamaño mínimo desactivadas, el contenedor de pestañas cambiará el tamaño para acomodar el contenido de cada pestaña a medida que se selecciona Al encenderlo, cada pestaña tendrá el tamaño de la pestaña más grande. modo de enfoque de tabulación se puede usar para controlar cómo las pestañas de la barra de pestañas pueden tomar el foco, por defecto en los controles del mouse y del teclado Puede restringir a permitir que solo clics del mouse den el foco a la barra de pestañas, por lo que al presionar la tecla de tabulación en el teclado o las teclas de flecha no se permitirá que el reproductor cambie el enfoque a la barra de pestañas. Pero si la barra de pestañas tiene foco al hacer clic, entonces las teclas de flecha aún se pueden usar para navegar entre pestañas, o ninguna se puede usar para nunca permitir que la barra de pestañas agarre el foco. El jugador aún podrá hacer clic en las pestañas para cambiar entre ellas, pero no agarrarán el foco, por lo que las teclas de flecha no se utilizarán para cambiar de tabulación. Si anular la selección habilitada está activada, entonces el valor de la pestaña actual se puede establecer en negativo para que todas las pestañas queden sin Después de configurar las propiedades para mi contenedor de pestañas, haré que se expanda verticalmente para llenar el espacio de mi ventana de juego. Seleccionando el nodo raíz para que podamos ver el editor de temas, agreguemos contenedor de pestañas al tema. Comenzando en la sección de iconos, podemos anular los iconos utilizados para los botones de incremento y decremento que el jugador usa para desplazarse por las pestañas recortadas y sus contrapartes resaltadas que se muestran cuando el jugador pasa el mouse sobre ellas También podemos cambiar el marcador de caída que se mostrará entre pestañas mientras arrastra y suelta una pestaña, y un icono de menú, si a este contenedor de pestañas se le ha dado un menú emergente, así como su resaltado En la sección de colores, podemos proporcionar un color de modulación para el marcador de caída. Un color de contorno de fuente y colores de fuente para cada estado de las pestañas en la barra de pestañas. Antes de continuar con el resto de las opciones temáticas, ejecutemos el juego y veamos cómo funcionan estos ajustes. Ya que mis pestañas están siendo recortadas, podemos hacer clic en los botones de incremento y decremento para navegar por ellos Puedo hacer clic y arrastrar pestañas para reorganizarlas, y el marcador de caída se dibuja y modula para indicar dónde se colocará la pestaña si suelto el botón del mouse No se muestra ningún icono de menú porque a este contenedor de pestañas aún no se le ha asignado un menú emergente. Voy a cambiar la modulación del marcador de caída de nuevo a blanco. Ahora eliminaré el exceso de pestañas en mi contenedor de pestañas. Si agregamos un menú emergente como hijo del contenedor de pestañas, no generará una nueva pestaña, ya que el nodo del menú emergente no es un nodo de control. Lo pondré como el niño superior del contenedor de pestañas para facilitar las cosas. Y solo hay que poner un elemento en el menú emergente que diga, Hola, Si adjuntamos un script al contenedor de pestañas, no voy a estar guardando este script en mi juego, así que simplemente lo dejaré en la carpeta principal de recursos con el nombre por defecto. Anulando la función ready, podemos llamar a la función contenedor tab set pop up, que acepta un pop up como argumento podamos pasar ese get child con el índice child de cero, el niño superior, el nodo de menú pop up. A continuación, cambiaré al guión del administrador de barcos. Las pestañas no solo pueden tener texto sino también iconos. Pero al igual que el menú pop up, deben agregarse a través de un guión. Así que vamos a exportar una variable que será el icono de las pestañas de barco como una textura dos D, que podemos poblar en el inspector Entonces en la función ready, sabiendo que se trata de un hijo directo del contenedor tab, podemos llamar a Get parent para hacer referencia al nodo padre de este nodo. Después llame a la función del contenedor de pestañas, establezca el icono de tabulación, aceptando el número de índice de la pestaña y la textura del icono como argumentos. Entonces le pasaré el índice número tres y la textura exportada. Volviendo al editor de temas en la sección constante, podemos darle a este icono un ancho máximo de píxeles. El número de píxeles que separan el icono del texto de cada pestaña, el tamaño del contorno de fuente y cuántos píxeles de espacio de margen se agregan a cada extremo de la barra de pestañas. Como siempre, ignoraré la configuración de fuente y tamaño de fuente y usaré mi configuración de tema predeterminada. En la sección de estilo, podemos cambiar la forma en que se dibujan el contenedor de pestañas , la barra de pestañas y las pestañas. Voy a establecer todos ellos con diferentes texturas de caja de estilo. Panel es el relleno de fondo del contenedor de pestañas donde se dibujará el hijo activo. Esto generalmente se dibuja sin costuras con el estilo de pestaña seleccionado. Esta imagen tiene esquinas redondeadas, así que voy a añadir márgenes de textura de 16 pixeles. Voy a copiar esto al estilo de la pestaña seleccionada, pero la haré única ya que no quiero que las pestañas tengan las esquinas redondeadas en la parte inferior. Ampliando la sección de subregión, luego haciendo clic en el botón Editar región, podemos usar solo una porción de la imagen proporcionada para dibujar el cuadro de estilo Con el ajuste de cuadrícula, puedo cortar los 16 píxeles inferiores para eliminar las esquinas redondeadas Ahora la pestaña seleccionada parece que está conectada directamente al panel. También eliminaré los márgenes de textura inferior. Esto moverá el texto y icono hacia abajo en la pestaña seleccionada, haciendo que parezca más como si estuviera por encima de los demás. Copiando estos dos no seleccionados y haciéndolos únicos, sustituiré la textura por una más oscura, luego volveré a colocar el margen de textura inferior, moviendo el texto y el icono hacia arriba Luego repita el proceso para agregar diferentes texturas para Enfoque duro, y deshabilitado. fondo de la barra de pestañas también se le puede dar un cuadro de estilo, así que usaré una sombra. Al ejecutar el juego, ahora tenemos una barra de pestañas estilizada, y la pestaña de barco incluso tiene un icono de barco El icono de menú se muestra a la derecha, y podemos hacer clic en él para abrir un menú emergente. No tengo planes de usar este menú para nada en mi juego, así que lo eliminaré. Eliminar el script del contenedor de pestañas y eliminar el script de los recursos de mi proyecto. Si tus pestañas son muy ornamentadas en su diseño y les das márgenes de expansión lo suficientemente grandes como para superponerse con el contenido de la pestaña seleccionada, Esto es cuando todas las pestañas dibujadas al frente se pueden usar para dibujar todas las pestañas frente contenido de la pestaña seleccionada Voy a revertir estos cambios de nuevo a la forma en que estaban. Ahora tenemos múltiples pestañas entre las que el jugador puede cambiar. En la siguiente sección, usaremos más nuevos nodos de control para agregar más mecánicas. Te veré en la siguiente sección. 34. Árbol A: Hola, amigos. En la sección anterior, permitimos que el jugador manejara su nave. En esta sección, permitiremos que el jugador administre su tripulación. Cambiando a la pestaña de tripulación, agregaré una estructura de nodo similar a esta pestaña como la pestaña del barco, comenzando con un contenedor dividido horizontal que contiene dos contenedores de caja vertical, uno para la tripulación que tiene actualmente el jugador y el otro para las personas que pueden contratar, tanto expandiéndose horizontalmente llenando el espacio verticalmente. Después en el lado izquierdo, agregaré un nuevo nodo llamado árbol y haré que el árbol se expanda para llenar el espacio verticalmente. Si seleccionamos el nodo raíz y echamos un vistazo al editor de temas, aquí hay un árbol que podemos ver poblado con diferentes tipos de elementos de árbol, incluyendo texto plano, texto editable, una casilla de verificación, una caja de rodillo y una lista de opciones Los tres últimos también se clasifican como hijos de otro artículo del árbol. Hay una barra de desplazamiento que se puede usar para desplazarse por los elementos del árbol si el árbol es más alto que el área asignada Los elementos del árbol padre se pueden contraer o expandir para ocultar o mostrar a sus hijos. Pensé que esta sería una manera ordenada de representar la cadena de mando de los tripulantes de mi nave. Seleccionando de nuevo el árbol, no hay forma de poblarlo con elementos de árbol de aquí Debe hacerse a través de un guión. Reconociendo que así es funciona el árbol de escenas en la pestaña de escenas del Gudo Editor, puedo recrear exactamente lo que quiero en mi árbol usando nodos básicos Siendo el tope de la jerarquía el capitán, seguido del primer mate, el segundo y el tercer mate. Yo en tiempos pasados, pueden haber tenido también un cuarto compañero. Puedo reorganizar estos nodos para que el primer mate tenga autoridad sobre el segundo, tercer y cuarto compañero y agregue más hijos a cada uno de ellos. El segundo compañero se encarga de la navegación, por lo que tendrán un navegante, timonel, Brelman, topman y El tercer compañero se encarga de la seguridad y el combate, por lo que tendrán bajo su mando al contramano o contramano, un constructor de embarcaciones en inglés moderno, carpintero, cirujano y Y finalmente, el cuarto compañero, si hubiera uno, estaría a cargo de la logística y los recursos, por lo que comandarían al cocinero, carnicero, y carnicero. Quizá también quiera permitir pagar a los pasajeros a bordo del barco. Adjuntando un script a la pestaña de tripulación, exportaré un ícono para ello, lo rellenaré con el ícono de tripulación para mi juego y lo configuraré como el ícono de pestaña de contenedores de pestaña para esta pestaña en la función listo la misma manera que la pestaña de barco Entonces voy a agarrar una referencia al nodo del árbol. Vamos a escribir una función que agregue un elemento al árbol. Podemos agregar un elemento al árbol llamando a su función create item, que acepta argumentos opcionales para el padre del elemento que se está creando y el número de índice hijo. Ignorando estos argumentos, este ítem se creará como la raíz del árbol Si queremos cambiar algo sobre este artículo, necesitamos almacenar una referencia a él en una variable de tipo tree item. Lo nombraré nuevo artículo. Entonces podemos llamar a la función set text en este elemento de árbol recién creado, que requiere un número de columna y argumentos de texto. El árbol actualmente solo tiene una columna, por lo que el índice de columna es cero, y voy a poner el texto en el que quiero configurarlo como parámetro de la función. Sabiendo que voy a tener muchos artículos de árbol, los guardaré en un diccionario, luego asignaré el elemento de árbol en índice de texto para que sea el nuevo elemento. Entonces ahora para agregar al capitán al árbol, todo lo que tengo que hacer es llamar a mi función pasando el nombre del nodo hijo superior del árbol. Si quiero agregar el resto de ellos al árbol, también necesito especificar el elemento del árbol padre al llamar a create item, así que ese puede ser otro parámetro de la función. Al llamar a esta función para el capitán, el elemento del árbol padre será nulo. Ahora necesito atravesar la jerarquía que he construido en mi árbol de escenas, agregando cada elemento al árbol con el padre correcto, lo que parece complicado, pero se puede simplificar usando recursión, es decir, una función que se llama a Para que sea aún más simple, mantendré la lógica recursiva separada de agregar un elemento de árbol y hacerlo en una función separada, que voy a nombrar populate El primer parámetro de esta función será el nodo actual en el árbol de escenas, y también necesitaré saber el elemento del árbol padre si hay uno. Entonces puedo llamar a la función de elemento del árbol AD, especificando el nombre del nodo como texto y pasando por el elemento del árbol padre. Luego almacenaré esto en una variable local que lo devuelve de la función de elemento de AdTree Usando un bucle cuatro para iterar a través de todos los hijos de este nodo, simplemente podemos llamar a esta función de árbol de relleno nuevamente en el nodo hijo y darle el elemento de árbol padre generado desde el nodo actual Si el nodo actual no tiene hijos, este bucle de cuatro no se ejecutará. La función ready solo necesita iniciar este proceso, comenzando con el nodo secundario superior del árbol y ningún elemento del árbol padre. Al ejecutar el juego, el árbol está poblado con la estructura de nodos exacta del árbol de la micina. Cada elemento del árbol se puede seleccionar y los elementos principales se pueden contraer o expandir. Seleccionemos el nodo de árbol y echemos un vistazo a sus propiedades en el inspector. Las columnas pueden agregar columnas adicionales al árbol, dando a cada elemento del árbol múltiples entradas de texto, una para cada columna. Voy a tener tres columnas para mi árbol para mostrar roles, nombres y pagar. Los títulos de las columnas están ocultos por defecto, pero se pueden hacer visibles con esta casilla de verificación Permitir reselección emitirá la señal seleccionada nuevamente si el jugador hace clic en el elemento seleccionado, y podremos cambiar si el botón ight Mouse puede ser utilizado o no para seleccionar elementos Permitir búsqueda permitirá que el jugador navegue por los elementos del árbol escribiendo, haciendo coincidir el texto de cada elemento. Ocultar plegado ocultará las flechas de colapso o expansión, y habilitar el plegado recursivo permitirá al jugador mantener presionada la tecla Mayús para expandir o contraer niños recursivamente Ocultar raíz ocultará el elemento del árbol raíz. En mi caso, ese sería el capitán. Las banderas del modo de caída pueden cambiar la forma en que el jugador arrastra y deja caer datos en el árbol, pero eso está más allá del alcance de este curso modo de selección puede cambiar si el jugador selecciona un solo elemento, varios elementos o una fila del árbol. el desplazamiento horizontal y vertical También se puede activar o desactivar Ahora con múltiples columnas y títulos visibles, agregaré títulos a cada una de mis columnas llamando a la función de título de columna establecida del árbol. Después también establece la última columna para que no se expanda. Por lo que las columnas de rol y nombre ocuparán la mayor parte del espacio del árbol. Después de tomar una referencia al menú emergente de archivos, necesitaremos conectar la señal de restablecimiento de archivos al guión del administrador de la tripulación para reaccionar ante el jugador ya sea iniciando una nueva partida o cargando su juego y poblar las dos columnas restantes del árbol con su nombre de tripulación y tarifas Dado que los elementos del árbol se almacenan en un diccionario, tendría sentido almacenar también datos de la tripulación del jugador en un diccionario coincidente. Por ahora, solo inicializaré este diccionario para que ya contenga un esqueleto de tripulación para el barco, empezando por el capitán Cada miembro de la tripulación necesita múltiples piezas de información, para que puedan almacenarse en otro diccionario, dándole al capitán un nombre predeterminado y una tasa de pago de oro cero. Después agregaré un navegante, timonel, topman y marinero, cada uno con nombre y tarifa de pago De vuelta en el guión del administrador de la tripulación, cuando se restablece el archivo, podemos poblar el árbol con los miembros de la tripulación del jugador, pero también es posible que tengamos que borrar los que ya están ahí Así que iterando a través de cada papel en el árbol, comprobaremos si la tripulación del jugador tiene ese papel Entonces llama a otra función, especificando el elemento del árbol que estamos cambiando, junto con el nombre y la tasa de pago los estamos cambiando con valores en blanco en el caso de que el jugador no tenga ese rol. Escribiendo esta función, aceptando los mismos parámetros, podemos simplemente establecer el texto del elemento del árbol en las otras columnas para que sean los valores pasados en. Ahora el árbol se rellena automáticamente con los nombres y tasas de pago de la tripulación del jugador, pero me gustaría que el sueldo del capitán estuviera en blanco y su nombre editable Establecer el elemento de raíces de árbol para que sea editable en la columna uno es bastante simple con una llamada a una función Entonces, al rellenar un miembro de la tripulación, solo estableceré el texto de la segunda columna si el ítem no es el ítem raíz Conectando la señal editada del ítem al guión del gerente de la tripulación, podemos reaccionar ante el jugador editando el nombre de su capitán. Esto no nos proporciona ningún argumento, pero se almacenan en la clase de árbol y se pueden recuperar con funciones get. En el caso de mi árbol, solo un elemento del árbol es editable, así que realmente no necesito saber nada más que lo que el jugador ingresó para el nombre del capitán Si no está vacío, cambiaré el nombre del capitán en los datos guardados del jugador. O si está vacío, vuelva el elemento del árbol al valor Esto funciona siempre y cuando cada rol sea único, pero tal vez quiera tener algunos roles con varios miembros de la tripulación. En estos casos, cambiaré el valor almacenado en mis datos guardados de un diccionario que describe a un miembro de la tripulación a una serie de diccionarios que describen una lista de miembros de la tripulación. Le voy a dar al jugador varios marineros y mejores hombres para que realicen operaciones básicas de navegación del barco, cada uno con nombres únicos, pero dejaré su paga igual porque mi barco está sindicalizado De vuelta en el guión del administrador de tripulación, al crear el árbol, necesitaré agregar tantos elementos de árbol como el número máximo de roles duplicados que pueda haber, que indicaré en el árbol de escenas agregando X seguido de un número al nombre del rol. Entonces al rellenar el árbol, buscaré la letra X en el nombre del nodo y la guardaré en una variable Si no se encuentra la letra X , devolverá una negativa como resultado. Declarando nuevas variables para el rol y la cantidad de ese rol, el rol por defecto en el nombre del nodo y la cantidad por defecto en uno, si se encuentra X, entonces puedo analizar estos valores del nombre del nodo usando la función de subcadena con el rol que está antes de X y la antes de X y la Luego llame al elemento del árbol de anuncios con las variables. Agregar elemento de árbol necesitará un nuevo parámetro de cantidad, y si la cantidad es algo mayor que uno, entonces la entrada del diccionario para ese elemento de árbol deberá ser una matriz de elementos de árbol, al igual que el diccionario de tripulación. La creación del elemento de árbol se puede envolver en cuatro bucles contando hasta la cantidad. Y en función de si la cantidad es o no una, ya sea establecer la entrada del diccionario el elemento o anexarla a la matriz de elementos no quiero un montón de Sin embargo, no quiero un montón de papeles repetidos en blanco en el árbol, así que estableceré la visibilidad de los elementos del árbol para que solo sea verdadera para el primero, luego falso para el resto. Cuando se recibe la señal de restablecimiento de archivos, será necesario ejecutar un código diferente en función de si el rol es o no una matriz. Si se trata de una matriz y el jugador tiene ese papel en su diccionario de tripulación, entonces la cantidad de ese rol será del tamaño de la matriz. Iterando a través de todos los roles que están disponibles en el árbol Si yo es menor que cantidad, entonces el elemento del árbol en el rol índice I se puede rellenar con los datos de la tripulación del jugador en los mismos índices. De lo contrario, quedarán en blanco. Y la visibilidad del artículo también se puede establecer en true si yo es cero o yo es menor que cantidad. Por lo que al menos uno de cada rol siempre se mostrará incluso cuando el jugador aún no los tenga. Al ejecutar el juego, podemos ver que el jugador ahora tiene múltiples tripulantes asignados a los mejores roles de Hombres y Marinos Ahora tenemos un nodo de árbol que muestra la tripulación del jugador. En la siguiente lección, repasaremos las opciones de tema disponibles para el nodo de árbol. Te veré en la siguiente lección. 35. Árbol B: Hola, amigos. En la lección anterior, utilizamos un árbol para mostrar la tripulación del jugador. En esta lección, exploraremos las opciones de tema disponibles para el nodo de árbol. Antes de eso, sin embargo, voy a cambiar este parámetro de nombre a nombre de tripulación para deshacerme de la advertencia. Con el nodo raíz seleccionado, agreguemos el nodo de árbol al tema del juego. Comenzando en la sección constante, podemos establecer si las líneas horizontales que separan cada elemento del árbol se dibujarán o no cambiando la propiedad de la guía de dibujo a cero o no cero. Lo mismo se puede hacer para las líneas de relación que muestran las relaciones padre hijo más claramente las relaciones padre hijo de los elementos del árbol. El ancho de la línea de relación se puede cambiar aquí. Y podemos proporcionar diferentes anchos de línea de relación para las relación secundarias, así como las líneas de relación padre También podemos separar la línea de relación padre de las líneas de relación entre hermanos no seleccionadas agregando un margen de píxel La separación horizontal son los píxeles de espacio entre columnas del árbol, así como el lado izquierdo del árbol si se desactiva el plegado. las celdas de elementos de árbol se les pueden dar píxeles de espacio de margen en las cuatro direcciones. El margen del artículo también proporcionará una sangría adicional a la izquierda de los elementos del árbol tamaño del contorno es el contorno de la fuente con el que ya estamos muy familiarizados. borde de desplazamiento y la velocidad de desplazamiento son para alterar el comportamiento del desplazamiento de arrastrar y soltar solamente, no como se comporta naturalmente la barra de desplazamiento, por lo que no estaremos usando esto Podemos agregar separación horizontal de píxeles entre los elementos del árbol y la barra de desplazamiento vertical, así como la separación vertical de píxeles de la barra de desplazamiento horizontal si la hay. Y también podemos dar márgenes a las barras de desplazamiento. La separación vertical agrega separación de píxeles entre cada elemento de árbol. Los elementos de árbol pueden contener múltiples botones, y podemos usar esta propiedad para cambiar la separación horizontal entre los botones. ancho máximo del icono se puede usar para limitar el tamaño de los iconos proporcionados para los elementos del árbol, y su altura se ajustará automáticamente para mantener su relación de aspecto. Exportaré otro ícono del guión de mi gerente de tripulación y lo agregaré a la raíz del árbol en la columna uno, para que el jugador pueda ver claramente que se le permite editar el nombre de su capitán. Ejecutando el juego, el nombre del capitán ahora tiene un icono para indicarle al jugador que se puede editar. De vuelta en el editor de temas en la sección de colores, hay colores de fuente para el texto de elemento de árbol predeterminado, texto fuente deshabilitado para cuando un elemento de árbol es editable o una casilla de verificación, pero también está deshabilitado, el color de contorno de fuente, el color de fuente de los elementos de árbol seleccionados y también los colores de fuente del título de columna Podemos cambiar el color de las pautas aquí, y también podemos cambiar el color de las líneas de relación y tener diferentes colores para la relación hijo y las líneas de relación padre. color de posición de caída es el color utilizado para indicar dónde se colocarán los elementos arrastrados, y el resaltado de fuente de botón personalizado solo se usa para botones personalizados cuando el mouse se coloca sobre ellos No vamos a utilizar ninguna de estas opciones. Hay diferentes opciones de fuente y tamaño de fuente para los elementos del árbol y los títulos de las columnas, pero seguiré usando mis valores predeterminados de tema para esos En la sección de iconos, podemos cambiar cómo se ven las flechas de expandir y contraer, así como casillas de verificación cuando están marcadas o desmarcadas, habilitadas o deshabilitadas y estados indeterminados Útil para los artículos de tratamiento padre que contienen listas de casillas de verificación como hijos Por lo que el padre puede mostrar la casilla de verificación indeterminada para indicar que algunos pero no todos los hijos este comportamiento no es automático Sin embargo, este comportamiento no es automático y debe ser guionado. El icono de flecha de selección se dibuja para indicar botones de opción que muestran un menú emergente, y el icono updwn se usa para cajas giratorias que editan números dentro de un rango El jugador podrá hacer clic en la flecha hacia arriba para aumentar o en la flecha hacia abajo para disminuir el valor. Para crear estos diferentes tipos de elementos de árbol interactables, iré a mi función poblar miembro de la tripulación Entonces llamaré al modo de celda de conjunto de funciones en la columna dos, que es la columna de pago y cambiaré su modo para verificar. Si el valor de pago no está vacío, entonces estableceré su propiedad editable en true De lo contrario, lo pondré en falso. Ahora podemos ver que los elementos del árbol en la columna de pago son casillas de verificación y solo habilitados si el jugador tiene un tripulante para ese rol El icono del modo de celda solo mostrará un icono sin texto, y se puede usar personalizado para crear botones personalizados, pero no vamos a hacer eso. Si lo configuramos en modo rango, entonces podemos usarlo para crear un botón de opción proporcionando una lista de opciones separada por comas como la propiedad text o un rango numérico que se puede editar como un spinbox Podemos configurar las propiedades del rango del cuadro de giro llamando a set range config, proporcionando la columna, el valor mínimo, valor máximo y el valor de paso, y establecer el valor actual llamando a set range, proporcionando la columna y el valor como un flotador. Sin embargo, si el valor de pago está vacío, cambiaré el modo de celda a cadena y solo lo mostraré como el texto vacío no editable Al ejecutar el juego, el jugador puede cambiar la tasa de pago de los miembros de su tripulación dentro de rangos de uno a nueve oro por día con pasos de un oro por clic. Esta interacción también emitirá la señal editada del elemento del árbol. Entonces tendré que verificar si el artículo que se editó es el elemento raíz del árbol antes de editar el nombre del capitán. También tendré que escribir algún código adicional para cambiar la tasa de pago del miembro de la tripulación en los datos guardados del jugador aquí. Sin conocer el índice de rol o matriz del miembro de la tripulación cuyo pago fue editado, no hay mucho que pueda hacer más que iterar a través de todos ellos y verificar cuál era Así que iterando a través de todos los elementos del árbol, primero comprobaré si es una matriz Si no es una matriz y es el elemento que se editó, entonces estableceré el pago de ese rol al nuevo valor de rango, fundido a un entero. Si el rol es una matriz, entonces tendré que buscar a través esa matriz hasta encontrar la que se editó, ahora me da el índice de matriz, que puedo usar para establecer el pago del miembro de la tripulación en ese rol y el número de índice de matriz. De vuelta en el editor de temas, en la sección de estilo, podemos cambiar el panel de cuadro de estilo dibujado detrás del árbol. Solo usaré una caja de estilo vacía para ignorarla. Así como el estilo de enfoque, que se dibujará sobre todo el árbol cuando tenga foco, que también eliminaré configurándolo en vacío. Podemos cambiar los cuadros de estilo para los botones de título normalmente cuando se ciernen y cuando se presionan No quiero que mis títulos actúen como botones, así que también usaré cajas de estilo vacías para estos. La única caja de estilo que quiero usar para mi árbol será cuando se seleccione un elemento de árbol. Entonces lo configuraré en una caja de estilo plana, le daré un color oscuro con esquinas redondeadas y lo copiaré en el cuadro de estilo para el enfoque seleccionado El nodo de árbol puede incluir automáticamente barras de desplazamiento horizontales y verticales, por lo que también podríamos querer agregarlas al tema En la sección de iconos, podemos proporcionar iconos para incremento y decremento en los estados de resaltado normal y presionado Ten en cuenta que con la barra de desplazamiento vertical, incremento es el que apunta hacia abajo en No quiero incluir estos botones en mis barras de desplazamiento, pero quiero usarlos para definir el área del mouse en la que se puede hacer clic Entonces los agregaré como texturas de marcador y les daré un ancho de ocho píxeles, pero no alto Por lo tanto, nada será dibujado por ellos. Luego en la sección de estilo, puedo establecer el cuadro de estilo de desplazamiento en un cuadro de estilo plano. Conviértalo en una línea negra muy estrecha agregando un borde invisible en los lados izquierdo y derecho. Luego copiaré esto en el estilo de enfoque también. Para el agarrador, lo haré del mismo color mis botones con esquinas redondeadas y una sombra Copiando esto en los otros dos estilos, luego los haré únicos, estableceré el color del resaltado más claro y el prensado más oscuro. Todas estas mismas opciones también están disponibles para la barra de desplazamiento horizontal. Ahora tenemos nuestro nodo de árbol temático para que coincida con la estética de nuestro juego. En la siguiente lección, permitiremos que el jugador contrate y despida a los miembros de la tripulación. Te veré en la siguiente lección. 36. Contenedor de rolla: Hola, amigos. En la lección anterior, exploramos las opciones de tematización disponibles para el nodo de árbol En esta lección, permitiremos que el jugador contrate y despida a los miembros de la tripulación. Comenzaré agregando un botón debajo del nodo del árbol que dice fuego y lo encogeré hacia el centro horizontalmente. Después conecta su señal presionada al guión del gerente de tripulación. Podemos solicitar qué elemento se selecciona del nodo de árbol y almacenarlo en una variable. Si no se seleccionó nada, o si el ítem seleccionado es el capitán, que en mi juego representa al propio jugador, entonces presionar el botón de disparo no debería hacer nada. Entonces, si se seleccionó algo que no sea el capitán, obtendré el rol que se seleccionó como el texto en la columna cero del elemento del árbol seleccionado. Luego divido mi lógica en función si el rol permite a varias personas, ya sea borrando el rol de la tripulación del jugador o verificando si el tamaño de la matriz de tripulación asignada a ese rol no es cero antes de eliminar la persona en el mismo índice el índice de matriz del elemento de árbol seleccionado Esto sólo es necesario porque todavía tengo el rol representado como una entrada en blanco, aunque el jugador no tenga a nadie asignado a ese rol. Después de despedir al tripulante, solo puedo llamar al restablecimiento de archivos para actualizar el árbol de la tripulación con la nueva información. Vamos a probarlo. Podemos despedir a cualquiera de los tripulantes excepto al capitán. Intentar disparar entradas en blanco no hace nada. En el script de guardar datos, eliminaré a la tripulación inicial excepto al capitán e inicializaré las matrices como vacías A continuación, voy a necesitar generar una lista de personas que buscan trabajo que el jugador pueda contratar. Entonces agregaré un contenedor de cuadrícula al lado derecho de este panel y un botón debajo de él que dice contratar encoger al centro horizontalmente. Voy a hacer que el contenedor de rejilla se expanda para llenar el espacio tanto horizontal como verticalmente. Dando al contenedor de cuadrícula tres columnas, agregaré dos nodos de etiqueta y una textura rect como los encabezados de columna Nombrarlos y rellenarlos con rol, nombre, y mi icono de moneda Haré que las etiquetas de rollo y nombre expandan para llenar la mayor parte del espacio que puedan, colapsando la columna de pago hasta el final Voy a necesitar escribir un guión que rellene esta grilla con posibles candidatos Pero primero, no quiero que me restrinja la cantidad de espacio aquí. Voy a necesitar barras de desplazamiento como tiene el árbol. El nodo de árbol incluye desplazamiento automático. Pero si quiero que mi contenedor grid tenga desplazamiento, necesitaré agregar otro nodo, un contenedor scroll El contenedor de desplazamiento solo puede tener un nodo hijo, que recortará para que encaje dentro su rectángulo de control y proporcionará barras de desplazamiento si el hijo no encaja, que expandiré para llenar el espacio proporcionado. Podemos ver los efectos del contenedor scroll duplicando los nodos hijos un montón de veces, así que ya no cabe verticalmente y seguir agregando texto hasta que ya no encaje horizontalmente Seleccionando el nodo contenedor scroll, echemos un vistazo a sus propiedades en el inspector. Follow focus le indicará al contenedor de desplazamiento que ajuste automáticamente la posición de desplazamiento para mantener el nodo de control de enfoque visible en todo momento. Tanto el modo de desplazamiento horizontal como el vertical tienen múltiples opciones. La opción predeterminada auto solo muestra la barra de desplazamiento cuando sea necesaria, pero podemos cambiarla para que sea siempre show o nunca show o deshabilitada, expandiremos el contenedor scroll ajuste a su nodo hijo en esa dimensión, eliminando la necesidad de desplazarse en absoluto. puede agregar una zona muerta al desplazamiento táctil para ajustar su sensibilidad Al expandir la sección de desplazamiento, podemos cambiar la posición de desplazamiento predeterminada ya sea horizontal o verticalmente por píxel, así como cambiar el incremento o decremento de paso, que moverá la posición de desplazamiento cuando el jugador haga clic en esos botones He eliminado los botones de incremento y decremento de mi tema de barra de desplazamiento Ahora estoy listo para poblar esta grilla con posibles miembros de la tripulación esperando ser contratados por el jugador Centraré el texto en los encabezados de mis columnas para evitar que sean recortados por el contenedor de desplazamiento Entonces conectaré la señal de botones de alquiler presionados al guión del gerente de tripulación. Primero, tomaré una referencia al nodo contenedor de cuadrícula. También necesitaré conocer todos los roles posibles que se pueden contratar, cuales almacenaré en una matriz, y una lista de todas las personas aleatorias que genere, que también almacenaré en otra matriz. Luego, después de generar el árbol de la tripulación, establezca los posibles roles para ser la matriz de claves del diccionario de elementos del árbol, eliminando al capitán y al pasajero de los roles potenciales que se pueden contratar. Entonces llamaré a una función diferente para poblar la cuadrícula superior Lo primero que voy a hacer al poblar la grilla superior es limpiar su contenido con otra función Después de que eso esté hecho, repetiré varias veces, digamos 15 y agregaré una nueva persona a la variedad de personas que buscan trabajo Esta entrada en la matriz será un diccionario, que contendrá un rol, nombre y una tasa de pago con el nombre y tasa de pago siendo nodos de etiqueta, inicializándolos con su nombre de clase punto neu El rol será una casilla de verificación, que es otro nodo que hereda del botón De esta manera, el jugador puede marcar las casillas de todos los que quieran contratar antes de hacer clic en el botón de contratar para contratarlos a todos a la vez Estos tres nodos tienen una propiedad de texto que necesita ser poblada. Solo les voy a dar todos los valores aleatorios, comenzando con el rol siendo una selección aleatoria de posibles roles. Escogeré un nombre aleatorio de una matriz constante de cadenas de la misma manera que hice los nombres de los barcos, proporcionando una gran lista de nombres potenciales en mi guión en una etiqueta de región que puedo colapsar para evitar que se interponga en el camino. Por su paga, solo usaré un número entero aleatorio 1-9 fundido a una cadena Los tres nodos se pueden agregar a la cuadrícula superior como hijos. Borrar la cuadrícula es tan simple como iterar a través de la variedad de personas que buscan trabajo y llamar a Q gratis en las tres entradas de su diccionario, luego borrar la matriz Si ejecutamos esto ahora, la casilla de verificación no ha sido temática, y está heredando sus propiedades de tema de botón Así que agreguemos checkbox al tema del juego y hagamos que se vea más apropiado Comenzando en la sección de estilo, casillas de verificación tienen todos los mismos estilos que los botones, que eliminaré configurándolos todos en el cuadro de estilo vacío. Luego en la sección de iconos, junto con el mismo icono heredado del botón, hay iconos marcados y desmarcados habilitados y deshabilitados, y también un conjunto para botones Como siempre, dejaré la fuente y el tamaño de fuente para usar la configuración predeterminada del tema. Las mismas opciones de fuente y color de icono también están disponibles para la casilla de verificación que para el botón Tenga en cuenta que los colores de modulación de iconos solo se aplican a la propiedad de icono, no a las casillas de verificación marcadas o desmarcadas En la sección constante, alineada con el cuadro de estilo más grande con el que ya estamos familiarizados, igual que el tamaño del contorno y el ancho máximo del icono. Verificar desplazamiento vertical compensará la posición vertical los iconos de casilla de verificación por unos pocos píxeles, ya sea hacia arriba o hacia abajo. La separación horizontal agrega píxeles de espacio entre el icono de la casilla de verificación y su texto. Si la casilla de verificación tiene tanto una casilla de verificación como un icono, la separación horizontal se aplicará a Voy a quitar el icono de mi casilla de verificación. Esto se ve mucho mejor. De vuelta al guión, cuando el jugador hace clic en el botón de contratar, ya que mi juego tiene reglas sobre no tener varias personas en el mismo rol, voy a crear una matriz de todos los que fueron contratados con éxito y una cadena para el rol. Después de iterar a través las personas que buscan trabajo, luego iteraré a través de todos los que fueron contratados y los eliminaré de la variedad de personas que buscan trabajo, luego actualizaré el árbol de la tripulación Dentro de este bucle for, voy a verificar si se ha pulsado la casilla de verificación del rol de la persona , y si es así, estableceré rol para que sea el texto de esa casilla de Para saber si esta persona puede ser contratada, la lógica diferirá si el rol permite varias personas o no, lo que sé en función de si la entrada del diccionario de elementos de árbol en el índice de ese rol es una matriz. Comenzando con roles únicos, si el diccionario de equipo de guardar datos del jugador no tiene ese rol, entonces puedo establecer el valor de ese rol para que sea esta persona, creando un diccionario de su nombre y tasa de pago como un entero. Si se trata de una matriz, sin embargo, tendré que comparar el número de personas asignadas a ese rol en la tripulación existente del jugador con el número máximo permitido. Y si aún tienen espacio, entonces agrega esta nueva persona a la matriz Si o bien el jugador no tiene espacio para más de este rol o el rol único ya está lleno, entonces seguiré a la siguiente persona que esté buscando trabajo. Si esta persona fue contratada con éxito, liberaré del escenario todos los nodos asociados con ella y los agregaré a la variedad de personas que fueron contratadas Esto bastará para permitir que el jugador contrate a estos tripulantes los intentos de contratar puestos de tripulación que ya estén ignorarán los intentos de contratar puestos de tripulación que ya estén ocupados o a capacidad. Pero sí creo que es importante hacer cumplir la capacidad máxima de tripulación del barco actual del jugador. Entonces escribiré una función que cuente la tripulación actual del jugador, devolviendo un entero, iterando a través de cada entrada en el diccionario de tripulación del jugador, si la entrada es una matriz, agregando el tamaño de la matriz, de lo contrario agregando una y devolviendo el resultado Al hacer clic en el botón de contratación, agregaré una variable para la tripulación máxima. Y con cada iteración a través de las personas que buscan trabajo, comprobaré si el jugador ha alcanzado su capacidad de tripulación y saldré del bucle si lo ha hecho Voy a necesitar recuperar esta información de la nave actual del jugador. Entonces, dando a estas pestañas nombres únicos, voy a tomar una referencia al gerente de la nave usando add on Ready. Y solicitar a los límites de la tripulación del jugador, estableciendo el máximo para que sea el primer elemento de una matriz. El guión del administrador del barco necesita entonces una función que devuelva una matriz de dos enteros de los límites actuales de la tripulación del barco del jugador, simplemente devolviendo una matriz de dos números llenos con la tripulación mínima y tripulación máxima de su barco actual. Ahora se le impide al jugador contratar más tripulación de la que su nave actual puede contener. El jugador ahora puede administrar su tripulación desde esta pestaña de tripulación con mecánicas para contratar, ajustar las tarifas de pago y disparar a los miembros de la tripulación. En la siguiente sección permitiremos que el jugador zarpe hacia otro puerto. Te veré en la siguiente sección. 37. Botón de radio: Hola, amigos. En la sección anterior, permitimos que el jugador manejara su tripulación. En esta sección, les proporcionaremos un mapa de diferentes puertos entre los que pueden navegar. Al igual que la pestaña de tripulación, comenzaré por cambiar a la pestaña de mapa, agregarle un script, llamarlo Administrador de mapas y guardarlo en la carpeta de scripts del administrador. Luego exporte un icono como una textura dos D y póngalo como icono de esta pestaña llamando al icono de set tab en el padre de este nodo, el contenedor de pestañas, pasando el icono como argumento, y complete el icono exportado con un icono de mapa Volviendo a dos vistas D, comenzaré agregando un contenedor de caja vertical a esta pestaña, que contiene un nodo destrozado con textura, poblado con la textura de un mapa del Mar Caribe, configurado para ajustarse proporcional a su ancho, mantener su relación de aspecto y expandirme para llenar el espacio verticalmente y encogerse al centro horizontalmente En este mapa, agregaré un nodo de control para usar como carpeta para contener todos mis puertos y tenerlo anclado al naufragio completo del Después representaré a cada puerto con casillas de verificación, empezando por La Habana, Cuba, luego Kingston Jamaica, Porto Prince Haití y Santo Domingo en la República Dominicana. Estas casillas de verificación están naturalmente ajustadas al modo de alternar, por lo que el reproductor puede marcarlas o desmarcarlas, pero solo quiero que puedan tener una marca a la vez, lo que significa que estos deberían ser botones Podemos crear botones de opción haciendo clic en el menú desplegable etiquetado grupo de botones y creando un nuevo grupo de botones. No necesitamos hacer nada con este grupo de botones que no sea guardarlo como recurso de proyecto. Después asigne todos los botones para usar también el mismo grupo de botones. Los botones de un grupo de botones utilizarán los iconos de botón de opción en lugar de los iconos de casilla de verificación, y solo se permitirá activar un botón en un grupo de botones en cualquier momento Voy a tener el botón de La Habana Cuba deshabilitado ya que será la ubicación de inicio del jugador. Y así, tendrán tres opciones entre las que elegir para su primer destino. Me gustaría personalizar el aspecto de estos botones sin afectar a otras casillas de verificación de mi proyecto Entonces agregaré una nueva variación de tipo de tema a mi tema, lo llamaré puerto y configuraré su tipo base en la casilla de verificación Si algún puerto está deshabilitado, esté marcado o no, colocaré su icono en un ancla, ya que eso indicará que es donde se encuentra actualmente el jugador. Un botón de opción sin marcar será un icono de venta, y un botón de opción marcado será una X roja, indicando que es el destino seleccionado por el jugador También voy a reducir el tamaño de fuente de estos botones para que no ocupen tanto espacio en el mapa. Seleccionando todos mis botones de puerto en el árbol de escenas, los cambiaré todos para usar la variación del tipo de tema de puerto. Después restablecen sus propiedades de tamaño para que sean pequeñas posible mientras contienen su texto. Para evitar que el texto de mi botón se superponga, haré que Kingston y Portal Prince inviertan su diseño para que sea de derecha a izquierda, manera que el texto aparezca a la izquierda del icono del botón de opción. Para asegurar que los botones permanezcan en las posiciones correctas, incluso si el mapa se redimensiona por cualquier motivo, configuraré los botones en modo de anclaje usando anclajes personalizados y colocaré sus puntos de anclaje al centro de sus iconos de botón Entonces repetiré esto para cada uno de mis puertos. Seleccionando uno de los botones de radio, echando un vistazo a sus señales, no sería un buen diseño conectar cada una de estas señales alternadas a una función diferente en el guión Eso haría que agregar más puertos fuera muy engorroso. Pero tenga en cuenta que el argumento que está pasando por la señal es un booleano llamado activado. En el script del administrador de mapas, podemos reaccionar ante cualquier botón que se alterna con una sola función Primero declaremos una variable para mantener el puerto actual del jugador como un entero, que naturalmente por defecto será cero, y otra para su destino. Le voy a dar un valor predeterminado de negativo, lo que significará que el jugador no ha seleccionado un destino. Luego podemos escribir una función para establecer el destino, primero aceptando el parámetro activado activado para que coincida con el argumento pasado por la señal conmutada Después agregando otro parámetro, el ID de puerto del botón que se presionó. Si el botón está siendo activado, entonces el destino será el ID de puerto Si el botón se está desactivando y el ID de puerto es el destino, entonces el jugador ha eliminado el destino y debe restablecerse a uno negativo Para conectar los botones de señal conmutada a esta función, necesitamos ampliar la sección avanzada del diálogo de conexión de señal Aquí podemos agregar argumentos extra a la señal. El tipo de argumento que queremos agregar es un entero, y para La Habana, dejaré su valor en cero. Luego podemos volver a la lista de nodos en la escena, seleccionar el nodo de mapa y elegir una función a la que llamar como reacción a esta señal. La función que se llama debe tener parámetros cuyos tipos coincidan con los emitidos por la señal. Como esta señal se ha activado como booleano y estamos vinculando un entero extra, set destination debe tener booleano seguido de un parámetro Entonces podemos repetir este proceso para cada botón de radio, cambiando el valor del argumento entero enlazado a un valor diferente. Para simplificar, usaré el número de índice hijo de cada botón en el árbol de escenas. De vuelta en dos vistas D, también agregaré un contenedor de margen al fondo del mapa anclado al fondo ancho y colocaré dentro de este contenedor de margen una etiqueta para indicar la distancia desde el puerto actual del jugador hasta su destino medida en días de navegación, y un botón para embarcarse en su viaje se encogen hasta el final del contenedor de margen Luego anotaré la posición y el tamaño del contenedor de margen y agregaré un nodo destrozado de color ya que es hermano con los mismos anclajes, tamaño y posición, coloreado de un negro semitransparente La imagen del mapa está muy ocupada, y agregar este tinte solo hará que la etiqueta y el botón sean más notorios. Tendré la etiqueta invisible y el botón desactivado por defecto. De vuelta en el guión, voy a agarrar referencias al administrador de la nave y estos dos nodos usando add on ready. Luego definir también una matriz constante para mantener las distancias entre cada uno de mis puertos medidas en millas náuticas. Creando una matriz de enteros, las posiciones reflexivas serán si el puerto actual y el destino son los mismos, por lo que la distancia sería cero Y sólo voy a poblar la matriz con algunos valores realistas para la distancia de navegación en millas náuticas entre cada una de estas ciudades Los valores simétricos deben ser los mismos, asumiendo que se puede navegar por el mismo camino en ambas direcciones Entonces después de establecer el destino, si el destino es uno negativo o es el mismo valor que el puerto actual, entonces ocultaré la etiqueta de distancia y deshabilitaré el botón de embarcar. De lo contrario, estableceré el texto de la etiqueta de distancia con los números correctos de días de navegación, luego habilitaré el botón de embarcar. Para acceder a los datos guardados del jugador, necesitaré una referencia al nodo de archivo dos. Para calcular el número de días de navegación, utilizaré la función de sellado, que redondea un flotador hasta el entero más cercano y dividiré la distancia de navegación en millas náuticas por la velocidad actual del barco del jugador. Para que esto funcione, tendré que agregar esta función get speed al script del administrador de barcos. Entonces regresando a flote, devolveré los barcos indexados por el número de identificación de barco actual del jugador Y no incluí un valor de velocidad para mi recurso de barco, así que abriré el script de recursos de barco y exportaré otra variable para la velocidad del barco. Entonces dale un valor por defecto de 100 millas náuticas por día. Entonces puedo darle a cada barco una velocidad diferente si quiero, y el jugador podrá realizar estos viajes en menos días de navegación. También me gustaría que el jugador pudiera desactivar su destino haciendo clic nuevamente en él, lo cual no está permitido por defecto. Si hacemos doble clic en el grupo de botones en los recursos del proyecto, podemos activar la propiedad Permitir prensa para acomodar este comportamiento. Vamos a probarlo. El jugador puede hacer clic en cualquiera de estos botones de radio en el mapa, seleccionándolo como su destino, y el número de días se actualizará, y el botón de embarcar se activa. Si presionamos el botón que ya estaba activado, también podemos desactivarlo Y ahora no hay destino, por lo que se oculta el número de días y el botón de embarcar se desactiva Ahora tenemos un mapa con varios puertos entre los que el jugador puede elegir como destino. Y la siguiente lección permitirá al jugador controlar el ancla de la nave. Te veré en la siguiente lección. 38. Botón de verificación: Hola, amigos. En la lección anterior, permitimos que el jugador seleccionara un destino de un mapa. En esta lección, les dejaremos controlar el ancla de la nave. Debajo de mi mapa, el contenedor de caja vertical contendrá un contenedor de caja horizontal, y eso mantendrá un botón de verificación que se utilizará para controlar el ancla del barco. Al igual que la casilla de verificación, el botón de verificación también hereda la mayoría de sus propiedades del botón, incluido su tema Seleccionando el botón de verificación, echemos un vistazo a sus propiedades en el inspector. Comenzaré quitando las propiedades del tema de estilo heredadas del botón marcando la casilla de verificación plana Podemos agregar texto al botón de verificación y también un icono. Utilizaré el texto para indicarle al jugador que éste se usa para controlar el ancla de la nave. Al igual que otros botones, podemos ajustar cómo se dibujará el texto y el icono en relación con la posición del botón de verificación y la cantidad de espacio disponible. A continuación, seleccionemos el nodo raíz para que podamos ver el editor de temas y agregar el botón Check al tema. El botón check hereda muchas de las propiedades con las que estamos familiarizados del botón como fuente y colores de iconos En la sección constante, podemos alinear todo con el cuadro de estilo más grande configurándolo en cualquier otra cosa que no sea cero. Agrega algo de desplazamiento vertical al botón de verificación, separación horizontal entre el icono, botón de verificación y texto. Establezca una tapa para el ancho máximo del icono. Y un tamaño de contorno para el texto, todo lo cual hemos hecho antes con otros nodos de control. Como siempre, dejaré la fuente y el tamaño de fuente como el tema por defecto. En la sección de iconos, podemos cambiar el aspecto del botón de verificación cuando está marcado, desmarcado o deshabilitado, así como proporcionar un icono que se utilizará para todos los botones de verificación en todo el proyecto a menos que sea anulado por la propiedad de icono de botones de verificación individuales Y finalmente, en la sección de estilo, tenemos todos los mismos estilos que se heredaron de botón, que eliminaré reemplazándolos todos por style box empty. Seleccionando el nodo del botón de verificación, voy a tener mi botón pulsado por defecto. Voy a renombrar mi nodo ancla y la carpeta ports antes de utilizarlos en mi script. Tendremos que responder al jugador haciendo clic en el botón de verificación conectando su señal a un guión. En lugar de la señal presionada normalmente usaríamos para el botón, necesitaremos saber si el botón de verificación está siendo activado o desactivado, por lo que conectaremos la señal conmutada en su lugar, que pasa el estado alternado del botón de verificación como argumento Conectando esto a mi script de administrador de MAP, puedo reaccionar fácilmente a la señal en función si el botón de verificación se está encendiendo o desactivando o no se está encendiendo o desactivando o Cambiando al script de guardar datos, agregaré la variable is anchored como un booleano exportado y por defecto es true También conectemos la señal de restablecimiento de archivos al script para que podamos inicializar esta pestaña con la información apropiada de los datos de guardado del reproductor Voy a necesitar referencias a mi nodo ancla y a la matriz de nodos hijos debajo de mi carpeta ports. Todo lo que necesito hacer para el ancla es establecer su propiedad de botón presionado para que coincida con los nuevos datos de guardado. También necesitaré iterar a través de todos mis puertos y establecer su propiedad deshabilitada para que coincida con si este es o no el puerto actual del jugador y establecer ninguno de ellos para que se presione El botón de verificación reacciona al estar flotando y al hacer clic sobre él pesa el ancla Al hacer click sobre él, nuevamente, deja caer el ancla. Ahora tenemos un botón de verificación que controla el ancla de la nave. En la siguiente lección, permitiremos que el jugador controle las velas Te veré en la siguiente lección. 39. Deslizador vertical: Hola, amigos. En la lección anterior, agregamos un botón de verificación que controla el ancla del barco. En esta lección, usaremos un control deslizante para controlar las ventas del barco. Comenzaré agregando un deslizador vertical al contenedor de caja horizontal debajo de mi mapa. A diferencia del botón de verificación, el deslizador vertical no tiene propiedades de texto o icono, por lo que también agregaré un nodo de etiqueta, que rellenaré con la palabra ventas, por lo que coincide con el estilo de mi control de anclaje Seleccionemos el nodo deslizador vertical y echemos un vistazo a sus propiedades en el inspector. La casilla de verificación editable determinará si el jugador puede cambiar o no el valor de este control deslizante, y desplazable cambiará si puede hacerlo usando la rueda del mouse mientras pasa el mouse sobre el conteo de garrapatas agregará líneas horizontales al control deslizante para indicar segmentos como un termómetro. Tendré tres ticks en mi deslizador, y la casilla de verificación de ticks en los bordes cambiará si se dibujan la primera y la última marca para los valores máximo y mínimo Las propiedades de rango también son importantes para este nodo, que nos permite especificar cuáles son los valores mínimo y máximo del deslizador, así como cuánto puede cambiar el deslizador en su valor con cada paso. Ya que mi slider se está utilizando para controlar las ventas de barcos, solo tendrá tres valores posibles, cero, medio o uno para la venta completa. Estas propiedades de rango también son utilizadas por otros nodos, como la barra de desplazamiento, que usa la propiedad page, pero los deslizadores no la usan , por lo que podemos ignorarla Valor es el valor actual del deslizador, lo que podemos cambiar lo que es por defecto, y automáticamente se ajustará a los valores de paso entre nuestro mínimo y máximo. edición exponencial sesgará el valor para que sea exponencial en lugar de lineal, pero solo si el valor mínimo es mayor que cero siempre redondeará el valor al entero más cercano. Permitir mayor o menor permitirá que el valor pase por encima de los valores mínimo y máximo. Pero el deslizador no indicará que tiene. Aprenderemos más sobre estas propiedades en la siguiente lección. Seleccionemos el nodo raíz para que podamos ver el editor de temas y agregar el control deslizante vertical a nuestro tema. Todas las propiedades del tema para el deslizador vertical también están disponibles para los deslizadores horizontales Como el deslizador no tiene texto ni iconos, no tiene colores, fuente o tamaño de fuente. Entonces comenzaremos en la sección constante. Si el capturador central es otra cosa que no sea cero, entonces el capturador se colocará dentro del espacio del deslizador vertical basándose solo en su punto central lugar de las dimensiones completas de la imagen Y el desplazamiento del capturador puede agregar algo de desplazamiento horizontal del agarrador hacia la izquierda o hacia la derecha En un deslizador horizontal, esta misma propiedad será un desplazamiento vertical en su lugar. En la sección de iconos, podemos proporcionar diferentes imágenes para el capturador en sus estados normal, desactivado y resaltado, así como la imagen utilizada para dibujar marcadores de tick a lo largo del deslizador usaré una soga como mi agarrador y una viga transversal para mi En la sección de estilo, podemos cambiar la forma en que se dibuja el deslizador, así como el área llena debajo del capturador normalmente y cuando se resalta Para un deslizador horizontal, esta sería el área a la izquierda del agarrador Voy a hacer que mi deslizador sea una delgada línea marrón que representa un mástil, y el relleno será una textura de caja de estilo que poblaré con una imagen de una vela y la expandiré tanto a izquierda como a derecha, por lo que parece una vela de barco real Luego copiaré esto, lo haré único y cambiaré la textura para cuando esté resaltada. Para darle más espacio a esta venta, anularé mi configuración de tema para el contenedor de caja horizontal tenga 21 píxeles de espacio entre los nodos hijos. Seleccionando el nodo slider, necesitamos reaccionar al jugador usando el control deslizante conectando una de sus señales a un script. Si quieres reaccionar a que el valor se cambie solo después de que el jugador haya soltado el botón del mouse y haya dejado de arrastrar, entonces sería apropiado conectar la señal de fin de arrastre sería apropiado conectar la señal Pero quiero reaccionar ante el cambio de valor incluso mientras el jugador sigue manteniendo pulsado el botón del ratón. Entonces conectaré la señal de cambio de valor en su lugar y la conectaré a mi script de administrador de mapas. Almacenaré el valor del control deslizante de ventas en los datos de guardado del jugador. Agarrando una referencia al nodo de venta, también puedo establecer su valor cuando se restablecen los datos de guardado También necesitaré agregar esta variable al script de guardar datos también. Vamos a probarlo. El deslizador vertical reacciona a estar flotando y podemos cambiar su valor usando la rueda del mouse También podemos hacer clic y arrastrar el capturador para cambiar su valor Ahora tenemos un deslizador vertical controla las velas de la nave En la siguiente lección, dejaremos que el jugador se embarque hacia su destino. Te veré en la siguiente lección. 40. 6 4 Barra de progreso: Hola, amigos. En la lección anterior, agregamos un deslizador vertical para controlar las velas del barco En esta lección, usaremos una barra de progreso para indicar qué tan lejos está el barco en su viaje Añadiré un nodo de barra de progreso al contenedor de caja horizontal debajo mi mapa y haré que se expanda horizontalmente para llenar el espacio, luego colocarlo entre los controles de ancla y vela. Echemos un vistazo a sus propiedades en el inspector. Podemos cambiar la dirección del relleno y cambiar el valor para ver el efecto de esto. También podemos activar o desactivar la visualización del porcentaje, y el toggle indeterminado nos mostrará que algo está progresando sin ninguna indicación de lo lejos que ha progresado, lo que podemos ver si también verificamos el toggle de vista previa Todas las mismas propiedades de rango están aquí y funcionan de la misma manera que el control deslizante. Pero si permitimos que el valor sea menor que el mínimo o mayor que el máximo, el valor se indicará por el porcentaje, pero no por el llenado de la barra de progreso. Seleccionemos el nodo raíz para que podamos ver el editor de temas y agregar la barra de progreso a nuestro tema. Como cualquier nodo que tenga texto, podemos cambiar los colores de contorno de fuente y fuente y establecer el tamaño del contorno en la sección constante. Como siempre, dejaré la fuente y el tamaño de fuente como el tema por defecto, y la barra de progreso no tiene íconos para cambiar En la sección de estilo, podemos cambiar tanto el fondo como el relleno de la barra de progreso, que rellenaré con cuadros de estilo plano Usaré el mismo color de fondo azul que mi panel, redondearé las esquinas y agregaré algunos márgenes de contenido para hacerlo un poco más grande. Luego copia esto para el relleno, hazlo único y cambia su color a verde. Para embarcarnos en nuestro viaje, necesitaremos conectar la señal pulsada del botón de embarque al guión. En la parte superior del guión, voy a necesitar una referencia a mi barra de progreso. También declararé una variable booleana para saber si el jugador está navegando actualmente o no, la cantidad de tiempo que ha transcurrido como flotador y el número de días en el mar como un Para comenzar a navegar, estableceré la variable booleana en true. Tiempo transcurrido y días en el mar a cero. También voy a iterar a través del resto de las pestañas en mi contenedor de pestañas y las deshabilitaré, ya que estas solo deberían ser accesibles en un puerto, no mientras navega Luego escribiré otra función para llegar a un puerto, aceptando un ID de puerto como un entero. Después de que la configuración esté navegando a false, habilitaré el puerto desde el que navegó el jugador, cambiaré el puerto actual al destino, y deshabilitaré el nuevo puerto actual, luego estableceré el destino en negativo, lo que significa que no hay destino Entonces puedo reactivar las otras pestañas ya que el jugador está ahora en un puerto Luego establece el valor máximo de la barra de progreso a la distancia entre el puerto actual y el destino y desactiva el botón de embarque. Para navegar desde el puerto actual hasta el destino, utilizaré la función de proceso para llenar gradualmente la barra de progreso con el tiempo. Si el jugador no está navegando o está anclado o las velas se ponen a cero, entonces no se hará ningún progreso y yo sólo regresaré De lo contrario, aumentaré el tiempo transcurrido por Delta, y si el tiempo transcurrido es mayor que el número de días en el mar, entonces incrementaré los días en el mar y pagaré a la tripulación sus A continuación agregaré al valor de la barra de progreso la velocidad actual del barco del jugador multiplicada por su valor de venta multiplicado por Delta. Esto dará como resultado que el barco recorra su velocidad en millas náuticas cada 1 segundo y con 1 segundo representando un día. Si el valor de la barra de progreso alcanza su valor máximo, entonces han llegado a su destino. Voy a necesitar escribir esta función de pago en mi guión de gerente de tripulación Agarrando una referencia al gerente de tripulación usando add on Ready, luego cambiando al guión del gerente de tripulación Primero, declarando una variable para el pago total como un entero, iteraré a través de la tripulación del jugador Si el rol de la tripulación no es una matriz, agregaré el pago por ese rol al salario total. Si se trata de una matriz, volveré a iterar a través cada persona en ese rol y agregaré todo su salario al total Voy a necesitar una referencia al nodo de recursos oro para que este script pueda solicitar el jugador gaste esta cantidad total. Y por último, gastar la cantidad de oro necesaria para pagar a todos los tripulantes. Si el jugador no tiene suficiente dinero para pagar a toda su tripulación, este sería un buen momento para terminar el juego con el juego terminado. Agregué una S a mi nombre de variables aquí. Voy a necesitar arreglarlo. Al hacer clic en una casilla de verificación de puerto, primero verificaré si el jugador está navegando actualmente, y si es así, presionaré el botón que pertenece al puerto de destino y regresaré. Esto evitará que el jugador cambie su destino mientras navega. Si no están navegando y están estableciendo su destino, estableceré el valor de la barra de progreso en cero. Vamos a probarlo. El jugador puede seleccionar un destino y hacer clic en el botón de embarcar para comenzar a navegar, pero no avanzará hacia su destino si está anclado o si sus velas no están desplegadas La velocidad del barco se puede ajustar con la vela a la mitad o llena. Al llegar a su destino, las pestañas y casillas de verificación pueden ser interactuadas Una vez en un puerto, el jugador puede reclutar tripulantes, y navegando a otro puerto, se deducirá el pago de las tripulaciones por cada día en Ahora tenemos una barra de progreso que muestra qué tan lejos está el barco de su destino. Y eso cubre casi todos los nodos de control de Godo. Las pocas mecánicas que quedan para completar este juego solo usarían más de los mismos nodos que ya hemos usado en otras partes del proyecto. Ahora deberías estar listo para completar tu proyecto. Si has estado siguiendo junto con este proyecto, ve si puedes completar el market tap de este juego y agregar un juego sobre la pantalla. Buena suerte.