Documentación de Godot Engine 4.0 - Tutorial paso a paso - Uso de señales

Este artículo es el resultado de la traducción al inglés de Google Translate, y DrGraph agregó algunas correcciones sobre esta base. Página original en inglés:

Uso de señales — documentación de Godot Engine (estable) en inglés

Usando señales¶

En esta lección, estudiaremos las señales. Son mensajes enviados por los nodos cuando ocurren ciertos eventos, como presionar un botón. Otros nodos pueden conectarse a esta señal y funciones de llamada cuando ocurre el evento.

Las señales son un mecanismo de delegación integrado en Godot que permite que un GameObject reaccione a los cambios en otro GameObject sin que tengan una referencia entre sí. Use señales para limitar el acoplamiento y mantenga su código flexible.

Por ejemplo, puede tener una barra de salud en la pantalla que represente la salud del jugador. Cuando un jugador recibe daño o usa una poción curativa, desea que el gráfico de barras refleje ese cambio. Para ello, en Godot, utilizarás señales.

Nota: Como se mencionó en la introducción, las señales son la versión de Godot del patrón del observador. Puede obtener más información aquí:  https://gameprogrammingpatterns.com/observer.html

Ahora usaremos una señal para hacer que el ícono de Godot de la lección anterior ( escuchar la entrada del jugador ) se mueva y se detenga presionando un botón.

Configuración de escena¶

Para agregar un botón a nuestro juego, crearemos una nueva escena principal, que contendrá un botón y la escena que escribimos en las lecciones anteriores Sprite2D.tscn.

Cree una nueva escena yendo al menú Escena -> Nueva escena.

En el panel de escena, haga clic en el botón de escena 2D. Esto agregará un Node2D como nuestra raíz.

En el panel de sistema de archivos, haga clic y arrastre el archivo que guardó anteriormente Sprite2D.tscnen Node2D para crear una instancia.

Queremos agregar otro nodo como hermano del Sprite2D. Para hacer esto, haga clic con el botón derecho en Node2D y seleccione Add Child Node.

Busque el tipo de nodo Botón y agréguelo.

De forma predeterminada, este nodo es pequeño. Haga clic y arrastre el controlador en la esquina inferior derecha del botón en la ventana gráfica para cambiar su tamaño.

Si no ve manijas, asegúrese de que la herramienta de selección esté activa en la barra de herramientas.

Haz clic y arrastra el botón más cerca del sprite.

También puede escribir una etiqueta en el Botón editando su propiedad Texto en el Inspector. Introduzca "Movimiento de alternancia" [Movimiento de alternancia].

Su árbol de escena y ventana gráfica deberían verse así.

Guarde la escena recién creada. Luego puede ejecutarlo con F6 (Cmd + R en macOS). De momento, el botón estará visible, pero de momento no pasará nada si lo pulsas.

Conectando Señales en el Editor¶

Aquí queremos conectar la señal "pulsada" del botón a nuestro Sprite2D, y queremos llamar a una nueva función para activar y desactivar su movimiento. Necesitamos adjuntar el script al nodo Sprite2D, lo cual hicimos en la lección anterior.

Puede conectar señales en la base Node. Seleccione el nodo Botón, luego, en el lado derecho del editor, haga clic en la pestaña llamada "Nodo" al lado del Inspector.

El muelle muestra una lista de señales disponibles en el nodo seleccionado.

Haga doble clic en la señal "pulsada" para abrir la ventana de conexión del nodo.

Allí puede conectar señales a los nodos Sprite2D. Este nodo requiere un método receptor, la función que Godot llamará cuando se señale el Botón. El editor genera uno para usted. Por convención, llamamos a estos métodos de devolución de llamada "_on_node_name_signal_name". Aquí, [podría llamarse] "_on_button_pressed".

Nota: Al conectar señales a través de la base de nodos del editor, puede usar dos modos. Simple solo le permite conectarse a nodos que tienen scripts adjuntos y crear una nueva función de devolución de llamada en ellos [arriba].

La vista avanzada le permite conectarse a cualquier nodo y cualquier función integrada, agregar parámetros a las devoluciones de llamada y establecer opciones. Puede cambiar de modo haciendo clic en el botón "Avanzado" en la esquina inferior derecha de la ventana.

Haga clic en el botón Conectar para completar la conexión de la señal y pasar al espacio de trabajo de la secuencia de comandos. Debería ver el nuevo método con un icono de conexión en el margen izquierdo.

