Topic was automatically imported from the old Question2Answer platform.
Asked By
CosmicLife
I wan to have a system similar to Ori’s slam ability or that one shovel knight DLC I can’t remember the name of, where the player launches toward(Through) the nearest enemy/special obstacle. Here is what the function looks like currently
Code starts here, the code detector kind of sucks.
VV
func dash_slash():
var enemies = get_tree().get_nodes_in_group("Enemies")
var nearest_enemy = enemies[0]
for enemy in enemies:
if enemy.global_position.distance_to(player_pos) < nearest_enemy.global_position.distance_to(player_pos):
nearest_enemy = enemy
dash_slash_apply = get_angle_to(nearest_enemy.global_position) * DASHSLASHFORCE
#How do I make this a vector 2D?
move_and_slide(dash_slash_apply)
As you may be able to see I am able to find the position of the nearest enemy(hopefully that works at least though I don’t really know), all I want to do is launch the player toward that point. They are a kinematic body. Anything that makes the player move toward that point at high speed would work too, it doesn’t have to be an impulse.
You simply subtract your character’s position from the enemy’s position:
var linear_velocity = Vector2()
var dashing = true
func _physics_process(delta):
if not dashing:
linear_velocity.y += GRAVITY * delta
if is_on_floor():
linear_velocity.y = 0
else:
# This will make your dash lose speed over time
linear_velocity = lerp(linear_velocity, 0.0, delta)
# Stop dashing when we are too slow
dashing = linear_velocity.length() > 0.1
linear_velocity = move_and_slide(linear_velocity)
func dash_slash():
# Avoid dash spamming
if dashing:
return
dashing = true
var enemies = get_tree().get_nodes_in_group("Enemies")
var nearest_enemy = enemies[0]
var nearest_enemy_pos = enemies[0].global_position.distance_to(player_pos)
for enemy in enemies:
var enemy_pos = enemy.global_position
if enemy_pos.distance_to(player_pos) < nearest_enemy_pos:
nearest_enemy_pos = enemy_pos
nearest_enemy = enemy
# Now you have a vector to use
dash_slash_apply = (nearest_enemy_pos - player_pos) * DASHSLASHFORCE
move_and_slide(dash_slash_apply)
I modifed your code a bit to be a true dash abillity, but the answer to your question is:
Thanks so much! I really appreciate it especially since it is a “simple” question that only I seem to have had trouble with, so I couldn’t find the answers online. Thanks!
I’m really sorry but I have been trying to get your code to work for days and it seems to be riddled with errors. I hate to be so negative but it seems like you didn’t test your code at all before handing it off to me. I will list a couple of the problems I am having and will be very thankful if you help me fix them.
is creating an error because a float and a Vector2D can’t use the - operand.
2. If I use your non edited code and use the simple version you gave me it just flings my character off to the bottom right no matter where I stand.
I hope you don’t feel like I’m accusing you of anything and I really appreciate the response but it’s so frustrating that you gave me code that clearly doesn’t work and hasn’t been tested. I hope we can figure this out together.