1

I have a TMX file with a tiles image layer and also a Object Layer. I have it all imported into my libGDX project but cannot seem to get the Rectangle coords of each object through into my code. Please see below my Level class and the TMX file for reference. (I've been stuck on this for days now its so frustating I've tried dozens of things and I'm in a right mess now!):

package com.moneylife.solarsystem;

import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.maps.MapLayer;
import com.badlogic.gdx.maps.MapObject;
import com.badlogic.gdx.maps.objects.RectangleMapObject;
import com.badlogic.gdx.maps.tiled.TiledMap;
import com.badlogic.gdx.maps.tiled.TmxMapLoader;
import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.math.Rectangle;

public class Level {
    BitmapFont font;
    int sizeTest = 0;
    OrthogonalTiledMapRenderer renderer;
    OrthographicCamera camera;
    Stage mainStage;
    TiledMap map;
    Array<Rectangle> platformRects;
    Array<Platform> platforms;
    SpriteBatch spriteBatch;
    float unitScale = 1 / 256f;
    Platform platform;


    public Level(String TmxFileName, OrthographicCamera Camera, Stage MainStage) {
        font = new BitmapFont();
        font.setColor(Color.RED);
        mainStage = MainStage;
        map = new TmxMapLoader().load(TmxFileName);
        renderer = new OrthogonalTiledMapRenderer(map, unitScale);
        camera = Camera;
        camera.setToOrtho(false, 7, 4);
        camera.update();
        spriteBatch = new SpriteBatch();
        platformRects = new Array<Rectangle>();

        MapLayer layer = map.getLayers().get("platforms");
        for (MapObject object : layer.getObjects()) {
            if (object instanceof RectangleMapObject) {
                RectangleMapObject rectangleObject = (RectangleMapObject) object;

                // If you want to use the name to determine if it belongs in your array
                if ("floorRect".equals(rectangleObject.getName())) {
                    Rectangle rectangle = rectangleObject.getRectangle();
                    platformRects.add(rectangle);
                }
//                 If you want to look at the "type" property to determine if it belongs in your array
//        if ("rectie".equals(rectangleObject.getProperties().get("type", String.class))) {
//            Rectangle rectangle = rectangleObject.getRectangle();
//            platformRects.add(rectangle);
//        }
            }
        }
        for (int i = 0; i < platformRects.size; i++){
            platform = new Platform(platformRects.get(i));
            mainStage.addActor(platform);
        }
    }

    public void draw() {

        spriteBatch.begin();
        renderer.setView(camera);
        renderer.render();

        font.draw(spriteBatch, "plat Rects count: " + sizeTest, 0, 0);
        spriteBatch.end();
    }
}

And the TMX FILE........

    <?xml version="1.0" encoding="UTF-8"?>
<map version="1.0" orientation="orthogonal" renderorder="right-up" width="20" height="5" tilewidth="256" tileheight="256" nextobjectid="47">
 <tileset firstgid="1" name="bg" tilewidth="256" tileheight="256" tilecount="12">
  <image source="../textures/bg.jpg" width="1024" height="768"/>
 </tileset>
 <tileset firstgid="13" name="platforms" tilewidth="256" tileheight="256" tilecount="2">
  <tile id="0">
   <image width="256" height="256" source="../textures/tiles-brown.png"/>
  </tile>
  <tile id="1">
   <image width="256" height="256" source="../textures/tiles-green.png"/>
  </tile>
 </tileset>
 <layer name="background" width="20" height="5">
  <data encoding="base64" compression="zlib">
   eJytybkNADAIBEH/f//1ehMnyBCBNMGxIfheQURCdthWe79fT0qvaOgYYltN2xMLG0dsq2n7AsAQAbY=
  </data>
 </layer>
 <objectgroup name="platforms">
  <object id="20" name="floorRect" type="rectie" gid="14" x="1280" y="1280" width="256" height="256"/>
  <object id="21" name="floorRect" type="rectie" gid="14" x="1792" y="1280" width="256" height="256"/>
  <object id="22" name="floorRect" type="rectie" gid="14" x="1536" y="1280" width="256" height="256"/>
  <object id="23" name="floorRect" type="rectie" gid="13" x="2304" y="1280" width="256" height="256"/>
  <object id="24" name="floorRect" type="rectie" gid="13" x="2560" y="1280" width="256" height="256"/>
  <object id="25" name="floorRect" type="rectie" gid="14" x="2816" y="1280" width="256" height="256"/>
  <object id="26" name="floorRect" type="rectie" gid="14" x="2560" y="1024" width="256" height="256"/>
  <object id="27" name="floorRect" type="rectie" gid="14" x="2304" y="1024" width="256" height="256"/>
  <object id="28" name="floorRect" type="rectie" gid="14" x="3328" y="1280" width="256" height="256"/>
  <object id="29" name="floorRect" type="rectie" gid="14" x="3584" y="1024" width="256" height="256"/>
  <object id="30" gid="13" x="3584" y="1280" width="256" height="256"/>
  <object id="31" name="floorRect" type="rectie" gid="14" x="3840" y="1280" width="256" height="256"/>
  <object id="32" name="floorRect" type="rectie" gid="14" x="4096" y="1280" width="256" height="256"/>
  <object id="33" name="floorRect" type="rectie" gid="14" x="4352" y="1280" width="256" height="256"/>
  <object id="34" name="floorRect" type="rectie" gid="14" x="4608" y="1280" width="256" height="256"/>
  <object id="35" name="floorRect" type="rectie" gid="14" x="0" y="1280" width="256" height="256"/>
  <object id="36" gid="14" x="256" y="1280" width="256" height="256"/>
  <object id="37" name="floorRect" type="rectie" gid="14" x="512" y="1280" width="256" height="256"/>
  <object id="38" name="floorRect" type="rectie" gid="14" x="768" y="1280" width="256" height="256"/>
  <object id="39" gid="13" x="1024" y="1280" width="256" height="256"/>
  <object id="40" name="floorRect" type="rectie" gid="14" x="1024" y="1024" width="256" height="256"/>
  <object id="41" gid="14" x="0" y="1279" width="256" height="256"/>
  <object id="42" name="floorRect" type="rectie" gid="14" x="256" y="1280" width="256" height="256"/>
 </objectgroup>
</map>
I_Keep_Trying
  • 395
  • 3
  • 17
  • `Rectangle rectangle = rectangleObject.getRectangle();` This is how you get the rectangle coords. What exactly is your problem? – noone Nov 15 '15 at 07:44
  • I found my answer. I had placed the 'platforms' in Tiled object layer using the "Insert Tile" icon and it placed what looked like a rectangle but RectangleMapObject condition in my lbgdx for-each code was never met as this "Insert Tile" wasn't making any RectangleMapObjects. In the end I simply drew rectangles around the platforms in the Object Layer with the "Insert Rectangle" icon in Tiled. I'm sure there will be a class in LibGDX which looks for TileMapObjects (although I tried the TiledMapObjects and that definitely isnt it) Anyhow I have moved passed the issue but thanks for the reply – I_Keep_Trying Nov 15 '15 at 16:20

1 Answers1

1

I think this is what you are looking for...

    if(object instanceof TextureMapObject) {
        TextureMapObject mapObject = (TextureMapObject) object;
        this.bounds = new Rectangle(mapObject.getX(), mapObject.getY(),
                                    mapObject.getTextureRegion().getRegionWidth(),
                                    mapObject.getTextureRegion().getRegionHeight());
    }
    else
        this.bounds = ((RectangleMapObject) object).getRectangle();
Marvin
  • 44
  • 2