Si hace clic en el icono, aparecerá una ventana con información sobre la conexión. Esta función solo está disponible cuando se conectan nodos en el editor.

Reemplacemos passla línea con la palabra clave con el código que alterna el movimiento del nodo.

Nuestro Sprite2D _process()se mueve dentro de la función. Godot proporciona una forma de activar y desactivar el procesamiento [_process function]: Node.set_process() . is_processing()Otro método de la clase Node que devuelve si actualmente está inactivo true. Podemos usar notla palabra clave para obtener su valor inverso.

GDScript
func _on_button_pressed(): 
    set_process( not is_processing())

Esta función alternará la acción de [__proceso], que enciende y apaga el ícono cuando se presiona el botón.

Antes de probar el juego, debemos simplificar nuestra _process()función para mover los nodos automáticamente en lugar de esperar la entrada del usuario. Reemplácelo con el siguiente código que vimos hace dos lecciones:

GDScript
func _process(delta): 
    rotación += velocidad_angular * delta var velocidad = Vector2.UP.rotated(rotación) * 
    posición de velocidad += velocidad * delta
    

Tu sprite_2d.gdcódigo completo debería verse así.

GDScript
extiende Sprite2D var velocidad = 400
 var velocidad_angular = función PI _proceso (delta): 
    rotación += velocidad_angular * velocidad delta var = Vector2.UP.rotated(rotación) * posición de velocidad += velocidad * función 
    delta _on_button_pressed(): 
    set_process( not is_processing ())






    


Ahora ejecute la escena y haga clic en el botón para ver el comienzo y la parada del sprite.

Conectando señales vía código¶

Puede conectar señales a través de código en lugar de usar un editor. Esto es necesario cuando crea nodos o crea instancias de escenas en scripts.

Usemos un nodo diferente aquí. Godot tiene un nodo de temporizador que se puede usar para implementar enfriamientos de habilidades, recargas de armas, etc.

Vuelva al espacio de trabajo 2D. Puede hacer clic en el texto "2D" en la parte superior de la ventana o presionar Ctrl+F1 (Alt+1 en macOS).

En el panel de escena, haga clic con el botón derecho en el nodo Sprite2D y agregue un nuevo nodo secundario. Busque Timer y agregue el nodo correspondiente. Su escena ahora debería verse como la siguiente.

Con el nodo Temporizador seleccionado, vaya al Inspector y habilite la  propiedad Inicio automático.

Haga clic en el ícono de la secuencia de comandos junto a Sprite2D para volver al espacio de trabajo de la secuencia de comandos.

Necesitamos hacer dos operaciones para conectar nodos a través del código:

  1. Obtenga una referencia al temporizador de Sprite2D.

  2. connect()Este método se llama en la señal de "tiempo de espera" del temporizador.

Nota: Para conectarse a una señal a través del código, debe llamar connect() a un método de la señal que desea escuchar. En este caso, queremos escuchar la señal de "tiempo de espera" del temporizador.

Queremos conectar la señal al instanciar la escena, podemos hacerlo usando la función integrada Node._ready() , que el motor llama automáticamente cuando el nodo está completamente instanciado.

Para obtener una referencia de nodo relativa al nodo actual, usamos el método  Node.get_node() . Podemos almacenar referencias en variables.

GDScript
func _ready():
     var temporizador = get_node("Temporizador")

Esta función get_node()busca los nodos secundarios de Sprite2D y obtiene el nodo por nombre. Por ejemplo, si cambió el nombre de un nodo de temporizador a "BlinkingTimer" en el editor, tendría que cambiar la llamada a get_node("BlinkingTimer").

Ahora podemos conectar el Timer al Sprite2D en la función  _ready().

GDScript
func _ready():
     var timer = get_node("Timer") 
    timer.timeout.connect(_on_timer_timeout)

La línea dice: Conectamos la señal de "tiempo de espera" del temporizador al nodo al que está conectado el script. Cuando se emita el temporizador timeout, vamos a llamar a la función _on_timer_timeout(),该函数是que necesitamos definir actualmente. Agreguemos esto al final del script y usémoslo para alternar la visibilidad del sprite.

Nota: Por convención, llamamos a estos métodos de devolución de llamada "_on_node_name_signal_name" en GDScript y "OnNodeNameSignalName" en C#. Aquí, GDScript es "_on_timer_timeout" y C# es OnTimerTimeout().

