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

  • Thread starter Darkmisc
  • Start date
  • Tags
    Laser
  • #1
Darkmisc
220
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
Player.gd:
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)
 
Technology news on Phys.org
  • #2
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:
  • #3
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

Player.gd:
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)
 
  • #4
I think I found the problem. It's lines 20-23.

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

And Label2 always reads true.
 
  • #5
I deleted lines 20-23, and it works now.
 
  • Like
Likes DaveC426913

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

Why won't my laser fire to the left of the screen?

One possible reason could be that the game design or coding is restricting the laser from firing to the left. Check the game's logic and code to ensure there are no limitations preventing the laser from firing in that direction.

Could it be a problem with the laser's trajectory?

Yes, it is possible that the trajectory of the laser is not set up to allow it to fire to the left of the screen. Make sure the trajectory is properly programmed to allow the laser to move in all directions, including to the left.

Is there a collision detection issue preventing the laser from firing left?

Check the collision detection system in the game to see if there are any obstacles or boundaries blocking the laser from firing to the left. Adjust the collision detection settings to ensure the laser can pass through and fire in that direction.

Could it be a problem with the game's physics engine?

It is possible that the game's physics engine is not configured to allow the laser to fire to the left. Make sure the physics settings are adjusted to enable the laser to move in all directions, including to the left side of the screen.

Are there any specific controls or inputs needed to fire the laser left?

Check the game's control settings to see if there are any specific inputs required to fire the laser to the left. Make sure the controls are properly mapped to allow the player to fire the laser in all directions, including to the left.

Back
Top