pong.gd 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. extends Node2D
  2. # Member variables
  3. const INITIAL_BALL_SPEED = 80
  4. var ball_speed = INITIAL_BALL_SPEED
  5. var screen_size = Vector2(640, 400)
  6. # Default ball direction
  7. var direction = Vector2(-1, 0)
  8. var pad_size = Vector2(8, 32)
  9. const PAD_SPEED = 150
  10. func _process(delta):
  11. # Get ball position and pad rectangles
  12. var ball_pos = get_node("ball").get_position()
  13. var left_rect = Rect2(get_node("left").get_position() - pad_size * 0.5, pad_size)
  14. var right_rect = Rect2(get_node("right").get_position() - pad_size * 0.5, pad_size)
  15. # Integrate new ball postion
  16. ball_pos += direction * ball_speed * delta
  17. # Flip when touching roof or floor
  18. if (ball_pos.y < 0 and direction.y < 0) or (ball_pos.y > screen_size.y and direction.y > 0):
  19. direction.y = -direction.y
  20. # Flip, change direction and increase speed when touching pads
  21. if (left_rect.has_point(ball_pos) and direction.x < 0) or (right_rect.has_point(ball_pos) and direction.x > 0):
  22. direction.x = -direction.x
  23. ball_speed *= 1.1
  24. direction.y = randf() * 2.0 - 1
  25. direction = direction.normalized()
  26. # Check gameover
  27. if ball_pos.x < 0 or ball_pos.x > screen_size.x:
  28. ball_pos = screen_size * 0.5
  29. ball_speed = INITIAL_BALL_SPEED
  30. direction = Vector2(-1, 0)
  31. get_node("ball").set_position(ball_pos)
  32. # Move left pad
  33. var left_pos = get_node("left").get_position()
  34. if left_pos.y > 0 and Input.is_action_pressed("left_move_up"):
  35. left_pos.y += -PAD_SPEED * delta
  36. if left_pos.y < screen_size.y and Input.is_action_pressed("left_move_down"):
  37. left_pos.y += PAD_SPEED * delta
  38. get_node("left").set_position(left_pos)
  39. # Move right pad
  40. var right_pos = get_node("right").get_position()
  41. if right_pos.y > 0 and Input.is_action_pressed("right_move_up"):
  42. right_pos.y += -PAD_SPEED * delta
  43. if right_pos.y < screen_size.y and Input.is_action_pressed("right_move_down"):
  44. right_pos.y += PAD_SPEED * delta
  45. get_node("right").set_position(right_pos)
  46. func _ready():
  47. screen_size = get_viewport_rect().size # Get actual size
  48. pad_size = get_node("left").get_texture().get_size()
  49. set_process(true)