GDScript
func _on_timer_timeout(): 
    visible = no visible

Esta visiblepropiedad es un valor booleano que controla la visibilidad del nodo. Esta línea visible = not visiblecambia el valor visible. Si es así true, se convierte falsey viceversa.

Si ejecuta la escena ahora, verá que el sprite parpadea a intervalos de un segundo.

Guión completo¶

¡Y eso es todo para nuestra pequeña demostración del ícono de Godot que se mueve y parpadea! Aquí está el sprite_2d.gdarchivo completo para referencia.

GDScript
extiende Sprite2D var speed = 400
 var angular_speed = PI func _ready():
     var timer = get_node("Timer") 
    timer.timeout.connect(_on_timer_timeout) func _process(delta): 
    rotación += angular_speed * delta var velocidad = Vector2.UP .rotated(rotación) * 
    posición de velocidad += velocidad * delta func _on_button_pressed(): 
    set_process( not is_processing()) func _on_timer_timeout(): 
    visible = no visible









    





Señales personalizadas¶

NOTA: Esta sección es una referencia sobre cómo definir y usar sus propias señales y no se basa en proyectos creados en lecciones anteriores.

Puede definir señales personalizadas en scripts. Por ejemplo, desea mostrar una pantalla de finalización del juego cuando la salud de un jugador llega a cero. Para hacer esto, puede definir una señal llamada "muerte" o "salud drenada" cuando su salud llega a 0.

GDScript
extiende la señal de Node2D health_depleted var health = 10




Nota: Dado que las señales representan eventos que acaban de ocurrir, generalmente usamos verbos de acción en tiempo pasado en sus nombres.

Sus señales funcionan de la misma manera que las señales integradas: aparecen en la pestaña Nodos y puede conectarse a ellas como cualquier otra señal.

Para emitir una señal en un script, llama emit()a signal.

GDScript
func tomar_daño(cantidad): 
    salud -= cantidad si salud <= 0: 
        salud_agotada.emit()
    

Una señal puede declarar opcionalmente uno o más parámetros. Especifique los nombres de los parámetros entre paréntesis:

GDScript
extiende la señal del nodo health_changed (old_value, new_value) var health = 10




Nota: Los parámetros de la señal se muestran en el panel de nodos del editor y Godot puede usarlos para generar funciones de devolución de llamada para usted. Sin embargo, aún puede emitir cualquier número de argumentos al emitir una señal. Así que depende de ti emitir el valor correcto.

Para emitir valores con la señal, añádelos como argumentos extra a la función  emit():

GDScript
func take_damage(cantidad):
     var old_health = salud 
    salud -= cantidad 
    salud_cambiada.emit(vieja_salud, salud)

Resumen¶ _

Cualquier nodo en Godot emite una señal cuando ocurre un evento específico, como presionar un botón. Otros nodos se pueden conectar a señales individuales y reaccionar a eventos seleccionados.

Las señales tienen muchos usos. Con ellos, puedes reaccionar a los nodos que entran o salen del mundo del juego, las colisiones, los personajes que entran o salen de las áreas, los cambios en el tamaño de los elementos de la interfaz y más.

Por ejemplo, cada vez que el cuerpo físico del jugador entra en su forma de colisión, el Area2Dbody_entered que representa la moneda te avisará cuando el jugador la haya recogido.

En la siguiente sección, " Tu primer juego en 2D ", crearás un juego en 2D completo y pondrás en práctica todo lo que has aprendido hasta ahora.

【DrGraph】: las señales son similares a los mensajes de las aplicaciones de Windows, pero más simples. Desde la perspectiva de las ideas de diseño de Godot, la señal solo expone algunos mensajes del objeto (nodo, script, escena...) a la llamada del objeto padre del objeto.Estos mensajes son algunas oportunidades (momentos) de lógica de negocio del objeto. Si el objeto principal está vinculado a estas señales, la función correspondiente del objeto principal se llamará en el momento de lógica comercial correspondiente de este objeto. Debido a que es una llamada interna del objeto principal, si se modifican algunas propiedades del objeto principal, puede afectar la lógica empresarial del objeto principal.

Supongo que te gusta

Origin blog.csdn.net/drgraph/article/details/130796381
Recomendado
Clasificación