Creando tu primer script¶
In this lesson, you will code your first script to make the Godot icon turn in circles using GDScript. As we mentioned in the introduction, we assume you have programming foundations. The equivalent C# code has been included in another tab for convenience.

Ver también
Para obtener más información sobre GDScript, sus palabras clave y su sintaxis, diríjase a GDScript reference.
Ver también
To learn more about C#, head to the C# basics page.
Configuración del proyecto¶
Cree un nuevo proyecto para comenzar con una pizarra limpia. Su proyecto debe contener una imagen: el ícono de Godot, que a menudo usamos para crear prototipos en la comunidad.
Necesitamos crear un nodo Sprite para mostrarlo en el juego. En el panel Escena, haga clic en el botón Otro nodo.

Escriba "Sprite" en la barra de búsqueda para filtrar nodos y haga doble clic en Sprite para crear el nodo.

Su pestaña Escena ahora solo debería tener un nodo Sprite.

Un nodo Sprite necesita una textura para mostrar. En el Inspector de la derecha, puede ver que la propiedad Textura dice "[vacío]". Para mostrar el icono de Godot, haz clic y arrastra el archivo icon.png
desde el panel del sistema de archivos hasta la ranura de texturas.

Nota
Puede crear nodos Sprite automáticamente arrastrando y soltando imágenes en el viewport.

Luego, haga clic y arrastre el icono en el viewport para centrarlo en la vista del juego.

Creando un nuevo script¶
Para crear y adjuntar un nuevo script a nuestro nodo, haga clic derecho sobre el Sprite en el panel de Escenas y seleccione "Añadir Script".

The Attach Node Script window appears. It allows you to select the script's language and file path, among other options.
Cambie la Plantilla por defecto a Empty para comenzar con un archivo limpio. Deje las otras opciones por defecto y haga clic en el botón Crear para crear el script.

The Script workspace should appear with your new Sprite.gd
file open and the
following line of code:
extends Sprite
public class Sprite : Godot.Sprite
// Declare member variables here. Examples:
// private int a = 2;
// private string b = "text";
// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
}
// // Called every frame. 'delta' is the elapsed time since the previous frame.
// public override void _Process(float delta)
// {
//
// }
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 Sprite
, lo que significa que nuestro script tendrá acceso a todas las propiedades y funciones del nodo Sprite, 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 Reference, que Godot usa para administrar la memoria de tu aplicación.
Las propiedades heredadas incluyen las que puede ver en el panel Inspector, como la textura
de nuestro nodo.
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.
Puede pasar el cursor sobre el nombre de cualquier propiedad en el Inspector para ver una descripción y su identificador en el código.
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 Sprite()
{
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 is an indent-based language. The tab at the start of the line
that says print()
is necessary for the code to work. If you omit
it or don't indent a line correctly, the editor will highlight it in
red and display the following error message: "Indented block expected".
Save the scene 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!".

Elimine la función _init()
, de modo que solo le quede la línea ``extends Sprite`.
Dar la vuelta¶
Es hora de hacer que nuestro nodo se mueva y gire. Para hacerlo, agregaremos dos variables miembro a nuestro script: la velocidad de movimiento en píxeles por segundo y la velocidad angular en radianes por segundo.
var speed = 400
var angular_speed = PI
private int Speed = 400;
private float AngularSpeed = Mathf.Pi;
Member variables sit near the top of the script, after any "extends" lines,
but before functions. Every node
instance with this script attached to it will have its own copy of the speed
and angular_speed
properties.
Nota
Angles in Godot work in radians by default, but you have built-in functions and properties available if you prefer to calculate angles in degrees instead.
Para mover nuestro ícono, 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 Nodo, como Sprite, 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(float delta)
{
Rotation += AngularSpeed * 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 += velocidad_angular * delta
, incrementa la rotación de nuestro sprite en cada frame. Aquí, rotation
es una propiedad heredada de la clase Node2D
, que Sprite
extiende. Controla la rotación de nuestro nodo y trabaja con radianes.
Truco
En el editor de código, puede presionar ctrl + clic en cualquier función o propiedad incorporada como position
, rotation
o _process
para abrir la documentación correspondiente en una nueva pestaña.
Ejecute la escena para ver el ícono de Godot girar en su lugar.

Moviendo hacia adelante¶
Ahora hagamos que el nodo se mueva. Agregue las siguientes dos líneas a la función _process()
, asegurándose de que las nuevas líneas tengan la misma indentación que la anterior.
var velocity = Vector2.UP.rotated(rotation) * speed
position += velocity * delta
var velocity = Vector2.Up.Rotated(Rotation) * Speed;
Position += velocity * 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.
Definimos 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 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.
Ejecute 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.
Our node currently moves by itself. In the next part Escuchando la entrada del jugador, we'll use player input to control it.
Complete script¶
Aquí está el archivo Sprite.gd
completo como referencia.
extends Sprite
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;
public class Sprite : Godot.Sprite
{
private int Speed = 400;
private float AngularSpeed = Mathf.Pi;
public override void _Process(float delta)
{
Rotation += AngularSpeed * delta;
var velocity = Vector2.Up.Rotated(Rotation) * Speed;
Position += velocity * delta;
}
}