Beispiel #1
0
    def __init__(self):
        # Pygame Initialization
        pygame.init()

        caption= "Python Box2D Testbed - " + self.name
        pygame.display.set_caption(caption)

        self.screen = pygame.display.set_mode( (640,480) )
        self.screenSize = box2d.b2Vec2(*self.screen.get_size())
        self.font = pygame.font.Font(None, 15)

        # GUI Initialization
        self.gui_app = gui.App()
        self.gui_table=fwGUI(self.settings)
        container = gui.Container(align=1,valign=-1)
        container.add(self.gui_table,0,0)
        self.gui_app.init(container)

        # Box2D Initialization
        self.worldAABB.lowerBound.Set(-200.0, -100.0)
        self.worldAABB.upperBound.Set( 200.0, 200.0)
        gravity = box2d.b2Vec2(0.0, -10.0)

        doSleep = True
        self.world = box2d.b2World(self.worldAABB, gravity, doSleep)
        self.destructionListener = fwDestructionListener()
        self.boundaryListener = fwBoundaryListener()
        self.contactListener = fwContactListener()
        self.debugDraw = fwDebugDraw()

        self.debugDraw.surface = self.screen

        self.destructionListener.test = self
        self.boundaryListener.test = self
        self.contactListener.test = self
        
        self.world.SetDestructionListener(self.destructionListener)
        self.world.SetBoundaryListener(self.boundaryListener)
        self.world.SetContactListener(self.contactListener)
        self.world.SetDebugDraw(self.debugDraw)

        self.updateCenter()
Beispiel #2
0
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)