示例#1
0
    def add_box(body, pos, size, angle=0,data=None,sensor=False,density=1):
        if not (body and pos and size):
            log("Invalid arg body pos size in box creation",1)
            return None
        center_pos = pixel2meter(pos)
        polygon_shape = b2PolygonShape()
        polygon_shape.SetAsBox(pixel2meter(size.x), pixel2meter(size.y),
                               b2Vec2(center_pos.get_tuple()), angle*math.pi/180.0)
        fixture_def = b2FixtureDef()
        fixture_def.density = density
        fixture_def.shape = polygon_shape

        fixture_def.userData = data
        fixture_def.isSensor = sensor
        return body.CreateFixture(fixture_def)
示例#2
0
    def add_circle(body, pos, radius, sensor=False, data=None, density=1):
        if not (body and pos and radius):
            log("Invalid arg body pos radius in circle creation",1)
            return None
        center_pos = pixel2meter(pos)

        circle_shape = b2CircleShape()
        circle_shape.pos = pixel2meter(pos).get_tuple()
        circle_shape.radius = pixel2meter(radius)

        fixture_def = b2FixtureDef()
        fixture_def.density = density
        fixture_def.shape = circle_shape
        fixture_def.userData = data
        fixture_def.isSensor = sensor

        return body.CreateFixture(fixture_def)
示例#3
0
 def add_body(self,pos,body_type,angle=0,fixed_rotation=True):
     physic_position = pixel2meter(pos).get_float_tuple()
     if body_type == BodyType.static:
         body = self.current_world.CreateStaticBody(position=physic_position)
     elif body_type == BodyType.dynamic:
         body = self.current_world.CreateDynamicBody(position=physic_position)
     elif body_type == BodyType.kinematic:
         body = self.current_world.CreateKinematicBody(position=physic_position)
     body.angle = angle
     body.fixed_rotation = True
     return body
示例#4
0
 def cast_ray(self,callback,point1,point2):
     if not (point2.x-point1.x == 0 and point2.y-point1.y == 0):
         p1 = b2Vec2(pixel2meter(point1).get_tuple())
         p2 = b2Vec2(pixel2meter(point2).get_tuple())
         self.current_world.RayCast(callback,p1,p2)
示例#5
0
 def set_body_position(body,pos):
     if body:
         body.position = pixel2meter(pos).get_tuple()
示例#6
0
def load_physic_objects(physics_data,image):
    if image is None:
        return
    body_type = get_element(physics_data, "type")
    if body_type:
        pos = Vector2()
        if image.pos:
            pos = image.pos
        if image.screen_relative_pos:
            pos = pos+image.screen_relative_pos*engine.get_screen_size()
        if image.size:
            pos = pos+image.size/2
        if body_type == "dynamic":
            image.body = physics_manager.add_body(pos, BodyType.dynamic)
        elif body_type == "static":
            image.body = physics_manager.add_body(pos, BodyType.static)
        elif body_type == 'kinematic':
            image.body = physics_manager.add_body(pos, BodyType.kinematic)
    pos = (0,0)
    if image.pos:
        pos = image.pos
    if image.screen_relative_pos:
        pos = pos+image.screen_relative_pos*engine.get_screen_size()+image.size/2
    angle = get_element(physics_data, "angle")
    if angle:
        image.body.angle = angle*math.pi/180
    else:
        if image.body and image.angle != 0:
            if CONST.physics == 'b2':
                image.body.angle = image.angle*math.pi/180
            elif CONST.physics == 'pookoo':
                #TODO: set angle for body
                pass
            '''Set new pos for body'''
            v = image.size/2
            v.rotate(image.angle)
            pos = image.pos+v
            pos = pixel2meter(pos)
            if CONST.physics == 'b2':
                image.body.position = pos.get_tuple()
            elif CONST.physics == 'pookoo':
                #TODO: set pos for body
                pass
            
    fixtures_data = get_element(physics_data,"fixtures")
    if fixtures_data:
        for physic_object in fixtures_data:
            sensor = get_element(physic_object, "sensor")
            if sensor is None:
                sensor = False
            user_data = get_element(physic_object,"user_data")
            if user_data is None:
                user_data = image
            obj_type = get_element(physic_object, "type")
            if obj_type == "box":
                pos = get_element(physic_object,"pos")
                if not pos:
                    pos = Vector2()

                size = get_element(physic_object,"size")
                if not size:
                    size = image.size/2

                angle = get_element(physic_object,"angle")
                if angle is None:
                    
                    angle = 0
                image.fixtures.append(physics_manager.add_box(image.body, Vector2(pos), Vector2(size), angle, user_data, sensor))
            elif obj_type == "circle":
                pos = get_element(physic_object,"pos")
                if not pos:
                    pos = (0,0)
                radius = get_element(physic_object,"radius")
                if not radius:
                    radius = 1

                image.fixtures.append(physics_manager.add_circle(image.body,pos,radius,sensor,user_data))