Ballistic bullet

Problem

You want a 2D bullet that travels in an arc, or ballistic curve.

Solution

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 Area2D’s 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:

alt alt

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:

alt alt