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.