Why won't my laser fire to the left of screen? (game design)

  • Thread starter Thread starter Darkmisc
  • Start date Start date
  • Tags Tags
    Laser
AI Thread Summary
The discussion revolves around a coding issue in a shoot 'em up game where the player can shoot lasers in both left and right directions. The developer is facing a problem where only one type of laser fires, despite the program recognizing the player's facing direction correctly. The code includes separate instances for left and right lasers, but the firing function only executes for one type. Debugging efforts included checking the values of a global variable that tracks the player's direction and modifying the shooting function. The breakthrough came when the developer identified that certain lines controlling the player's facing direction were causing the issue. By removing those lines, the code began to function as intended, allowing the player to fire the appropriate laser based on their direction.
Darkmisc
Messages
222
Reaction score
31
TL;DR Summary
I'm making a game where the player can face either left or right. I want them to fire a laser in the direction they face. I'm using an if-statement to determine which laser to fire (based on whether the player sprite is flipped). I suspect the if-statement is not working.
Hi everyone

I'm making a shoot 'em up like Fantasy Zone, i.e. the player can face either left or right (as opposed to only facing one direction while moving forwards and backwards).

I've made separate scenes for the laser that fires left and the laser that fires right.

The player should fire the lasers based on which way they are facing.

However, the player only fires the laser that is instanced at line 61. I've tried both LASER and RLASER in that position and they both work.
The problem is that the player will only fire one type of laser. They won't fire the laser instanced after the else-statement.

I made a label to check when Global.face_right==true and Global.face_right==false, and the label always displays the correct value.
It seems the program knows which way the player is facing, but won't fire the appropriate laser.

Does anyone know what I've done wrong? Thanks[CODE title="Player.gd" highlight="18, 22, 24-27, 60"]extends KinematicBody2Dvar speed = 300
var LASER = preload("res://Laser/Laser.tscn")
var RLASER = preload("res://Laser/Rev_Laser.tscn")
export var normalFireDelay: float = 0.12
export var rapidFireDelay: float = 0.08
var fireDelay: float = normalFireDelay
var vel := Vector2(0, 0)
var laser_parent = Node2D.new()
var laser_parent2 = Node2D.new()
func _physics_process(delta):
var dirVec := Vector2(0, 0)
$Label.text=str(Global.face_right)

move_and_slide(Global.move_vector * speed)

$AnimatedSprite.flip_h = Global.move_vector.x < 0

if $AnimatedSprite.flip_h:
Global.face_right=false
else:
Global.face_right=true if Input.is_action_pressed("shoot"):
shoot_laser()

# if Input.is_action_pressed("shoot") and Global.face_right==false:
#
# shoot_R_laser()

if Input.is_action_pressed("move_left"):
dirVec.x = -1
Global.face_right=false
$AnimatedSprite.set_flip_h(true)
elif Input.is_action_pressed("move_right"):
dirVec.x = 1
Global.face_right=true
$AnimatedSprite.set_flip_h(false)
if Input.is_action_pressed("move_up"):
dirVec.y = -1
elif Input.is_action_pressed("move_down"):
dirVec.y = 1

vel = dirVec.normalized() * speed
position += vel * delta

var viewRect := get_viewport_rect()
position.x = clamp(position.x, 0, viewRect.size.x)
position.y = clamp(position.y, 0, viewRect.size.y)
func shoot_laser():
if Global.face_right:
var new_laser = LASER.instance()
get_parent().add_child(laser_parent)
laser_parent.add_child(new_laser)
new_laser.global_position = Vector2(global_position.x+53, global_position.y)
else:
var new_laser2 = RLASER.instance()
get_parent().add_child(laser_parent2)
laser_parent2.add_child(new_laser2)
new_laser2.global_position = Vector2(global_position.x-53, global_position.y)

func shoot_R_laser():
var new_laser = RLASER.instance()
get_parent().add_child(laser_parent)
laser_parent.add_child(new_laser)
new_laser.global_position = Vector2(global_position.x-53, global_position.y)
[/CODE]
 
Technology news on Phys.org
One of my techniques for debugging a block like this is to systematically eliminate variables and functions until I have the mere skeleton of the function that is misbehaving. This is also a really good way to present your code to readers to debug, so we don't have to understand every aspect of your game, such as movement and firing delay. (Although I guarantee it won't come to that. By the time you eliminate well-behaved extraneous code, the error will jump out at you.)

Also, are lines 33-35 supposed to be commented out? That calls shoot_R_laser()
 
Last edited:
I've deleted all the unnecessary stuff.

The parts I commented out could have been omitted. I've tried putting the if-statement in different places. I originally had shoot_R_laser() as a separate function, but ended up copying its contents into the shoot() function.

This code is slightly different. At line 42, I have:
if Global.face_right==false:

Now the code is only executing the line after the else statement.

I'm sure this is significant, I just can't work out how :s

[CODE title="Player.gd" highlight="42-51, 26-27, 20-23, 4-5"]extends KinematicBody2D

var speed = 300
var LASER = preload("res://Laser/Laser.tscn")
var RLASER = preload("res://Laser/Rev_Laser.tscn")
var vel := Vector2(0, 0)
var laser_parent = Node2D.new()
var laser_parent2 = Node2D.new()
func _physics_process(delta):
var dirVec := Vector2(0, 0)
$Label.text=str(Global.face_right)

move_and_slide(Global.move_vector * speed)

$AnimatedSprite.flip_h = Global.move_vector.x < 0

if $AnimatedSprite.flip_h:
Global.face_right=false
else:
Global.face_right=true if Input.is_action_pressed("shoot"):
shoot_laser()

if Input.is_action_pressed("move_left"):
dirVec.x = -1
Global.face_right=false
$AnimatedSprite.set_flip_h(true)
elif Input.is_action_pressed("move_right"):
dirVec.x = 1
Global.face_right=true
$AnimatedSprite.set_flip_h(false)

vel = dirVec.normalized() * speed
position += vel * delta

func shoot_laser():
if Global.face_right==false:
var new_laser = RLASER.instance()
get_parent().add_child(laser_parent)
laser_parent.add_child(new_laser)
new_laser.global_position = Vector2(global_position.x+53, global_position.y)
else:
var new_laser2 = LASER.instance()
get_parent().add_child(laser_parent2)
laser_parent2.add_child(new_laser2)
new_laser2.global_position = Vector2(global_position.x-53, global_position.y)



[/CODE]
 
I think I found the problem. It's lines 20-23.

I changed them to this
[CODE title="problem"] if $AnimatedSprite.flip_h:
Global.face_right=false
$Label2.text="false"
else:
Global.face_right=true
$Label2.text="true"[/CODE]

And Label2 always reads true.
 
I deleted lines 20-23, and it works now.
 
  • Like
Likes DaveC426913
Dear Peeps I have posted a few questions about programing on this sectio of the PF forum. I want to ask you veterans how you folks learn program in assembly and about computer architecture for the x86 family. In addition to finish learning C, I am also reading the book From bits to Gates to C and Beyond. In the book, it uses the mini LC3 assembly language. I also have books on assembly programming and computer architecture. The few famous ones i have are Computer Organization and...
I have a quick questions. I am going through a book on C programming on my own. Afterwards, I plan to go through something call data structures and algorithms on my own also in C. I also need to learn C++, Matlab and for personal interest Haskell. For the two topic of data structures and algorithms, I understand there are standard ones across all programming languages. After learning it through C, what would be the biggest issue when trying to implement the same data...
Back
Top