#ok, I think I have it broken down into pieces now... check out this code:
#----
import sys, pygame, mathpygame.init()pixelspercm=10.0gravity=9.80 * 10.0 #
meter per second per second (juiced up a little :) )framerate=50.0 # per
secondlossperbounce=0.33 # lose energy per bounceframestosilence=3#if a bounce
occurs AGAIN within the next 3 frames, consider the ball dead
class Ball(object): def __init__(self, id,pos=(0,0)): self.speed=0.0
# meter per second self.diameter=0.025 # meter self.pos=pos
self.previous=0#count how many frames ago we had the previous bounce
self.name=id#just some name to show for feedback
image=pygame.Surface((int(self.diameter*2*pixelspercm*100),int(self.diameter*2*pixelspercm*100)))
image.set_colorkey((0,0,0)) image.fill((0,0,0))
pygame.draw.circle(image, (255,255,255),
(int(self.diameter*pixelspercm*100),int(self.diameter*pixelspercm*100)),
int(self.diameter*pixelspercm*100)) self.image=image def
updatepos(self,ms): if not (self.speed==0 and self.pos[1]==300):
distance=self.DeltaX2(self.speed, gravity,ms/1000.0) if
distance+self.pos[1]<300:
self.speed=self.FinalVelocity1(self.speed,gravity,ms/1000.0)
self.pos=(self.pos[0],distance+self.pos[1]) if self.previous>0:
self.previous=self.previous-1 print
self.name, 'normal cycle',self.previous else: print
self.name dis2=300-self.pos[1]# distance to ground
print 'distance to ground=',dis2
ms2=self.MsTillGround(dis2,self.speed,self.FinalVelocity1(self.speed,gravity,ms/1000.0))
#ms till ground print 'ms till ground=',ms2
endvel=self.FinalVelocity1(self.speed, gravity, (ms-ms2)/1000.0)#speed at
ground speedatground=-endvel*(1-lossperbounce)#lose energy
print 'speed at ground=',speedatground
dis3=self.DeltaX2(speedatground, gravity,(ms-ms2)/1000.0)#deltaX after all ms
print 'deltaX after all ms=',dis3
endvel2=self.FinalVelocity1(speedatground, gravity, (ms-ms2)/1000.0)#speed
after time print 'speed after time=',endvel2 if
self.previous>1: self.pos=(self.pos[0],300)
self.speed=0.0 print 'self.speed=',self.speed
print 'self.pos=',self.pos print 'SILENCE!'
else: self.speed=endvel2
self.pos=(self.pos[0],300+dis3) print
'self.speed=',self.speed print 'self.pos=',self.pos
self.previous=framestosilence
def MsTillGround(self, Dx, Vi, Vf): #Dx=1/2*(Vi+Vf)*t
#t=Dx/(1/2*(Vi+Vf)) t=Dx/(0.5*(Vi+Vf)) return t*1000.0 # t is in
seconds, but we want the amount of milliseconds def
FinalVelocity1(self,Vi,A,t): # ### 1 # Vf=Vi+A*t
# Final Velocity = Initial Velocity + Acceleration * time #
meter/second = meter/second + meter/second/second * second return Vi+A*t
def AverageVelocity(self,Vi,Vf): # ### 2 #
Va=(Vi+Vf)/2 # Average Velocity = ( Initial Velocity + Final Velocity
)/2 # meter/second = ( meter/second + meter/second )/2 return
(Vi+Vf)/2 def DeltaX1(self,Vi,Vf,t): # ### 3 #
Dx=1/2*(Vi+Vf)*t # DeltaX = 1/2 * ( Initial Velocity + Final Velocity )
* time # meter = 1/2 * ( meter/second + meter/second )* second
return 0.5*(Vi+Vf)*t def DeltaX2(self,Vi,A,t): # ### 4
# Dx=Vi*t+ 1/2*a* t^2 # notice: t^2 in python is: t**2 # DeltaX =
Initial Velocity * time+1/2*Acceleration* time*time # meter =
meter/second * second+1/2*meter/second/second * second*second return
Vi*t+0.5*A*t**2 def FinalVelocity2(self,Vi,A,Dx): # ### 5
# Vf^2=Vi^2+2*a*Dx # Final Velocity^2=Initial
Velocity^2+2*Acceleration*DeltaX # meter/second*meter/second=
meter/second*meter/second+2*meter/second/second*meter Vf2=Vi**2+2*A*Dx
return math.sqrt(Vf2)
screen = pygame.display.set_mode((200, 400), 0, 32)balls =
[]balls.append(Ball('Ball 1',(78,15)))balls.append(Ball('Ball
2',(12,158)))balls.append(Ball('Ball 3',(122,56)))newtime=oldtime=0
while True: newtime=pygame.time.get_ticks() # milliseconds since start of
program if newtime-oldtime>(1000.0/framerate)*2: print 'LAGGING!'
if newtime-oldtime>1000.0/framerate: for event in pygame.event.get():
if event.type == pygame.QUIT: exit()
screen.fill((0, 0, 0)) for ball in balls:
ball.updatepos(newtime-oldtime) for ball in balls:
screen.blit(ball.image, ball.pos) pygame.draw.line(screen,
(255,255,255), (0,350), (200,350), 1) pygame.display.update()
oldtime=newtime
#----
_________________________________________________________________
Connect and share in new ways with Windows Live.
http://www.windowslive.com/connect.html?ocid=TXT_TAGLM_Wave2_newways_112007