0 votes

So, I created a gun which reacts to my right stick :

extends Node2D

var shot = preload( "res://tscn/weapons/shot.tscn" )
var RS_x = 0
var RS_y = 0

func _ready():
    set_fixed_process( true )

func _fixed_process( delta ):

    RS_x = Input.get_joy_axis(0, 2)
    RS_y = Input.get_joy_axis(0, 3)

    if RS_x > 0.5 || RS_x < - 0.5 || RS_y > 0.5 || RS_y < - 0.5:
            _shoot_bullet( RS_x, RS_y )

func _shoot_bullet( RS_x, RS_y ):
    var new_shot = shot.instance()
    new_shot.set_global_pos( get_node( "shootfrom" ).get_global_pos() )
    new_shot._set_direction( Vector2( RS_x, RS_y ) )
    get_node("../..").add_child( new_shot )

It adds a shot, passing the stick direction as argument to this function (inside the "shot" node) :

func _set_direction( vector ):
    direction = vector
    direction = direction.normalized()
    direction_set = true

Everything works fine, and once inside the tree, the shot goes to the same direction until it's freed. That's what I want.

I then created an enemy, JackBot, which locates the player every frame and shoots him when he can :

extends Area2D

var shot = preload( "res://tscn/weapons/enemy_shot.tscn" )

var shoot_decay = 0.2
var time_since_shoot = 0
var shoot_direction

func _ready():
    set_fixed_process( true )

func _fixed_process(delta):

    _locate_player()

    if time_since_shoot < shoot_decay:
        time_since_shoot += delta
    else:
        time_since_shoot = 0
        _shoot_bullet( shoot_direction )

func _locate_player():
    shoot_direction = - ( get_node("shootfrom").get_global_pos() - get_node("../../player/target").get_global_pos() )

func _shoot_bullet( shoot_direction ):
    var new_shot = shot.instance()
    new_shot.set_global_pos( get_node( "shootfrom" ).get_global_pos() )
    new_shot._set_direction( shoot_direction )
    get_node("../..").add_child( new_shot )

I copied the _set_direction(): function from shot to enemy_shot (the node JackBot adds when he shoots). But instead of going straight in a line, the shot now follows the player, as if the vector argument was a pointer to the constantly updated shoot_direction variable, which tracks the position of the player.

So here are my two questions :
How do I copy the shoot_direction Vector2; so once it's passed to the enemy_shot, it remains the same Vector2 (and doesn't point anymore to the player's location) ?
And most important, why the shot instance doesn't change when I move the stick after it has been fired ?

Thanks a lot, please tell me if I did wrong formatting as it's my first question.

asked Jul 17, 2017 in Engine by Flying_Dindoleon (16 points)

Are you sure your shot is getting parented where you expect?

Wow, you're totally right. My code works this way : main/level/jackbot/enemy_shot. I parented the enemy_shot to main instead of level, which is the node that gets moved when I move the left stick (the Player node remains at the center of the screen).
So if the shot always tracked the player, it's not because of the _locate_player function keeping updating, it's because the offset of the moving level wasn't applied to it...
Thank you :) .

Please log in or register to answer this question.

Welcome to Godot Engine Q&A, where you can ask questions and receive answers from other members of the community.

Please make sure to read How to use this Q&A? before posting your first questions.