Hi
I'm not sure if Godot has a built-in function for this or not, but I've tried to make something like the "lengthdir" function from GameMaker and although it works, it doesn't look as smooth and has some issues.

https://i.imgur.com/xRPUsqg.gif

As you can see, when I'm shooting in a straight line, it's fine, but as soon as I rotate the character (while shooting), it does a weird animation.

``````func shoot():
if can_shoot:
can_shoot = false
var dir = Vector2(1, 0).rotated(\$Sprite/shootspot.global_rotation)
var kick = 200
var kickdirection = (rad2deg(dir.angle())) - 180
velocity.x = velocity.x + (kick * cos(kickdirection))
velocity.y = velocity.y + (kick * -sin(kickdirection))
``````
in Engine
edited

You should decrease the velocity in _process function.
I use a simple way to do it. That would decrease velocity rapidly.
velocity = velocity *0.7

by (304 points)

What does decreasing the velocity has anything to do with shoot kickback? I tried what you suggested but didn't make any difference.

I'm guessing it has something to do with these 2 lines??:

``````velocity.x = velocity.x + (kick * cos(kickdirection))
velocity.y = velocity.y + (kick * -sin(kickdirection))
``````

Thanks.

What about something like this? Without cos and sin.
You need the opposite direction.

``````func shoot():

if can_shoot:
can_shoot = false
var dir = Vector2(1, 0).rotated(\$Sprite/shootspot.global_rotation)
var kick = 200
var kickdirection = kick * (dir*-1)
velocity = velocity + kickdirection

func _process(delta):
body.position += velocity
velocity = velocity *0.7
``````