You want a 2D bullet that travels in an arc, or ballistic curve.
One approach to this problem would be to use a
RigidBody2D - with its built-in physics, gravity would automatically pull it back to earth after firing it.
However, as mentioned in the 2D shooting recipe,
Area2D is a great choice for simple bullets and other projectiles - when you don’t need collisions, bouncing, or other physics reactions. Ballistic motion is easy enough to calculate that we won’t need the help of the physics engine.
Setting up the bullet
- Bullet (Area2D) - Sprite - CollisionShape2D
We can use
gravity property. Set it to
150 for the initial test.
extends Area2D var velocity = Vector2(350, 0) func _process(delta): velocity.y += gravity * delta position += velocity * delta rotation = velocity.angle() func _on_BallisticBullet_body_entered(body): queue_free()
Using the standard equations of motion is all we need to do here. The initial value for
velocity is just for testing. Run the bullet scene:
Now in your object that’s doing the shooting, you can instance the bullet and set its initial properties. Put this in whatever function/input handles shooting:
export var muzzle_velocity = 350 export var gravity = 250 func shoot(): var b = Bullet.instance() owner.add_child(b) b.transform = $Barrel/Position2D.global_transform b.velocity = b.transform.x * muzzle_velocity b.gravity = gravity
Here’s an example in action: