Why does my if-statement not work when I have (x-100) instead of x?

  • Thread starter Darkmisc
  • Start date
  • Tags
    godot
  • #1
Darkmisc
213
28
TL;DR Summary
I'd like enemies to fire a shot once they get behind the player. I have an if-statement to fire a shot if position<x. This works. However, the if-statement doesn't work if I write "if position<x-100".
Hi everyone

I'm making a shoot 'em up in which enemies travel right to left towards the player. If they get behind the player, they are supposed to fire a shot at the player.

The code below for the enemy works, but I'd like a slight delay before the shot is fired.

enemy:
func _physics_process(delta):
 

    position+=  speed*movement_vector*delta

    if position.x <=Global.player_pos.x and shot_fired==false:
        launch_proximity()

shoot_laser:
func launch_proximity():
    shot_fired=true
    player_pos=Global.player_pos.x
    shoot_pos = player_pos

    if position.x<shoot_pos:
        print("bam")
        var child_node = $EnemyBarrel/Muzzle
        Global.rot = $EnemyBarrel.rotation
        var l = LASER.instance()

        get_parent().add_child(laser_parent)
        laser_parent.add_child(l)
        l.global_position = child_node.global_position
        l.rotation = $EnemyBarrel.rotation
        add_child(l)

However, the enemy won't fire if I have this at line 6
line 6:
    if position.x<shoot_pos -100:
Does anyone know why?

Thanks

EDIT: I have the player in the middle of the screen when the enemies pass, so I don't think it's because the enemies are off-screen by the time they are 100 pixels behind the player.

Also, I've used position.x<shoot_pos - rand_range(0, 200) and they've never fired with that code either.
 
Last edited:
Technology news on Phys.org
  • #2
To debug this kind of problem, insert a line print(position.x, shoot_pos) before the test that is not doing what you expect. Edit: If it is still doing something strange, try print(type(position.x), type(shoot_pos)).

When you post code here, make sure you select an appropriate language: GDScript is based on Python, so use Python.

You will find that it is much easier to debug code if you use consistent spacing, so for instance
shoot_laser:
func launch_proximity():
    shot_fired = true
    player_pos = Global.player_pos.x
    shoot_pos = player_pos

    if position.x < shoot_pos:
        print("bam")
        var child_node = $EnemyBarrel / Muzzle
        Global.rot = $EnemyBarrel.rotation
        var l = LASER.instance()

        get_parent().add_child(laser_parent)
        laser_parent.add_child(l)
        l.global_position = child_node.global_position
        l.rotation = $EnemyBarrel.rotation
        add_child(l)

It is a good idea to follow the Python style guide https://peps.python.org/pep-0008/.
 
  • Like
Likes berkeman, FactChecker and Darkmisc
  • #3
I think some statements about GDscript operator precedence and short-circuit evaluation are a little vague.
This might be over-cautious and make no difference, but if things are acting strange, I would use more parentheses to force the operation order as you want it:
Python:
if ( position.x < (shoot_pos -100) ):
 
Last edited:
  • Like
Likes Darkmisc and phinds
  • #4
Some general debugging advice:

1.State the language you are using - don't make us guess. This looks like a precedence problem, which can be language-specific.

2. Give us the shortest possible piece of code that shows the problem. Often the process of finding this also provides a strong hint as to the answer.
 
  • Like
Likes Darkmisc and FactChecker
  • #5
Darkmisc said:
Also, I've used position.x<shoot_pos - rand_range(0, 200) and they've never fired with that code either.
Making it more complicated is not likely to help. A lot of things could go wrong. Is position.x global?
I see a recent edit. Have you tried any of our suggestions? Especially try @pbuk 's suggestion in post #2 to print the values of interest. When things are behaving strangely, it is often because the variable values are not what you expected.
 
  • Like
Likes Darkmisc
  • #6
Thanks. It works now.

This is the code I'm using

func _physics_process(delta)::
func _physics_process(delta): 
    position+=  speed*movement_vector*delta   
    if position.x + rand <=Global.player_pos.x  and shot_fired==false:
        launch_proximity()

shoot_laser:
func launch_proximity():
    shot_fired=true
    var child_node = $EnemyBarrel/Muzzle
    Global.rot = $EnemyBarrel.rotation   
    var l = LASER.instance()

    get_parent().add_child(laser_parent)
    laser_parent.add_child(l)
    l.global_position = child_node.global_position
    l.rotation = $EnemyBarrel.rotation
    add_child(l)

I think I needed to have my if-statement in the physics process.
 
Last edited by a moderator:

Related to Why does my if-statement not work when I have (x-100) instead of x?

1. Why does my if-statement not work when I have (x-100) instead of x?

When you have (x-100) instead of just x in your if-statement, you are checking if the value of x is 100 less than the expected value. Make sure that this is the condition you want to check for in your if-statement.

2. Can I use expressions in an if-statement?

Yes, you can use expressions in an if-statement. However, make sure that the expression evaluates to a boolean value (true or false) to determine the outcome of the if-statement.

3. How can I debug my if-statement to find the issue?

You can debug your if-statement by printing out the value of (x-100) and x to see if they are what you expect them to be. This can help you identify any discrepancies and fix the issue.

4. Is there a difference between using (x-100) and x in an if-statement?

Yes, there is a difference between using (x-100) and x in an if-statement. (x-100) represents a value that is 100 less than x, while x represents the original value of x. Make sure you are using the correct expression based on your intended condition.

5. What are common mistakes to avoid when using expressions in if-statements?

Common mistakes to avoid when using expressions in if-statements include not properly evaluating the expression to a boolean value, using the wrong comparison operators, and not considering the order of operations in the expression. Double-check your syntax and logic to ensure your if-statement works as intended.

Similar threads

  • Programming and Computer Science
Replies
4
Views
1K
Back
Top