python海龟画图的物理互碰弹球

"""让海龟画图插上物理引擎的翅膀,丑小鸭变白天鹅了。
本程序新建物理弹球类,它继承自海龟类。给它新增了一些描述物理性质的属性,
这些物理性质来自pymunk。
"""
import pymunk                       # 导入pymunk模块
import turtle                       # 导入海龟模块,用它来渲染刚体
import random

class PhysicBall(turtle.Turtle):
    def __init__(self,space,image,position):
        turtle.Turtle.__init__(self,visible=False)
        self.raw_position = position
        self.space = space          # 弹球的重力空间
        self.penup()
        self.shape(image)           # 设定形状
        self.mass = 1               # 质量为1
        self.radius = 25            # 这个值根据是图像宽度的一半确定
        self.moment =  pymunk.moment_for_circle(self.mass, 0, self.radius)
        self.body = pymunk.Body(self.mass,self.moment)   # 刚体
        self.soul = pymunk.Circle(self.body, self.radius)# 刚体之魂
        self.soul.elasticity = 0.95                      # 弹球的弹性系数
        self.soul.friction = 0.9                         # 弹球的摩擦系数    
        self.space.add(self.body,self.soul)              # 在重力空间增加刚体
        self.reborn()                                    # 重生 
        
    def reborn(self):
        self.body.velocity= (0,0) 
        direction =  random.randint(-3000,3000),random.randint(6000,7000)
        self.body.force = direction                      # 给力
        self.body.position = self.raw_position[0],self.raw_position[1]
        self.goto(self.raw_position)
        self.st()
        
            
width,height = 600,600
balls_list = []

screen = turtle.Screen()                 # 新建海龟窗口,用于渲染形状的
screen.delay(0)
screen.title("python海龟画图的物理互碰弹球_作者:李兴球")
screen.setup(600,600)
screen.bgcolor("cyan")
screen.addshape("绿球.gif")

space = pymunk.Space()                   # 设定重力空间
space.gravity = 0,-200                   # 设置重力参数

# platform是平台,它只是真正的平台的外表
platform = turtle.Turtle(shape='square')  # 这是画棕色的棒子,它只是用来显示下面的staticbody的
platform.color("brown")
platform.penup()
platform.shapesize(1,15)
platform.setposition(0,-200)

# 真正的平台由以下几句代码实现
staticbody = pymunk.Body(body_type = pymunk.Body.STATIC) # 增加接受碰撞检测的静态实体
staticbody.position = ( 00, -200)
true_platform = pymunk.Segment(staticbody, (-150, 0), (150, 0), 10)
true_platform.elasticity = 0.65
space.add(true_platform)
 
counter = 0
 
while True:
    counter += 1
    if counter % 10 == 0 and len(balls_list)<20:
        balls_list.append(PhysicBall(space,"绿球.gif",(0,0)))
    remove_list = []                      # 待删除列表
    space.step(0.02)                      # 把空间中的弹球按重力原理等进行坐标等的更新
  
    for ball in balls_list:
        ball.goto(ball.body.position) 
 
        x,y = ball.xcor(),ball.ycor()
        if abs(x) > width//2 or abs(y) > height//2: # 超过边界的删除
            ball.ht()
            ball.reborn()            
       
    screen.update()