ben cc
ben cc

Reputation: 13

Invalid Set 'x' (on base:'bool') of value of type 'int'

extends CharacterBody2D

var mon = Vector2.ZERO

func _physics_process(delta):
    mon = move_and_slide()

    if Input.is_action_pressed("ui_left"):
        mon.x = -1  # Set the horizontal speed to -1
    elif Input.is_action_pressed("ui_right"):
        mon.x = 1   # Set the horizontal speed to 1
    else:
        mon.x = 0   # Stop horizontal movement

the error is : Invalid Set 'x' (on base:'bool') of value of type 'int'

I tried couple of ideas and please someone explain why and what move and slide does I'm a beginner in GDScript and I'm learning Sfml with C++ Help me on Godot please

Upvotes: 1

Views: 227

Answers (1)

Theraot
Theraot

Reputation: 40295

There are two points of interest here:

  • The variable mon is declared without a type:

    var mon = Vector2.ZERO
    

    Here the variable is initialized with a Vector2.ZERO, but it is a Variant. Godot won't stop you from setting a variable of a different type.

    If you declare the type explicitly:

    var mon:Vector2 = Vector2.ZERO
    

    Or implicitly:

    var mon := Vector2.ZERO
    

    Then Godot will tell you when you are not setting a Vector2 to it.

  • The method move_and_slide returns a bool.

    As a result, here:

    mon = move_and_slide()
    

    The mon variable is being set to a bool value.

    In Godot 3.x move_and_slide used to return a vector with the final velocity. That is no longer true in Godot 4.x. Instead move_and_slide moves according to the velocity property, and it also updates said velocity property.

    The bool value that move_and_slide returns tells you if there were collisions or not.

With that said, you should be using velocity:

extends CharacterBody2D

func _physics_process(delta):
    move_and_slide()

    if Input.is_action_pressed("ui_left"):
        velocity.x = -1  # Set the horizontal speed to -1
    elif Input.is_action_pressed("ui_right"):
        velocity.x = 1   # Set the horizontal speed to 1
    else:
        velocity.x = 0   # Stop horizontal movement

I'll also note that the units of velocity for 2D are pixels per second. So setting its components to 1 means that it will take one second to move a pixel, which is too little to notice.

Instead, consider declaring a speed:

extends CharacterBody2D

var speed := 100.0

func _physics_process(delta):
    move_and_slide()

    if Input.is_action_pressed("ui_left"):
        velocity.x = -speed
    elif Input.is_action_pressed("ui_right"):
        velocity.x = speed
    else:
        velocity.x = 0

Of course, set speed to what you want.


Bonus chatter: you can use get_axis:

extends CharacterBody2D

var speed := 100.0

func _physics_process(delta):
    move_and_slide()

    velocity.x = Input.get_axis("ui_left", "ui_right") * speed

Note that get_axis method uses the strength of the inputs, so it will be sensible to analog input (such as a joystick) if configured.

Upvotes: 0

Related Questions