Crear tu primer script
In this lesson, you will code your first script to make the Godot icon turn in circles. As we mentioned in the introduction, we assume you have programming foundations.
Este tutorial está escrito para GDScript. Por conveniencia, el código C# equivalente está incluido en una pestaña diferente dentro de cada bloque de código.
Ver también
To learn more about GDScript, its keywords, and its syntax, head to the GDScript section. To learn more about C#, head to the C#/.NET section.
Configuración del proyecto
Crea un proyecto nuevo para comenzar en limpio. Tu proyecto tendrá una imagen: el icono de Godot, que a menudo usamos para crear prototipos en la comunidad.
We need to create a Sprite2D node to display it in the game. In the Scene dock, click the button.
Escribe "Sprite2D" en la barra de búsqueda para filtrar nodos y haz doble clic en Sprite2D para crear el nodo.
Your Scene tab should now only have a Sprite2D node.
A Sprite2D node needs a texture to display. In the Inspector on the right, you
can see that the Texture property says <empty>. To display the
Godot icon, click and drag the file icon.svg from the FileSystem dock onto the
Texture slot.
Nota
Puedes crear nodos Sprite2D automáticamente arrastrando y soltando imágenes en el viewport.
Luego, haz clic y arrastre el icono en el viewport para centrarlo en la vista del juego.
Crear un nuevo script
To create and attach a new script to our node, right-click on Sprite2D in the Scene dock and select .
The Attach Node Script window appears. It allows you to select the script's language and file path, among other options.
Change the Template field from Node: Default to Object: Empty to
start with a clean file. Leave the other options set to their default values and
click the button to create the script.
Nota
Los nombres de los scripts de C# deben coincidir con el nombre de su clase. En este caso deberías nombrar el archivo MySprite2D.cs.
The Script workspace should appear with your new sprite_2d.gd file open and
the following line of code:
extends Sprite2D
using Godot;
using System;
public partial class MySprite2D : Sprite2D
{
}
Cada archivo GDScript es implícitamente una clase. La palabra clave extends define la clase que este script hereda o extiende. En este caso, es Sprite2D, lo que significa que nuestro script tendrá acceso a todas las propiedades y funciones del nodo Sprite2D, incluidas las clases que extiende, como Node2D, CanvasItem y Node.
Nota
En GDScript, si omites la línea con la palabra clave extends, tu clase extenderá implícitamente RefCounted, la que Godot usa para administrar la memoria de tu aplicación.
Inherited properties include the ones you can see in the Inspector dock, like
our node's texture.
Nota
By default, the Inspector displays a node's properties in "Title Case", with capitalized words separated by a space. In GDScript code, these properties are in "snake_case", which is lowercase with words separated by an underscore.
You can hover over any property's name in the Inspector to see a description and its identifier in code.
Hola, mundo!
Nuestro script actualmente no hace nada. Hagamos que imprima el texto "¡Hola, mundo!" al panel inferior Salida para comenzar.
Añade el siguiente código a tu script:
func _init():
print("Hello, world!")
public MySprite2D()
{
GD.Print("Hello, world!");
}
Vamos a desglosarlo. La palabra clave func define una nueva función llamada _init. Este es un nombre especial para el constructor de nuestra clase. El motor llama a _init() en cada objeto o nodo al crearlo en la memoria, si define esta función.
Nota
GDScript es un lenguaje basado en sangrías. La tabulación al principio de la línea que dice print() es necesaria para que el código funcione. Si la omites o no indentas correctamente una línea, el editor la resaltará en rojo y mostrará el siguiente mensaje de error: "Se espera un bloque sangrado".
Save the scene as sprite_2d.tscn if you haven't already, then press F6 (Cmd + R on macOS)
to run it. Look at the Output bottom panel that expands.
It should display "Hello, world!".
Elimina la función _init(), de modo que solo le quede la línea extends Sprite2D.
Dar la vuelta
It's time to make our node move and rotate. To do so, we're going to add two
member variables to our script: the movement speed in pixels per second and the
angular speed in radians per second. Add the following after the extends Sprite2D line.
var speed = 400
var angular_speed = PI
private int _speed = 400;
private float _angularSpeed = Mathf.Pi;
Las variables miembro se ubican en la parte superior del script, antes de las funciones. Cada instancia de nodo con este script adjunto tendrá su propia copia de las propiedades speed y angular_speed.
Nota
Los ángulos en Godot funcionan por defecto en radianes, pero dispone de funciones y propiedades incorporadas si prefiere calcular los ángulos en grados.
Para mover nuestro icono, necesitamos actualizar su posición y rotación por cada frame en el bucle del juego. Podemos usar la función virtual _process() de la clase Node. Si lo defines en cualquier clase que extienda la clase Node, como Sprite2D, Godot llamará a la función en cada cuadro y le pasará un argumento llamado delta, el tiempo transcurrido desde el último frame.
Nota
Los juegos funcionan renderizando muchas imágenes por segundo, cada una llamada frame, y lo hacen en un bucle. Medimos la velocidad a la que un juego produce imágenes en fotogramas por segundo (FPS). La mayoría de los juegos apuntan a 60 FPS, aunque es posible que encuentre cifras como 30 FPS en dispositivos móviles más lentos o de 90 a 240 para juegos de realidad virtual.
El motor de videojuegos y los desarrolladores hacen todo lo posible para actualizar el mundo del juego y renderizar imágenes en un intervalo de tiempo constante, pero siempre hay pequeñas variaciones en los tiempos de renderizado de frames. Es por eso que el motor nos proporciona este valor de tiempo delta, lo que hace que nuestro movimiento sea independiente de nuestra velocidad de fotogramas.
En la parte inferior del script, defina la función:
func _process(delta):
rotation += angular_speed * delta
public override void _Process(double delta)
{
Rotation += _angularSpeed * (float)delta;
}
La palabra clave func define una nueva función. Después, tenemos que escribir el nombre de la función y los argumentos que toma entre paréntesis. Los dos puntos terminan la definición y los bloques indentados que siguen son el contenido o las instrucciones de la función.
Nota
Observe cómo _process(), al igual que _init(), comienzan con un guión bajo al principio. Por convención, las funciones virtuales de Godot, es decir, las funciones integradas que puede anular para comunicarse con el motor, comienzan con un guión bajo.
La línea dentro de la función, rotación += angular_speed * delta, incrementa la rotación de nuestro sprite en cada frame. Aquí, rotation es una propiedad heredada de la clase Node2D, la que Sprite2D extiende. Esta controla la rotación de nuestro nodo y funciona con radianes.
Truco
In the code editor, you can Ctrl + Click (Cmd + Click on
macOS) on any built-in property or function like position,
rotation, or _process to open the corresponding documentation
in a new tab.
Ejecuta la escena para ver el icono de Godot girar en su lugar.
Nota
En C#, nota cómo el argumento delta tomado por _Process() es un double. Necesitaremos entonces convertirlo a float cuando lo aplicamos a la rotación.
Moviendo hacia adelante
Ahora hagamos que el nodo se mueva. Agrega las siguientes dos líneas a la función _process(), asegurándote de que las nuevas líneas tengan la misma indentación que la anterior rotation += angular_speed * delta .
var velocity = Vector2.UP.rotated(rotation) * speed
position += velocity * delta
var velocity = Vector2.Up.Rotated(Rotation) * _speed;
Position += velocity * (float)delta;
Como ya vimos, la palabra clave var define una nueva variable. Si lo coloca en la parte superior del script, define una propiedad de la clase. Dentro de una función, define una variable local: solo existe dentro del alcance de la función.
Definiremos una variable local llamada velocity, un vector 2D que representa tanto una dirección como una velocidad. Para hacer que el nodo avance, comenzamos con la constante de clase Vector2.UP, un vector que apunta hacia arriba, y lo rotamos llamando al método de Vector2 rotated(). Esta expresión, Vector2.UP.rotated(rotation), es un vector que apunta hacia adelante en relación con nuestro icono. Multiplicado por nuestra propiedad speed, nos da una velocidad que podemos usar para mover el nodo hacia adelante.
Agregamos velocity * delta a la posición del nodo para moverlo. La posición en sí es de tipo Vector2, un tipo incorporado en Godot que representa un vector 2D.
Ejecuta la escena para ver la cabeza de Godot correr en círculos.
Nota
Mover un nodo como ese no tiene en cuenta la colisión con las paredes o el suelo. En Tu primer juego 2D, aprenderá otro enfoque para mover objetos mientras detecta colisiones.
Actualmente nuestro nodo se mueve solo. En la siguiente parte Escuchando la entrada del jugador, usaremos la entrada del jugador para controlarlo.
Script completo
Aquí está el archivo sprite_2d.gd completo como referencia.
extends Sprite2D
var speed = 400
var angular_speed = PI
func _process(delta):
rotation += angular_speed * delta
var velocity = Vector2.UP.rotated(rotation) * speed
position += velocity * delta
using Godot;
using System;
public partial class MySprite2D : Sprite2D
{
private int _speed = 400;
private float _angularSpeed = Mathf.Pi;
public override void _Process(double delta)
{
Rotation += _angularSpeed * (float)delta;
var velocity = Vector2.Up.Rotated(Rotation) * _speed;
Position += velocity * (float)delta;
}
}