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)
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)
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
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)
def set_body_position(body,pos): if body: body.position = pixel2meter(pos).get_tuple()
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))