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

  • Thread starter Thread starter Darkmisc
  • Start date Start date
  • Tags Tags
    godot
Click For Summary

Discussion Overview

The discussion revolves around a coding issue in a game development context, specifically related to the behavior of an if-statement in GDScript when checking the position of an enemy relative to a player. Participants explore the conditions under which the enemy should fire a shot at the player, including the impact of modifying the condition with an offset.

Discussion Character

  • Technical explanation
  • Debugging advice
  • Conceptual clarification

Main Points Raised

  • The original if-statement works when checking if the enemy's position is less than or equal to the player's position, but fails when an offset is introduced (position.x < shoot_pos - 100).
  • One participant suggests debugging by printing the values of position.x and shoot_pos to understand why the condition fails.
  • Another participant mentions the importance of operator precedence and suggests using parentheses to clarify the intended order of operations in the if-statement.
  • Concerns are raised about the complexity of the condition and whether the variable position.x is global, which could affect its value.
  • A later post indicates that the issue was resolved by modifying the if-statement to include a random offset in a different way, suggesting that the placement of the if-statement within the physics process may have been a factor.

Areas of Agreement / Disagreement

Participants generally agree on the importance of debugging techniques and the potential impact of operator precedence. However, there is no consensus on the exact cause of the initial issue, as multiple factors could contribute to the behavior observed.

Contextual Notes

Limitations include potential misunderstandings of variable scope and the specific behavior of GDScript, which may differ from other programming languages. The discussion does not resolve all uncertainties regarding the conditions under which the enemy fires.

Darkmisc
Messages
222
Reaction score
31
TL;DR
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.

[CODE title="enemy"]func _physics_process(delta):


position+= speed*movement_vector*delta

if position.x <=Global.player_pos.x and shot_fired==false:
launch_proximity()
[/CODE]

[CODE title="shoot_laser" highlight="6"]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)[/CODE]

However, the enemy won't fire if I have this at line 6
[CODE title="line 6"] if position.x<shoot_pos -100:

[/CODE]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
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
[CODE lang=Python title="shoot_laser" highlight="6"]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)
[/code]

It is a good idea to follow the Python style guide https://peps.python.org/pep-0008/.
 
  • Like
Likes   Reactions: berkeman, FactChecker and Darkmisc
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   Reactions: Darkmisc and phinds
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   Reactions: Darkmisc and FactChecker
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   Reactions: Darkmisc
Thanks. It works now.

This is the code I'm using

[CODE lang="python" title="func _physics_process(delta):" highlight="6"]func _physics_process(delta):
position+= speed*movement_vector*delta
if position.x + rand <=Global.player_pos.x and shot_fired==false:
launch_proximity()[/CODE]

[CODE lang="python" title="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)[/CODE]

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

Similar threads

  • · Replies 4 ·
Replies
4
Views
2K