Search code examples
godotgdscript

How do I make the player spawn next to car here


extends KinematicBody2D

var active = false
var car_zone = false

#car driving
func get_car_input():
    var velocity = Vector2.ZERO
    var speed = 200
    if Input.is_action_pressed("forward"):
        velocity.y = -1
    if Input.is_action_pressed("backward"):
        velocity.y = 1
    if Input.is_action_pressed("left"):
        velocity.x = -1
    if Input.is_action_pressed("right"):
        velocity.x = 1
    move_and_slide(velocity*speed)

func _physics_process(_delta):
    if active:
        get_car_input()
        leaving_car()
    if !active:
        entering_car()
        pass
    
#entering/exiting car
func _on_player_detect_body_entered(body):
    if body.name == "player":
        car_zone = true
func _on_player_detect_body_exited(body):
    if body.name == "player":
        car_zone = false
        
func entering_car():
    if Input.is_action_just_pressed("interact") && car_zone == true:
        var hidden_player = get_parent().get_node("player")
        hidden_player.active = false
        #$Camera.make_current()
        active = true
        print("car entered")
func leaving_car():
    var vehicle = $"."
    var hidden_player = get_parent().get_node("player")
    #spawn player to car HERE
    
    if car_zone == false && Input.is_action_just_pressed("interact"):
        hidden_player.active = true
        active = false
        #hidden_player.global_transform.origin = newLoc

I followed this tutorial: https://www.youtube.com/watch?v=7VzBHbG8sqo, and at 14:41, it shows how to do it in godot 3d, but I need it in godot 2d. He used "var newLoc = vehicle.global_transform.origin - 2*vehicle.transform.basis.x" to do that, but it doesn't work in 2d


Solution

  • There is a pretty simple solution for your problem, which does not even contain any math to work.

    There is a Node called Position2D, which you can add to your Car Scene. Place it, where you want your character should stand after leaving the vehicle (so as a driver on the left side of your car)

    Because the node is in your car scene it will move along with the car and rotate as well, so its always right next to your car.

    All we need to do now is getting the global_position of the Position2D and setting the global_position of our player to it.

    To make it easier to receive the global_position of the Position2D Node, we can add a function to the car which returns exactly that. Saying your Car Scene looks like this:

    • Vehicle
      • Sprite
      • ExitPosition (Our Position2D node. Renamed for clearity)

    The function in our vehicle.gd could be like this:

    func get_exit_location() -> Vector2:
       return $ExitPosition.global_position
    

    As I see it you have a variable named vehicle in your player code, which points to your car. So now, when you want to leave the car you can set the player position like this:

    ## Calling inside player code
    global_position = vehicle.get_exit_location()
    

    Keep in mind, that both ways (the one in the video and this one here) will make problems if there is something at the point your trying to place your player. So always check if your player can be at that position.