2013-08-04 2 views
1

Итак, я пытаюсь реализовать обнаружение столкновений в своей игре, и у меня есть слой в файле tmx Collision. Учебники LIBGDX onsite не охватывают взаимодействие с объектными слоями, и было сложно понять, как отображать карту в первую очередь. Вот как я визуализирую свой экран, я хотел бы узнать, как получить свой столкновение, а затем заставить спрайт взаимодействовать с ним.Обнаружение столкновений Tmx Maps с использованием libgdx (java)

@Override 
    public void render(float delta) { 
     translateCamera(); 

     Gdx.gl.glClearColor(0, 0, 0, 1); 
     Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 

     camera.update(); 

     renderer.setView(camera); 

     renderer.render(bgLayers); 
     // renderer.render(); 

     batch.begin(); 

     batch.draw(playerDirect, Gdx.graphics.getWidth()/2, 
       Gdx.graphics.getHeight()/2); 

     batch.end(); 
     renderer.render(fgLayers); 

    } 

ответ

3

Я бы рекомендовал добавлять заблокированные свойства к собственно плиткам - вы можете добавить свойства плитки через редактор Tiled на фактическом наборе плиток. Вы можете получить их свойства на тайнике. Я приведу цитату из документации:

TiledMap содержит один или несколько экземпляров TiledMapTileSet. Набор tile содержит несколько экземпляров TiledMapTile. Существует несколько вариантов реализации плиток , например. статические плитки, анимированные плитки и т. д. Вы можете создать свою собственную реализацию для специальных

Клетки в слое плитки ссылаются на эти плитки. Клетки внутри слоя могут эталонные плитки из множества наборов плиток. Однако для уменьшения текстурных переключателей рекомендуется установить на один набор плиток на слой.

В частности, вызовите getProperties на плитки в виде плитки. Это позволит получить пропозиции - тогда вы можете сравнить с вашим пользовательским атрибутом, и это может сказать вам, заблокирован ли какой-либо конкретный фрагмент, - тогда вы можете продолжить и реализовать свою собственную логику столкновений.

5

Существует способ использования слоя объекта. Не оставляйте надежду!

Одним из основных преимуществ этого метода для использования свойств плитки является легкость, с которой вы можете создавать меньше, более крупные тела для повышения эффективности в 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 будет производить именно то, где вы их нарисовали Плиточный. Было так приятно видеть это и убегать, верьте мне.

+0

Спасибо, это потрясающе, он работает безупречно с 2d! – im8bit