Multiple Bouncing Balls

Screen shot of bouncing balls
bouncing_balls.py
  1"""
  2Bounce balls on the screen.
  3Spawn a new ball for each mouse-click.
  4
  5If Python and Arcade are installed, this example can be run from the command line with:
  6python -m arcade.examples.bouncing_balls
  7"""
  8
  9import arcade
 10import random
 11
 12# --- Set up the constants
 13
 14# Size of the screen
 15SCREEN_WIDTH = 600
 16SCREEN_HEIGHT = 600
 17SCREEN_TITLE = "Bouncing Balls Example"
 18
 19
 20class Ball:
 21    """
 22    Class to keep track of a ball's location and vector.
 23    """
 24    def __init__(self):
 25        self.x = 0
 26        self.y = 0
 27        self.change_x = 0
 28        self.change_y = 0
 29        self.size = 0
 30        self.color = None
 31
 32
 33def make_ball():
 34    """
 35    Function to make a new, random ball.
 36    """
 37    ball = Ball()
 38
 39    # Size of the ball
 40    ball.size = random.randrange(10, 30)
 41
 42    # Starting position of the ball.
 43    # Take into account the ball size so we don't spawn on the edge.
 44    ball.x = random.randrange(ball.size, SCREEN_WIDTH - ball.size)
 45    ball.y = random.randrange(ball.size, SCREEN_HEIGHT - ball.size)
 46
 47    # Speed and direction of rectangle
 48    ball.change_x = random.randrange(-2, 3)
 49    ball.change_y = random.randrange(-2, 3)
 50
 51    # Color
 52    ball.color = (random.randrange(256), random.randrange(256), random.randrange(256))
 53
 54    return ball
 55
 56
 57class MyGame(arcade.Window):
 58    """ Main application class. """
 59
 60    def __init__(self):
 61        super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
 62        self.ball_list = []
 63        ball = make_ball()
 64        self.ball_list.append(ball)
 65
 66    def on_draw(self):
 67        """
 68        Render the screen.
 69        """
 70
 71        # This command has to happen before we start drawing
 72        arcade.start_render()
 73
 74        for ball in self.ball_list:
 75            arcade.draw_circle_filled(ball.x, ball.y, ball.size, ball.color)
 76
 77        # Put the text on the screen.
 78        output = "Balls: {}".format(len(self.ball_list))
 79        arcade.draw_text(output, 10, 20, arcade.color.WHITE, 14)
 80
 81    def on_update(self, delta_time):
 82        """ Movement and game logic """
 83        for ball in self.ball_list:
 84            ball.x += ball.change_x
 85            ball.y += ball.change_y
 86
 87            if ball.x < ball.size:
 88                ball.change_x *= -1
 89
 90            if ball.y < ball.size:
 91                ball.change_y *= -1
 92
 93            if ball.x > SCREEN_WIDTH - ball.size:
 94                ball.change_x *= -1
 95
 96            if ball.y > SCREEN_HEIGHT - ball.size:
 97                ball.change_y *= -1
 98
 99    def on_mouse_press(self, x, y, button, modifiers):
100        """
101        Called whenever the mouse button is clicked.
102        """
103        ball = make_ball()
104        self.ball_list.append(ball)
105
106
107def main():
108    MyGame()
109    arcade.run()
110
111
112if __name__ == "__main__":
113    main()