import sys, pygame
import random
pygame.init()
x=0.5
speed = [x, x]
size = width, height = 800, 600
black = 0, 0, 0
screen = pygame.display.set_mode(size)
ball = pygame.image.load("intro_ball.gif")
ballrect = ball.get_rect()
Sair = True
while Sair:
for event in pygame.event.get():
if event.type == pygame.QUIT: Sair=False
ballrect = ballrect.move(speed)
if ballrect.left < 0 or ballrect.right > width:
speed[0] = -speed[0]
x=random.uniform(0, 1)
if ballrect.top < 0 or ballrect.bottom > height:
speed[1] = -speed[1]
x=random.uniform(0, 1)
screen.fill(black)
screen.blit(ball, ballrect)
pygame.display.flip()
sys.exit()
I expected the ball to move and every time it hits the corner change velocity.
Advertisement
Answer
To make the ball move, you’ve to use a variable for position wich can store floating point coordinates. The position is changed every frame depending on the speed. Finally the ball rectangle has to be updated with the position:
pos = [0, 0]
while Sair:
for event in pygame.event.get():
if event.type == pygame.QUIT: Sair=False
if ballrect.left < 0 or ballrect.right > width:
x = random.uniform(0.1, 1)
speed[0] = x if speed[0] < 0.0 else -x
if ballrect.top < 0 or ballrect.bottom > height:
x = random.uniform(0.1, 1)
speed[1] = x if speed[1] < 0.0 else -x
pos[0] += speed[0]
pos[1] += speed[1]
ballrect.topleft = (int(pos[0]), int(pos[1]))
screen.fill(black)
screen.blit(ball, ballrect)
pygame.display.flip()
Note, the coordinates of pygame.Rect are integral values. If a positive floating point value which is less that 1 is added to an integral value, then the value doesn’t change at all, because the result is truncated to to the integral part again.
int a = 1 a + 0.5 == 1
Ensure that the random velocity is always greater than 0.0. Generate a random velocity and change the speed dependent on the new direction:
e.g.
x = random.uniform(0.1, 1) speed[0] = x if speed[0] < 0.0 else -x
