def MouseDown(self, p): """ Indicates that there was a left click at point p (world coordinates) """ if self.mouseJoint != None: return # Create a mouse joint on the selected body (assuming it's dynamic) # Make a small box. aabb = box2d.b2AABB() d = box2d.b2Vec2(0.001, 0.001) aabb.lowerBound = p - d aabb.upperBound = p + d # Query the world for overlapping shapes. body = None k_maxCount = 10 # maximum amount of shapes to return (count, shapes) = self.world.Query(aabb, k_maxCount) for shape in shapes: shapeBody = shape.GetBody() if shapeBody.IsStatic() == False and shapeBody.GetMass() > 0.0: if shape.TestPoint(shapeBody.GetXForm(), p): # is it inside? body = shapeBody break if body: md = box2d.b2MouseJointDef() md.body1 = self.world.GetGroundBody() md.body2 = body md.target = p md.maxForce= 1000.0 * body.GetMass() self.mouseJoint = self.world.CreateJoint(md).getAsType() body.WakeUp()
def main(): # gui initialization screen = pygame.display.set_mode((width, height)) caption = "Python Box2D Testbed Demos" pygame.display.set_caption(caption) theme = gui.Theme("default") app = gui.Desktop(theme=theme) app.connect(gui.QUIT, app.quit, None) main = gui.Container(width=width, height=height) main.add(gui.Label("Box2D Testbed Demos", cls="h1"), 20, 20) list_size = (width / 2, height / 2) list_pos = (width / 2 - list_size[0] / 2, height / 2 - list_size[1] / 2) demolist = gui.List(width=list_size[0], height=list_size[1]) main.add(demolist, list_pos[0], list_pos[1]) add_demos(demolist) buttonw = list_size[0] / 2 - 20 bottom = list_pos[1] + list_size[1] + 20 b = gui.Button("Run", width=buttonw) main.add(b, list_pos[0], bottom) b.connect(gui.CLICK, run_demo, demolist) b = gui.Button("Quit", width=buttonw) main.add(b, list_pos[0] + buttonw + 30, bottom) b.connect(gui.CLICK, lambda x: pygame.event.post(pygame.event.Event(pygame.QUIT)), None) # box2d initialization z = 10 # scale renderer = fwDebugDraw() renderer.surface = screen renderer.viewZoom = z renderer.viewCenter = box2d.b2Vec2(0, 0) renderer.width, renderer.height = width, height renderer.viewOffset = renderer.viewCenter - box2d.b2Vec2(width, height) / 2 renderer.SetFlags(box2d.b2DebugDraw.e_shapeBit) renderer.DrawSolidPolygon = lambda a, b, c: 0 renderer.DrawPolygon = lambda a, b, c: 0 worldAABB = box2d.b2AABB() worldAABB.lowerBound.Set(-100.0, -100.0) worldAABB.upperBound.Set(100.0, 100.0) gravity = box2d.b2Vec2(0.0, -10.0) world = box2d.b2World(worldAABB, gravity, True) world.SetDebugDraw(renderer) bd = box2d.b2BodyDef() bd.position.Set(0.0, 0.0) ground = world.CreateBody(bd) # the borders and the world shapes for the file listing, etc. sd = box2d.b2PolygonDef() sd.SetAsBox(1, height / z, box2d.b2Vec2(-width / (2 * z) - 1, 0), 0) ground.CreateShape(sd) sd.SetAsBox(1, height / z, box2d.b2Vec2(width / (2 * z) + 1, 0), 0) ground.CreateShape(sd) sd.SetAsBox(width / z, 1, box2d.b2Vec2(0, -height / (2 * z) - 1), 0) ground.CreateShape(sd) sd.SetAsBox(width / z, 1, box2d.b2Vec2(0, height / (2 * z) + 1), 0) ground.CreateShape(sd) sd.SetAsBox(list_size[0] / (2 * z), list_size[1] / (2 * z)) ground.CreateShape(sd) for i in range(10): bd = box2d.b2BodyDef() bd.allowSleep = True bd.position.Set( box2d.b2Random(-width / (2 * z), width / (2 * z)), box2d.b2Random(-height / (2 * z), height / (2 * z)) ) bd.isBullet = True bomb = world.CreateBody(bd) bomb.SetLinearVelocity(-5.0 * bd.position) sd = box2d.b2CircleDef() sd.radius = 1 sd.density = 1.0 sd.restitution = 0.7 bomb.CreateShape(sd) bomb.SetMassFromShapes() app.init(main) main_loop(world, screen, demolist, app)