Disparos
Ya queda poco para terminar nuestro juego; vamos a añadir la capacidad de disparar a nuestro jugador. Pero en primer lugar, vamos a crear la escena bullet.tscn que contendrá lo necesario para un disparo del jugador.
-
Crear el Nodo Principal
- Haz clic derecho en el panel de nodos y selecciona Añadir Nodo.
- Busca y selecciona
Area2Dcomo nodo principal de la escena.
-
Añadir un Sprite2D como Hijo
- Selecciona el nodo
Area2D. - Haz clic en Añadir Hijo y elige
Sprite2D. - En el inspector, asigna la textura
bullet.pngal Sprite2D.
- Selecciona el nodo
-
Añadir un CollisionShape2D como Hijo
- Selecciona el nodo
Area2D. - Haz clic en Añadir Hijo y elige
CollisionShape2D. - En el inspector, selecciona una forma adecuada (por ejemplo,
CircleShape2D) y ajústala al tamaño de la bala.
- Selecciona el nodo
El árbol de nodos debería verse así:
Area2D
├── Sprite2D (textura: bullet.png)
└── CollisionShape2D
Script
Vamos a crear el Script asociado al Area2D. Para que la bala se borre cuando llegue al borde superior.
El Script contendrá el siguiente código inicialmente:
extends Area2D
@export var speed= 500
func _process(delta: float) -> void:
position.y -= speed * delta
if position.y < -10:
queue_free()
Disparo
Por último, vamos a crear un disparo cuando pulsemos espacio, desde el propio jugador. Por ello, vamos a volver a la escena player; para ampliar la función _process.
En primer lugar, vamos a añadir debajo de la velocidad, una nueva propiedad que será una packet_scene; esta escena nos va a permitir crear disparos en tiempo de ejecución.
@export var speed = 300
@export var bullet_scene: PackedScene
Note
Recuerda solo añadir la última línea del anterior fragmento.
Una vez añadida la propiedad, en el editor estableceremos la propiedad bullet_scene a la escena bullet.tscn.
Por último, en el script de player, ampliamos la función _process con el siguiente fragmento:
if Input.is_action_just_pressed("ui_accept"):
var bullet = bullet_scene.instantiate()
bullet.position = position
bullet.add_to_group("bullet")
get_parent().add_child(bullet)
Si todo ha ido bien, el script de player debería quedar así:
extends CharacterBody2D
@export var speed = 300
@export var bullet_scene: PackedScene
func _process(delta: float) -> void:
var dir = Vector2.ZERO
if Input.is_action_pressed("ui_right"):
dir.x+=1
if Input.is_action_pressed("ui_left"):
dir.x -=1
if Input.is_action_pressed("ui_up"):
dir.y-=1
if Input.is_action_pressed("ui_down"):
dir.y +=1
velocity = dir.normalized()* speed
move_and_slide()
if Input.is_action_just_pressed("ui_accept"):
var bullet = bullet_scene.instantiate()
bullet.position = position
bullet.add_to_group("bullet")
get_parent().add_child(bullet)