import pygame
import sys
class Gravity():
def __init__(self):
self.GRAVITY_SPEED_FACTOR = 9.8
self.WINDOW_WIDTH = 300
self.WINDOW_HEIGHT = 800
self.BLACK = (0, 0, 0)
self.init_figure()
pygame.init()
self.windows = pygame.display.set_mode((self.WINDOW_WIDTH, self.WINDOW_HEIGHT))
pygame.display.set_caption('Gravity simulation')
self.speed_limit = ((2 * self.WINDOW_HEIGHT / self.GRAVITY_SPEED_FACTOR) ** 0.5) * self.GRAVITY_SPEED_FACTOR
self.image = pygame.image.load('circle_12_green.bmp')
self.rect = self.image.get_rect()
self.rect.centerx = self.windows.get_rect().centerx
#初始化,方便多次调用多次调用
def init_figure(self):
self.time_cnt = 0
self.speed_start = 110
#实时速度
self.speed_state = self.speed_start
#防止跳出屏外
def is_out_of_window(self):
if self.speed_start < self.speed_limit:
return True
#按重力计算
def gravity_cal(self):
self.time_cnt += 1
self.speed_state = self.speed_start - self.GRAVITY_SPEED_FACTOR * self.time_cnt
self.circley = self.WINDOW_HEIGHT - (self.speed_start*self.time_cnt-(0.5*self.GRAVITY_SPEED_FACTOR*(self.time_cnt**2)))
self.rect.centery = self.circley
#触底反弹
def check_edge(self):
if (round(self.circley) > self.windows.get_rect().bottom):
self.init_figure()
#总控制
def start_simulate(self):
if self.is_out_of_window():
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
self.windows.fill(self.BLACK)
self.windows.blit(self.image,self.rect)
pygame.display.flip()
self.gravity_cal()
self.check_edge()
pygame.time.delay(50)
else:
print('speed_start out of range')
Gravity().start_simulate()
做出来就是这个样子