Skip to content
Permalink
master
Go to file
 
 
Cannot retrieve contributors at this time
105 lines (79 sloc) 2.83 KB
"""A L shape attached with a joint and constrained to not tip over.
This example is also used in the Get Started Tutorial.
"""
__docformat__ = "reStructuredText"
import random
import sys
import pygame
import pymunk
import pymunk.pygame_util
random.seed(1)
def add_ball(space):
"""Add a ball to the given space at a random position"""
mass = 1
radius = 14
inertia = pymunk.moment_for_circle(mass, 0, radius, (0, 0))
body = pymunk.Body(mass, inertia)
x = random.randint(120, 380)
body.position = x, 550
shape = pymunk.Circle(body, radius, (0, 0))
shape.friction = 1
space.add(body, shape)
return shape
def add_L(space):
"""Add a inverted L shape with two joints"""
rotation_center_body = pymunk.Body(body_type=pymunk.Body.STATIC)
rotation_center_body.position = (300, 300)
rotation_limit_body = pymunk.Body(body_type=pymunk.Body.STATIC)
rotation_limit_body.position = (200, 300)
body = pymunk.Body(10, 10000)
body.position = (300, 300)
l1 = pymunk.Segment(body, (-145, 0), (255.0, 0.0), 1)
l2 = pymunk.Segment(body, (-145, 0), (-145.0, 25.0), 1)
l1.friction = 1
l2.friction = 1
rotation_center_joint = pymunk.PinJoint(body, rotation_center_body, (0, 0), (0, 0))
joint_limit = 25
rotation_limit_joint = pymunk.SlideJoint(
body, rotation_limit_body, (-100, 0), (0, 0), 0, joint_limit
)
space.add(l1, l2, body, rotation_center_joint, rotation_limit_joint)
return l1, l2
def main():
pygame.init()
screen = pygame.display.set_mode((600, 600))
pygame.display.set_caption("Joints. Just wait and the L will tip over")
clock = pygame.time.Clock()
space = pymunk.Space()
space.gravity = (0.0, -900.0)
lines = add_L(space)
balls = []
draw_options = pymunk.pygame_util.DrawOptions(screen)
ticks_to_next_ball = 10
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit(0)
elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
sys.exit(0)
elif event.type == pygame.KEYDOWN and event.key == pygame.K_p:
pygame.image.save(screen, "slide_and_pinjoint.png")
ticks_to_next_ball -= 1
if ticks_to_next_ball <= 0:
ticks_to_next_ball = 25
ball_shape = add_ball(space)
balls.append(ball_shape)
balls_to_remove = []
for ball in balls:
if ball.body.position.y < 150:
balls_to_remove.append(ball)
for ball in balls_to_remove:
space.remove(ball, ball.body)
balls.remove(ball)
space.step(1 / 50.0)
screen.fill((255, 255, 255))
space.debug_draw(draw_options)
pygame.display.flip()
clock.tick(50)
if __name__ == "__main__":
main()
You can’t perform that action at this time.