class_name Ball extends RigidBody2D export (Color) var interrupt_color = Color.white signal kace_contact const brick_layer = 2 const interrupt_speed = 700 const cell_size = Vector2(20, 10) const redundant_ceil = 0.9 # 0.5 < x < 1.0 var last_normal:Vector2 = Vector2(0.0, 0.0) func interrupt_ball(): modulate = interrupt_color go_down_unstopped() func go_down_unstopped(): linear_velocity.y = interrupt_speed linear_velocity = linear_velocity.normalized() * interrupt_speed set_collision_mask_bit(brick_layer, false) func filter_new_contact(new_normal): var is_new_contact = last_normal.dot(new_normal) < redundant_ceil last_normal = new_normal return is_new_contact func _integrate_forces(state : Physics2DDirectBodyState): for i in range(state.get_contact_count()): var contact_normal = state.get_contact_local_normal(i) if filter_new_contact(contact_normal): var contact_pos = state.get_contact_local_position(i) var correct_pos = contact_pos - contact_normal * cell_size emit_signal("kace_contact", correct_pos) func _on_Launcher_interrupt_wave(): interrupt_ball()