Существует способ использования слоя объекта. Не оставляйте надежду!
Одним из основных преимуществ этого метода для использования свойств плитки является легкость, с которой вы можете создавать меньше, более крупные тела для повышения эффективности в Box2d. Плюс, еще лучше, эти тела могут быть любой формой, которую вы хотите! Вместо дюжины квадратов тела мой уровень выборки в моей игре теперь имеет только три смешных (более органично выглядящих) тела, основанные на объектах.
I answered the same question на GameDev на днях, после серьезной охоты в джунглях в Интернете. tutorial я нашел не совсем работа для меня как есть, так что немного редактирования позже я пришел с этим:
public class MapBodyBuilder {
// The pixels per tile. If your tiles are 16x16, this is set to 16f
private static float ppt = 0;
public static Array<Body> buildShapes(Map map, float pixels, World world) {
ppt = pixels;
MapObjects objects = map.getLayers().get("Obstacles").getObjects();
Array<Body> bodies = new Array<Body>();
for(MapObject object : objects) {
if (object instanceof TextureMapObject) {
continue;
}
Shape shape;
if (object instanceof RectangleMapObject) {
shape = getRectangle((RectangleMapObject)object);
}
else if (object instanceof PolygonMapObject) {
shape = getPolygon((PolygonMapObject)object);
}
else if (object instanceof PolylineMapObject) {
shape = getPolyline((PolylineMapObject)object);
}
else if (object instanceof CircleMapObject) {
shape = getCircle((CircleMapObject)object);
}
else {
continue;
}
BodyDef bd = new BodyDef();
bd.type = BodyType.StaticBody;
Body body = world.createBody(bd);
body.createFixture(shape, 1);
bodies.add(body);
shape.dispose();
}
return bodies;
}
private static PolygonShape getRectangle(RectangleMapObject rectangleObject) {
Rectangle rectangle = rectangleObject.getRectangle();
PolygonShape polygon = new PolygonShape();
Vector2 size = new Vector2((rectangle.x + rectangle.width * 0.5f)/ppt,
(rectangle.y + rectangle.height * 0.5f)/ppt);
polygon.setAsBox(rectangle.width * 0.5f/ppt,
rectangle.height * 0.5f/ppt,
size,
0.0f);
return polygon;
}
private static CircleShape getCircle(CircleMapObject circleObject) {
Circle circle = circleObject.getCircle();
CircleShape circleShape = new CircleShape();
circleShape.setRadius(circle.radius/ppt);
circleShape.setPosition(new Vector2(circle.x/ppt, circle.y/ppt));
return circleShape;
}
private static PolygonShape getPolygon(PolygonMapObject polygonObject) {
PolygonShape polygon = new PolygonShape();
float[] vertices = polygonObject.getPolygon().getTransformedVertices();
float[] worldVertices = new float[vertices.length];
for (int i = 0; i < vertices.length; ++i) {
worldVertices[i] = vertices[i]/ppt;
}
polygon.set(worldVertices);
return polygon;
}
private static ChainShape getPolyline(PolylineMapObject polylineObject) {
float[] vertices = polylineObject.getPolyline().getTransformedVertices();
Vector2[] worldVertices = new Vector2[vertices.length/2];
for (int i = 0; i < vertices.length/2; ++i) {
worldVertices[i] = new Vector2();
worldVertices[i].x = vertices[i * 2]/ppt;
worldVertices[i].y = vertices[i * 2 + 1]/ppt;
}
ChainShape chain = new ChainShape();
chain.createChain(worldVertices);
return chain;
}
}
Предполагая, что вы установили вещи так, что размер вашей плитки соответствуют 1 квадратный метр (1 квадрат, если вы предпочитаете) в вашем Box2d World
, статический Body
s будет производить именно то, где вы их нарисовали Плиточный. Было так приятно видеть это и убегать, верьте мне.
Спасибо, это потрясающе, он работает безупречно с 2d! – im8bit