'''Agens移动控制组件 Extra: jump() 基础的跳跃,可以往上跳跃 stop_jump() 停止跳跃 walL_jump() 墙跳 ''' class_name JumpLocomotionComponent extends LocomotionComponent # <-- JUMP & FALL PROPOTIY --> @export_category("Jump Properties") ##跳跃力度,在调用跳跃方法时自动处理为负,无需 * -1 @export var jump_force : float = 280 ##跳跃极限时间,超过这个时间则无法继续监听跳跃输入 @export var jump_hold_maxium_time : float = .18 ##跳跃时对移动输入的补正 @export var jump_horizontal_Boost : float = 80 ##Jump时是否还需要受到重力影响 @export var jump_effected_by_gravity : bool = true ##半重力触发阈值,当速度小于这个数值时,会将角色的重力减半 @export var light_gravity_threshold: float = 80 ##半重力乘量,默认.5 @export var light_gravity_mult: float = .5 @export_category("Wall Properties") ##如果apply,则在墙壁下滑时,会额外受到摩擦而保持wall slide speed @export var apply_wall_slide_gravity: bool = true ##在墙壁下滑时的速度最大值 @export var wall_slide_fall_maxium_speed: float = 105 @export var wall_jump_base_force_x : float = 380 @export var wall_jump_base_force_y : float = -1 var _jump_timer : float var _is_jumping : bool = false var _is_wall_jumping: bool = false ##跳跃 func jump() -> bool: if _is_jumping : return false ##如果是同方向的,则 if sign(characterbody.velocity.x) * sign(_movement_input) > 0: #给与一个跳跃的补正速度 characterbody.velocity.x += _movement_input * jump_horizontal_Boost * .7 else: characterbody.velocity.x = _movement_input * jump_horizontal_Boost # 跳跃的水平补正速度 _jump_timer = jump_hold_maxium_time _is_jumping = true characterbody.velocity.y = _get_jump_force() return true ##停止跳跃,实际的功能是重置跳跃相关的标识符 func stop_jump() -> void: _is_jumping = false _is_wall_jumping = false ##墙跳 func wall_jump() -> void: if not characterbody.is_on_wall_only(): return characterbody.velocity.x = characterbody.get_wall_normal().x * wall_jump_base_force_x #基础的wall jump force characterbody.velocity.y = _get_jump_force() _jump_timer = jump_hold_maxium_time _is_jumping = true _is_wall_jumping = true func _update_gravity(delta: float) -> void: if _jump_timer >= 0: if _is_jumping: characterbody.velocity.y = _get_jump_force() _jump_timer -= delta #如果不希望jump时受到重力影响,可以关闭此开关 if not jump_effected_by_gravity: return super._update_gravity(delta) ##重写重力乘量函数 func _get_gravity_scale() -> float: var c = absf(characterbody.velocity.y) <= light_gravity_threshold && _is_jumping return light_gravity_mult if c else default_gravity_scale ##重写最大下落速度 func _get_max_fall_speed() -> float: var wall_normal_x = characterbody.get_wall_normal().x if -1 * sign(_movement_input) == wall_normal_x and characterbody.is_on_wall(): return wall_slide_fall_maxium_speed else: return fall_maxium_speed ##设定jump的力度 func _get_jump_force() -> float: var result: float = jump_force if _is_wall_jumping and wall_jump_base_force_y > 0: result = wall_jump_base_force_y return -1.0 * result