2Dマリオのボタンを押す長さでジャンプ距離が変わる処理を作りたい

内容

タイトル通りですが、2Dマリオでジャンプボタンを押した時の長さでジャンプ距離が変化する可変ジャンプする処理を作りたいです。
んでも、ボタンを押した時間による処理というプログラムが作れません

知りたいこと

処理のフローは画像の通りですが。どんな数式を使えばいいのかまったく検討が付きません。
青いダイヤの処理なのですが押した長さに応じた距離の変化とはどうやって計算するのか?

*落下タイプのA,Bはそれぞれ別の速さで落下すると思うのですが、取り得ず後回しです。

調べたこと

処理をフローに起こして考えました。
落下速度は提示のvelocity.Y += gravityVelocity * (float)delta; で実現しました。
現状は単純な落下処理なのですが、数式が思いつかず実装出来ません

環境

OS:Ubuntu
Lang: C#
Godot: 4.6

using Godot;
using System;

public partial class PlayerController : CharacterBody2D
{
    public float jumpVelocity = -900;
    public float gravityVelocity = 1300;

    Vector2 velocity; 

    public override void _Ready()
    {
        velocity = new Vector2(0,0);
    }

    
    public override void _PhysicsProcess(double delta)
    {

        
        if(Input.IsActionJustPressed("space") && IsOnFloor())
        {
            GD.Print("Jump");
            velocity.Y = jumpVelocity;
        }

        if(IsOnFloor() == false)
        {
            velocity.Y += gravityVelocity * (float)delta;
        }

        if(IsOnFloor() == true)
        {
       //     GD.Print("On Floor");
        }
        

        Velocity = velocity; 
        MoveAndSlide(); 
    }

}

Dropbox Project URL: Dropbox

from Discord by amagichan00

こんな感じでしょうか

a

from Discord by tmidry

extends CharacterBody2D

const JUMP_V0 = Vector2(0, -800)
const G := 1000
const HORIZONTAL_V := 600

@onready var jump_timer := $JumpTimer

var long_jump := true

func _input(event):
    if event.is_action_pressed("jump") and is_on_floor():
        jump()
    elif event.is_action_released("jump"):
        long_jump = false
    velocity.x = HORIZONTAL_V * Input.get_axis("left", "right")

func _physics_process(delta):
    if !is_on_floor():
        velocity.y += G * delta
    move_and_slide()

func jump() -> void:
    velocity = JUMP_V0
    long_jump = true
    jump_timer.start()

func _on_jump_timer_timeout(): 
    if !long_jump:
        velocity.y /= 2   

GDScriptで申し訳ないですが、「ロングジャンプ前提の速度にしTimerを起動させて、指定時間までにジャンプキーが離されてたらy方向の速度を半減させる」でそれっぽくなると思います


from Discord by tmidry

ありがとうございます


from Discord by amagichan00

タイマー以外にもあったりしませんか?、数式としては存在しない?


from Discord by amagichan00

ジャンプキーを押している時間をtとして
[1] 今もジャンプキーが押されているなら
v_y = (g-a)t (a<g)
[2] ジャンプキーが離されたなら
v_y = gt
とする方法もありますが、パラメーター調整が難しくなるような気がします


from Discord by tmidry

ありがとうございます。sin派とか使わないでタイマーのほうが簡単でいいですかね?


from Discord by amagichan00

タイマーの方が小 / 大ジャンプの二つの動きだけに出来るので良いかなぁと思います


from Discord by tmidry