extends RigidBody2D export var max_distance = 64 export var max_tangential_accel = 32 export var max_travel_time = 2.0 export var push_force = 128 export var collision_minor_speed_threshold = 8 export var collision_major_speed_threshold = 32 export var collision_timedt_threshold = 0.1 var body_radius = 0 var mouse_position = Vector2.ZERO var mouse_down = false var push = false var traveling = 0; var in_air = true var air_time = 0 var last_speed = 0 # Called when the node enters the scene tree for the first time. func _ready(): set_process(true) set_physics_process(true) set_process_input(true) body_radius = $CollisionShape2D.shape.radius $Particles.process_material.color = $Sprite.material.get_shader_param("rim_color"); func _input(event): if event is InputEventMouseMotion: mouse_position = get_global_mouse_position() if Input.is_action_just_pressed("ButtonA"): mouse_down = true elif Input.is_action_just_released("ButtonA"): mouse_down = false push = true func _physics_process(delta): if mouse_down: return # We don't follow the mouse or move the squiq when mouse is down. if push: push = false traveling = max_travel_time var v_direction = (position - mouse_position).normalized() apply_central_impulse(v_direction * abs(v_direction.length()) * push_force) elif in_air: air_time += delta else: var distance = clamp(mouse_position.x - position.x, -max_distance, max_distance) var dpercent = distance / max_distance if abs(distance) > body_radius: var v_horizontal = Physics2DServer.area_get_param(get_world_2d().get_space(), Physics2DServer.AREA_PARAM_GRAVITY_VECTOR).rotated(deg2rad(-90)) $Particles.process_material.tangential_accel = dpercent * max_tangential_accel; apply_central_impulse(v_horizontal * distance * delta) else: $Particles.process_material.tangential_accel = 0 last_speed = linear_velocity.length() #print(last_speed) func _process(delta): update() func _draw(): if mouse_down: var distance = min(position.distance_to(mouse_position), max_distance) var v_direction = (position - mouse_position).normalized().rotated(-rotation) var v_start = v_direction * body_radius var v_end = v_direction * distance var v_tipA = v_end - (v_direction.rotated(deg2rad(30)) * min(distance, 16)) var v_tipB = v_end - (v_direction.rotated(-deg2rad(30)) * min(distance, 16)) var c_line = Color(0.25, 1.0, 0.0) draw_line(v_start, v_end, c_line) draw_line(v_end, v_tipA, c_line) draw_line(v_end, v_tipB, c_line) func _on_Player_body_entered(body): in_air = false #print(linear_velocity) if air_time > collision_timedt_threshold: var lvlen = linear_velocity.length() if lvlen >= collision_minor_speed_threshold and lvlen < collision_major_speed_threshold: print("ooOF") elif lvlen >= collision_major_speed_threshold: print("Oooooch!") air_time = 0 func _on_Player_body_exited(body): in_air = true print("I'm flying!")