Double tap to run/dash logic?

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By Robster
:warning: Old Version Published before Godot 3 was released.

Hi all,

Chasing some logic ideas here. I’m pretty new at this.

I have a character running, jumping, etc. I want to implement a “dash” function to the character.

Pressing R makes character run, tapping and holding R again makes character dash.

I have a state setup happening where I have all my code in the R key as such:

	if btn_right.check() == 2:  #2 = pressed in the input_states.gd script
	move(player_speed, acceleration, delta)
	ORIENTATION_NEXT = "right"
	anim = "run"
	anim_speed = 2
	anim_blend = 0.3

How would I go about putting a check in there for dashing or not?
I’ve considered these variables:

#dash variables
var dash = false  #are they dashing?
var dash_time = 4  #how long they can dash for
var dash_speed = 2 #multiplier - how much faster than the normal run is the dash

I’m just at a loss of how to say and where to put something like:

  • check if R is pressed a second time
  • if so, then dash like a madpixelsprite
  • if key released, set dash to FALSE

I know I’ve almost answered it, I just can’t get it right unfortunately. Any help would be manna from heaven. :slight_smile:

:bust_in_silhouette: Reply From: Robster

For future reference, this is where I’m heading.

I am thinking that when the timer reaches 0 it will reset the dash_count to 0.

You’re heading in the right direction. Added my solution below

gonzo191 | 2016-08-19 21:33

:bust_in_silhouette: Reply From: gonzo191

You’re heading in the right direction. The following should help assuming you’re using input_states.gd from ndee85 since you had btn_right.check(). The code has not been tested but I used a similar piece on a Unity project. The logic is the same so it should work.

var dashing          = false   # whether player is dash or not
var max_dash_delay   = 0.5     # time between keypress (.5 secs)
var max_dash_time    = 2.0     # how long player can run for (2 secs)
var dash_timer       = 0       # timer to reset dash state
var dash_press_count = 0       # keep track of double tap count
var move_speed       = 5       # the normal move speed
var dash_speed       = 10      # the dash speed
var speed            = 0       # used to store whichever speed the player is moving at
var velocity                   # the velocity which governs the player's movement

# using ndee85 state values [ 0 - released, 1 - just pressed, 2 - pressed, 3 - just released ] below for readability
var INPUT_RELEASED      = 0
var INPUT_JUST_PRESSED  = 1
var INPUT_PRESSED       = 2
var INPUT_JUST_RELEASED = 3

_ready() :
	speed = move_speed    # default to the move speed
	velocity = Vector2()  # default velocity

_process(delta) :

	# only attempt to dash if the player's not dashing
	if (dash_action.check() == INPUT_JUST_PRESSED and not dashing) :
		dash_press_count += 1
	
	# start the dash timer when player just presses the dash action
	if (dash_press_count > 0 and not dashing) :
		dash_timer += delta

		# the player took too long to perform the second tap so reset values
		if (dash_timer > max_dash_delay) :
			dash_timer = 0
			dash_press_count = 0

	# the player managed to dash successfully
	if (dash_press_count >= 2 and not dashing) :
		dashing = true
		dash_timer = 0
		dash_press_count = 0

		# player now uses the dash speed until timer elapses
		speed = dash_speed

	# the player will continue to dash until the timer elapses
	if (dashing) :
		dash_timer += delta
		if (dash_timer >= max_dash_time) :
			dashing = false
			dash_timer = 0

			# timer elapsed, reset to the normal speed
			speed = move_speed

	# move using whichever speed is chosen
	velocity += Vector2( speed * delta, velocity.y )

    # assuming you're using kinematicbody2d otherwise use set_pos(velocity)
	move (velocity)