# -*- coding: utf-8 -*-
"""
part2step005_ball_with_fixed_movement
bouncing ball. each frame the complete screen is filled with the background,
making this example simple to code but possible slow on larger resolutions.
Each frame, a random-coloured circle is drawn with randomized radius directly on the screen.
Try to manipulate the display.set_mode values to change the resolution."""
import pygame
import random
pygame.init()
screen=pygame.display.set_mode((640,480)) # try out larger values and see what happens !
background = pygame.Surface(screen.get_size())
background.fill((random.randint(0,255)
,random.randint(0,255)
,random.randint(0,255))) # (red,green,blue)
background = background.convert()
ball1 = pygame.Surface((50,50)) #create a new surface (black by default)
ball2 = pygame.Surface((50,50))
ball3 = pygame.Surface((50,50))
ball1.set_colorkey((0,0,0)) #make black the transparent color (red,green,blue)
ball2.set_colorkey((0,0,0))
ball3.set_colorkey((0,0,0))
#pygame.draw.circle(Surface, color, pos, radius, width=0)
pygame.draw.circle(ball1, (0,0,255), (25,25),25) # paint blue circle
pygame.draw.circle(ball2, (0,0,255), (25,25),25)
pygame.draw.circle(ball3, (0,0,255), (25,25),25)
ball1 = ball1.convert_alpha() # if you use tranparent colors you need convert_alpha()
ball2 = ball2.convert_alpha()
ball3 = ball3.convert_alpha()
ball1x, ball1y = 0, 750 # start position of the ball (x,y)
ball2x, ball2y = 0, 0
ball3x, ball3y = 750, 350
dx1, dy1 = random.randint(5,10), random.randint(5,10) # speed vector of the ball in pixel per frame
dx2, dy2 = random.randint(5,10), random.randint(5,10)
dx3, dy3 = random.randint(5,10), random.randint(5,10)
screen.blit(background, (0,0)) #draw background on screen (overwriting all)
screen.blit(ball1, (ball1x, ball1y)) #draw the topleft corner of ball surface at pos (ballx, bally)
screen.blit(ball2, (ball2x, ball2y))
screen.blit(ball3, (ball3x, ball3y))
clock = pygame.time.Clock()
mainloop = True
zeit=0
FPS = 30 # desired framerate in frames per second.
while mainloop:
# do all this each frame
milliseconds = clock.tick(FPS) # do not go faster than this framerate
zeit+=milliseconds
for event in pygame.event.get():
if event.type == pygame.QUIT:
mainloop = False # pygame window closed by user
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
mainloop = False # user pressed ESC
pygame.display.set_caption("FPS: %.2f X: %.2f Y: %.2f dx: %.2f dy:"
" %.2f" % (clock.get_fps(), ball1x, ball1y, dx1, dy1))
# if zeit > random.randint(15000,20000):
# zeit=0
# background.fill((random.randint(0,255)
# ,random.randint(0,255)
# ,random.randint(0,255)))
# screen.blit(background, (0,0)) #draw background on screen (overwriting all)
#inside mainloop, after screen.blit(background,(0,0))
#colour = (random.randint(0,255),random.randint(0,255),random.randint(0,255))
#radius = random.randint(50,55)
#pygame.draw.circle(screen, colour , (100,100), radius, 2) # draw pulsating circle
#calculate new center of ball
ball1x += dx1
ball2x += dx2
ball3x += dx3
ball1y += dy1
ball2y += dy2
ball3y += dy3
if (( abs(ball1x - ball2x) < 25 and abs(ball1y - ball2y) < 25) or ( abs(ball1x - ball3x) < 25 and abs(ball1y - ball3y) < 25) or ( abs(ball2x - ball3x) < 25 and abs(ball2y - ball3y) < 25)):
background.fill((random.randint(0,255) ,random.randint(0,255) ,random.randint(0,255)))
screen.blit(background, (0,0))
dx1+= random.randint(-1,1)
dx2+= random.randint(-1,1)
dx3+= random.randint(-1,1)
dy1+= random.randint(-1,1)
dy2+= random.randint(-1,1)
dy3+= random.randint(-1,1)
# bounce ball if out of screen
if ball1x < 0:
ball1x = 0
#dx *= -1
dx1 =random.randint(5,10)
if ball2x < 0:
ball2x = 0
dx2 =random.randint(5,10)
if ball3x < 0:
ball3x = 0
dx3 =random.randint(5,10)
if ball1x + ball1.get_width() > screen.get_width():
ball1x = screen.get_width() - ball1.get_width()
#dx *= -1
dx1= -1*random.randint(5,10)
if ball2x + ball2.get_width() > screen.get_width():
ball2x = screen.get_width() - ball2.get_width()
dx2= -1*random.randint(5,10)
if ball3x + ball3.get_width() > screen.get_width():
ball3x = screen.get_width() - ball3.get_width()
dx3= -1*random.randint(5,10)
if ball1y < 0:
ball1y = 0
#dy *= -1
dy1 =random.randint(5,10)
if ball2y < 0:
ball2y = 0
dy2 =random.randint(5,10)
if ball3y < 0:
ball3y = 0
dy3 =random.randint(5,10)
if ball1y + ball1.get_height() > screen.get_height():
ball1y = screen.get_height() - ball1.get_height()
#dy *= -1
dy1= -1*random.randint(5,10)
if ball2y + ball2.get_height() > screen.get_height():
ball2y = screen.get_height() - ball2.get_height()
dy2= -1*random.randint(5,10)
if ball3y + ball3.get_height() > screen.get_height():
ball3y = screen.get_height() - ball3.get_height()
dy3= -1*random.randint(5,10)
# paint the ball
pygame.draw.circle(ball1, (random.randint(200,255),random.randint(100,200),random.randint(0,100)), (25,25),25)
pygame.draw.circle(ball2, (random.randint(0,100),random.randint(100,200),random.randint(200,255)), (25,25),25)
pygame.draw.circle(ball3, (random.randint(100,200),random.randint(200,255),random.randint(0,100)), (25,25),25)
screen.blit(ball1, (round(ball1x,0), round(ball1y,0)))
screen.blit(ball2, (round(ball2x,0), round(ball2y,0)))
screen.blit(ball3, (round(ball3x,0), round(ball3y,0)))
pygame.display.flip() # flip the screen FPS times a second