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
SUMMARY

The issue with the if-statement not firing in the original code was due to the incorrect comparison of position.x and shoot_pos with an offset of -100. The user resolved the problem by modifying the condition to include a random value and ensuring the if-statement was placed within the _physics_process function. The final working code checks if position.x plus a random value is less than or equal to Global.player_pos.x, allowing the enemy to fire correctly.

PREREQUISITES
  • Understanding of GDScript syntax and structure
  • Familiarity with game development concepts, particularly in Godot Engine
  • Knowledge of variable scope and global variables in GDScript
  • Basic debugging techniques in programming
NEXT STEPS
  • Learn about GDScript variable scope and how it affects game logic
  • Explore Godot Engine's physics process and its implications for game mechanics
  • Investigate debugging techniques specific to GDScript, including print statements
  • Study operator precedence in GDScript to avoid logical errors in conditions
USEFUL FOR

Game developers using Godot Engine, particularly those working with GDScript and needing to troubleshoot enemy AI behavior and shooting mechanics.

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