Ball.gd 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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 redundant_ceil = 0.9 # 0.5 < x < 1.0
  9. var last_normal:Vector2 = Vector2(0.0, 0.0)
  10. func interrupt_ball():
  11. modulate = interrupt_color
  12. go_down_unstopped()
  13. func go_down_unstopped():
  14. linear_velocity.y = interrupt_speed
  15. linear_velocity = linear_velocity.normalized() * interrupt_speed
  16. set_collision_mask_bit(brick_layer, false)
  17. func filter_new_contact(new_normal):
  18. var is_new_contact = last_normal.dot(new_normal) < redundant_ceil
  19. last_normal = new_normal
  20. return is_new_contact
  21. func _integrate_forces(state : Physics2DDirectBodyState):
  22. for i in range(state.get_contact_count()):
  23. var contact_normal = state.get_contact_local_normal(i)
  24. if filter_new_contact(contact_normal):
  25. var contact_pos = state.get_contact_local_position(i)
  26. var correct_pos = contact_pos - contact_normal * cell_size
  27. emit_signal("kace_contact", correct_pos)
  28. func _on_Launcher_interrupt_wave():
  29. interrupt_ball()