Godot Engine game tutorial for beginners – Create a 2D Racing Game 4

In the past 3 parts of the 2d racing game tutorial for beginners, we setup the scene, created enemy cars and obstacles and setup the bg scrolling. Now we just need to spawn the cars and the obstacles to make the game look like moving. Welcome to the fourth part of the series and in this post we will make the enemy cars moving by adding the enemy script.

We already have the Enemy car as a packed scene, so let’s import it into the game scene. We are adding one enemy car temporarily into the scene for now and after the scripting done, we can remove it from the scene and the spawner(we will create the spawner in the next part) will take care of adding them.

Ok, let us add an enemy instance into the scene. Click on the ‘main’ node where we want to add the child, then click on the ‘chain’ icon and choose ‘Enemy.tscn’ from ‘res://packed/enemy’ folder.

Now move the enemy to the top of the road in the scene.

To add a script to the enemy, we need to open the enemy scene and add script to its root node. This will make the script available for all instances of enemies because we are adding the script inside the PackedScene. Click on the ‘clap’ icon to the right of the Enemy node in the main scene and choose ‘Open in Editor’. This will open the enemy scene in a new tab.

Also Read:   Create a Catch The Egg game in Godot engine - 4

Now, inside the Enemy scene, right-click on the Enemy RigidBody2D node and add a script. The script path is ‘res://packed/enemy/Enemy.gd’. Paste the below script into it.

extends RigidBody2D

var _player = null

func _ready():
    _player = get_node("../Player")
    set_process(true)

func _process(delta):
    var current_pos = get_pos()
    current_pos.y = current_pos.y + _player.speed * delta
    set_pos(current_pos)

Usually we don’t mess with a RigidBody position manually with set_pos, Godot’s built-in physics updates it automatically. But here, we have set the RigidBody mode to Kinematic so the engine expects us to update the physics manually.

We already scrolled the bg down in an earlier post and we do the same to the enemy car. In the _process function, we just did that. The y position is incremented with the player speed multiplied by delta. This makes the enemy car to move exactly the same speed as the bg.

In game development, position and direction of an object is represented in vectors and not in separate ‘x’ and ‘y’ parameters. Think the ‘x’, ‘y’ and/or ‘z’ as a whole as a position vector. We will change the above code to the ‘vector math’ way.

extends RigidBody2D

var _player = null

func _ready():
    _player = get_node("../Player")
    set_process(true)

func _process(delta):
    set_pos(get_pos() + Vector2(0, _player.speed * delta))
Godot Engine game tutorial for beginners – Create a 2D Racing Game 4 Click To Tweet

Run the game and the enemy car looks like it is just parked on the road. To make it look like it is moving forward, we need to reduce the speed.

extends RigidBody2D

var _player = null
var _speed_factor = 0.5

func _ready():
    _player = get_node("../Player")
    set_process(true)

func _process(delta):
    set_pos(get_pos() + Vector2(0, _player.speed * _speed_factor * delta))

We added a speed factor for the enemy and now the enemy car looks like it is moving forward.

Also Read:   How to automate Godot Android build process in 5 easy steps

In the next part we will do the same for the obstacles and add a spawner.

Download the project here.

Never miss any content from Codetuto!

Subscribe to Codetuto Newsletter and be the first to recieve our latest posts and tutorials

Subscribe Now For Free

[Total: 6    Average: 4.7/5]
  • cod3rnewb

    Keep these tutorials coming thanks a ton!

  • viky kumar

    Player is not colliding with the enemy car !!! i followed the same script but its not colliding. 🙁

    • Vinod

      Glad you tried. The car is Kinematic and the engine expects us to update the position of Kinematic bodies. We can make the car Rigid and set the velocity once to move it down. But because our speed is varying(gradually accelerated at the start) we cannot set the velocity once. We need to update the position according to the speed to make it sync with the road. So the engine won’t update the collision response. We will do this in the next post which I am preparing now. Please wait for a couple of days.

      Thanks

      • viky kumar

        Ohh Ok!
        Will wait for the part then. 🙂

        And by the way your tutorials are amazingly great and super easy to understand.
        Thanks