Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.
Iremos pulsando sobre los misiles que caen de la parte superior de la pantalla para explotarlos.
Poner imagen de fondo
1. Creamos una escena de tipo 2D.
2. Colocamos la imagen de fondo. Node 2D → Canvas Layer → Texture Rext.
Crear un misil que tiene velocidad constante
3. Colocamos un Sprit2D en pantalla al que asociaremos la imagen de un Sprite.
4. Ubicamos el misil sobre la imagen de fondo modificando la propiedad…
5. Asignamos al misil el siguiente código para que caiga con velocidad constante.
extends Sprite2D
func _process(delta):
position+=Vector2(0, 200)*delta
Crear un misil que cae por gravedad
6. Vamos a crear otro misil, pero este va a caer por gravedad. Para ello creamos un CharacterBody2D en el que anidamos un Sprite2D y un CollisionShape2D.
7. Al CharacterBody2D le asignamos un script utilizando el template CharacterBody2D: Basic Movement. Limpiamos el código generado hasta dejarlo como se muestra a continuación, lo cual hará que el misil caiga por gravedad.
extends CharacterBody2D
@onready var sprite_2d = $Sprite2D
var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")/20
func _physics_process(delta):
velocity.y += gravity * delta
move_and_slide() // Esta función ejecuta el resultado de las físicas que hemos definido
8. Añadimos el código que mostrará una traza cuando pulsemos sobre el misil.
func _input(event):
if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT:
if sprite_2d.get_rect().has_point(to_local(event.position)):
print("clicked")
Vamos a añadir la animación de explosión.
9. Añadimos una nueva escena (ctrl + n) → Other Node → Animated Sprite 2D.
10. Seleccionamos el nodo y en el panel inspector → Animation → Sprite Frames → New Sprite Frames.
11. En el panel SpriteFrames que se muestra, pulsamos en el botón Add frames from sprite sheet (ctrl + shift + o). Seleccionamos la imagen que contiene la spritesheet y marcamos los frames que compondrán la animación de explosión.
12. Marcamos Autoplay on Load y desmarcamos Animation Looping.
12. Asociamos el siguiente código al Nodo AnimatedSprite2D.
extends AnimatedSprite2D
func _on_animation_finished():
queue_free() // Esto destruirá la escena
13. Volvemos al código del misile para cambiar la línea que mostraba una traza por el código que instanciará la animación cuando pulsemos sobre el misil.
var i = explosion_scene.instantiate()
get_parent().add_child(i)
i.global_position = global_position
queue_free()
Instanciar los misiles cada cierto tiempo
14. Añadimos un nodo de tipo Timer a la escena y en el inspector seleccionamos AutoStart.
15. Añadimos el siguiente código a la escena principal para instanciar los misiles en posiciones aleatorias.
extends Node2D
@export var rocket:PackedScene
@onready var timer = $Timer
# Called when the node enters the scene tree for the first time.
func _ready():
timer.timeout.connect(put_missile)
func put_missile():
var m = rocket.instantiate()
add_child(m)
m.position.x = randf_range(0, get_viewport_rect().size.x)
m.position.y = -60
16. Podemos hacer que los misiles se instancien cada vez con mayor frecuencia con la siguiente línea:
timer.wait_time = timer.wait_time*0.9