I'm drawing a large number of bouncing shapes similar to an old 1990s screensaver. I'm just doing this to study (but not hopework) For some reason my object clearing (simply blitting a black shape over the prior position) is missing parts of the shapes and leaving fragments behind. I could just black the whole screen between each draw cycle and avoid this, but I want to draw over the individual shapes. Why is this periodically missing parts of the shapes?
from pygame.locals import *
import pygame as pg
from random import randint as ri
import time
pg.init()
display_size = (800, 600)
canvas = pg.display.set_mode(display_size)
canvobj = []
running = True
class circle:
def __init__(self, xpos, ypos, rad):
self.type = 'circle'
self.color = (ri(1,255),ri(1,255),ri(1,255))
self.posit = (xpos, ypos)
self.radius = rad
self.speed = (ri(-5,5),ri(-5,5))
self.bounce = 0
def topygame(self):
return (self.color, self.posit, self.radius)
def clearit(self):
return ((0, 0, 0), self.posit, self.radius)
def moveit(self):
self.posit = (self.posit[0]+self.speed[0], self.posit[1]+self.speed[1])
return (self.color, self.posit, self.radius)
class rect:
def __init__(self, x, y, width, height):
self.type = 'rect'
self.color = (ri(1,255),ri(1,255),ri(1,255))
self.posit = (x, y, width, height)
self.speed = (ri(-5,5),ri(-5,5))
self.bounce = 0
def topygame(self):
return (self.color, self.posit)
def clearit(self):
return ((0, 0, 0), self.posit)
def moveit(self):
self.posit = (self.posit[0]+self.speed[0], self.posit[1]+self.speed[1], self.posit[2], self.posit[3])
return (self.color, self.posit)
def addobjs(num, iterable):
for x in range(num):
iterable.append(circle(ri(1,800),ri(1,600), ri(1,50)))
for x in range(num):
iterable.append(rect(ri(1,800),ri(1,600), ri(1,100), ri(1,100)))
def clearobjs(obj):
if obj.speed[0]==0 and obj.speed[1]==0:
obj.speed=(ri(10,20),ri(10,20))
obj.bounce=0
if obj.posit[1] < -100 or obj.posit[1] > 650:
obj.bounce += 1
obj.speed = (obj.speed[0], -obj.speed[1])
if obj.posit[0] < -100 or obj.posit[0] > 850:
obj.bounce += 1
obj.speed = (-obj.speed[0], obj.speed[1])
if x.type == 'circle':
pg.draw.circle(canvas, *(x.clearit()))
if x.type == 'rect':
pg.draw.rect(canvas, *(x.clearit()))
if x.bounce > 4:
canvobj.remove(obj)
def moveobjs(obj):
if x.type == 'circle':
pg.draw.circle(canvas, *(x.moveit()))
if x.type == 'rect':
pg.draw.rect(canvas, *(x.moveit()))
starttime = time.time()
while running:
pg.display.flip()
if time.time()-starttime > 1:
starttime = time.time()
addobjs(ri(1,3), canvobj)
for x in canvobj:
clearobjs(x)
for x in canvobj:
moveobjs(x)
for event in pg.event.get():
if event.type == QUIT:
running = False
break
else:
pass
pg.time.delay(30)
pg.quit()