海龟画图和pymunk物理引擎模拟小球自由落体

"""海龟画图和pymunk物理引擎模拟小球自由落体。
pymunk是python的一个2d物理引擎,在官网上说它可以和pygame等结合起来一起使用。
看到在Arcade街机模块里使用后,想到能不能在海龟画图里使用。
这是因为只是把海龟画图用来渲染,而受重力的魂还是由于物理引擎的作用。
测试后,成功。 www.lixingqiu.com
"""
import pymunk                       # 导入pymunk模块
import turtle                       # 导入海龟模块,用它来渲染刚体

def spawn(x,y):
    ball_shape = turtle.Turtle(shape='circle',visible=False)
    ball_shape.shape("绿球.gif")
    ball_shape.penup()
    ball_shape.color("blue")
        
    mass = 1
    radius = 25
    moment = pymunk.moment_for_circle(mass, 0, radius) # 求一定质量和半径的小球的转动惯量,返回浮点数
     
    body = pymunk.Body(mass, moment)    # 新建刚体   
    body.position= x,y                  # 设置初始位置
    
    ball_shape.goto(x,y)                # 具体的形状移到这个位置
    ball_shape.st()                     # 显示具体的形状

    ball = pymunk.Circle(body, radius) # 设定刚体形状,
    ball.elasticity = 0.95             # 弹性系数
    ball.friction = 0.9                # 摩擦系数
    
    space.add(body,ball)               # 在空间增加刚体
     
    balls_list.append((ball,ball_shape)) # 刚体,用来表示球属性的shape,和用海龟来具体显示的形状
    
width,height = 600,600
balls_list = []

screen = turtle.Screen()                 # 新建海龟窗口,用于渲染形状的
screen.delay(0)
screen.title("海龟画图和pymunk物理引擎模拟小球自由落体,作者:李兴球")
screen.setup(600,600)
screen.bgcolor("cyan")
screen.addshape("绿球.gif")

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

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)
l1 = pymunk.Segment(staticbody, (-150, 0), (150, 0), 10)
space.add(l1)

screen.onclick(spawn)                 # 单击产生重力小球

while True:
    remove_list = []                      # 待删除列表
    space.step(0.02)
    for index in range(len(balls_list)):
         
        ball = balls_list[index][1]
        shape = balls_list[index][0]
        ball.setposition(shape.body.position)
 
        x,y = ball.position()
        if abs(x) > width//2 or abs(y) > height//2: # 超过边界的删除
            remove_list.append((shape,ball))
            #print(remove_list)
            
    for shape,ball in remove_list:      
         #print(shape,shape.body)
         space.remove(shape,shape.body)   # 从重力空间移除
         ball.ht()                        # 隐藏用海龟表示的小球
         balls_list.remove((shape,ball))        
        
    screen.update()