Ball.gd 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. class_name Ball
  2. extends RigidBody2D
  3. export (Color) var interrupt_color = Color.white
  4. signal kace_contact
  5. const brick_layer = 2
  6. const interrupt_speed = 700
  7. const cell_size = Vector2(20, 10)
  8. const max_penetration = 1.0
  9. const contact_corrector = cell_size - Vector2(max_penetration, max_penetration)
  10. const redundant_ceil = 0.9 # 0.5 < x < 1.0
  11. var last_normal:Vector2 = Vector2(0.0, 0.0)
  12. func interrupt_ball():
  13. modulate = interrupt_color
  14. go_down_unstopped()
  15. func go_down_unstopped():
  16. linear_velocity.y = interrupt_speed
  17. linear_velocity = linear_velocity.normalized() * interrupt_speed
  18. set_collision_mask_bit(brick_layer, false)
  19. func filter_new_contact(new_normal):
  20. var is_new_contact = last_normal.dot(new_normal) < redundant_ceil
  21. last_normal = new_normal
  22. return is_new_contact
  23. func _integrate_forces(state : Physics2DDirectBodyState):
  24. for i in range(state.get_contact_count()):
  25. var contact_normal = state.get_contact_local_normal(i)
  26. if filter_new_contact(contact_normal):
  27. var contact_pos = state.get_contact_local_position(i)
  28. var correct_pos = contact_pos - contact_normal * contact_corrector
  29. emit_signal("kace_contact", correct_pos)
  30. func _on_Launcher_interrupt_wave():
  31. interrupt_ball()
  32. func _on_Ball_body_exited(body: Node):
  33. if body.has_method("impact"):
  34. body.impact(position)