{"id":747,"date":"2017-11-23T21:05:24","date_gmt":"2017-11-23T20:05:24","guid":{"rendered":"http:\/\/www.pixnbgames.com\/blog\/?p=747"},"modified":"2017-11-23T21:05:24","modified_gmt":"2017-11-23T20:05:24","slug":"como-usar-libgdx-tiled-dibujando-con-libgdx","status":"publish","type":"post","link":"https:\/\/www.pixnbgames.com\/blog\/libgdx\/como-usar-libgdx-tiled-dibujando-con-libgdx\/","title":{"rendered":"C\u00f3mo usar libGDX + Tiled: dibujando con libGDX"},"content":{"rendered":"<h3>Recursos del proyecto<\/h3>\n<p>Una vez tenemos <a href=\"http:\/\/www.pixnbgames.com\/blog\/libgdx\/como-usar-libgdx-tiled-crear-el-tileset\/\">nuestro tileset<\/a> y <a href=\"http:\/\/www.pixnbgames.com\/blog\/libgdx\/como-usar-libgdx-tiled-diseno-del-escenario\/\">nuestro mapa<\/a>, es hora de empezar a trabajar con libGDX, para ello creamos un nuevo proyecto y lo importamos a nuestro editor de c\u00f3digo.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-748 size-medium\" src=\"http:\/\/www.pixnbgames.com\/blog\/wp-content\/uploads\/2017\/11\/Captura-de-pantalla-2017-11-22-a-las-21.09.50-300x84.png\" alt=\"\" width=\"300\" height=\"84\" srcset=\"https:\/\/www.pixnbgames.com\/blog\/wp-content\/uploads\/2017\/11\/Captura-de-pantalla-2017-11-22-a-las-21.09.50-300x84.png 300w, https:\/\/www.pixnbgames.com\/blog\/wp-content\/uploads\/2017\/11\/Captura-de-pantalla-2017-11-22-a-las-21.09.50.png 638w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Una vez importado, lo primero ser\u00e1 a\u00f1adir los recursos al proyecto. En el sub-proyecto <em>android<\/em>, crearemos una carpeta \u00ab<em>maps\/<\/em>\u00ab, y dentro copiamos los archivos <em>tileset.png<\/em> y <em>level.tmx<\/em>.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-750 size-full\" src=\"http:\/\/www.pixnbgames.com\/blog\/wp-content\/uploads\/2017\/11\/Captura-de-pantalla-2017-11-22-a-las-21.22.40.png\" alt=\"\" width=\"270\" height=\"142\" \/><br \/>\nAdem\u00e1s borramos la imagen <em>badlogic.jpg<\/em> incluida al crear el proyecto, ya que no la necesitamos.<\/p>\n<p>&nbsp;<\/p>\n<h3>C\u00f3digo<\/h3>\n<p>A continuaci\u00f3n explicaremos como cargar y dibujar el mapa en la clase principal del juego, <code>MyGdxTiledGame<\/code>. Antes de comenzar, limpiamos la implementaci\u00f3n por defecto de la clase:<\/p>\n<pre lang=\"Java\">public class MyGdxTiledGame extends ApplicationAdapter {\r\n    \r\n    @Override\r\n    public void create () {  }\r\n\r\n    @Override\r\n    public void render () {  }\r\n    \r\n    @Override\r\n    public void dispose () {  }\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h4>Cargando el mapa<\/h4>\n<p>La clase <code>TiledMap<\/code> representa un mapa generado con <em>Tiled Map Editor<\/em>. Es el punto de entrada a la manipulaci\u00f3n de nuestro mapa. Para cargar el <code>TiledMap<\/code>, utilizaremos el cargador <code>TmxMapLoader<\/code>. El siguiente fragmento de c\u00f3digo muestra c\u00f3mo hacerlo utilizando el <code>AssetManager<\/code>:<\/p>\n<pre lang=\"Java\">public class MyGdxTiledGame extends ApplicationAdapter {\r\n    \r\n    private TiledMap map;\r\n    private AssetManager manager;\r\n    ...\r\n\r\n    @Override\r\n    public void create () {\r\n        manager = new AssetManager();\r\n        manager.setLoader(TiledMap.class, new TmxMapLoader());\r\n        manager.load(\"maps\/level.tmx\", TiledMap.class);\r\n        manager.finishLoading();\r\n\r\n        map = manager.get(\"maps\/level.tmx\", TiledMap.class);\r\n        ...\r\n    }\r\n    \r\n    @Override\r\n    public void dispose () {\r\n        manager.dispose();\r\n    }\r\n}\r\n<\/pre>\n<p>Como se puede ver, se utiliza tambi\u00e9n el m\u00e9todo <code>dispose()<\/code> para liberar los recursos del <em>AssetManager<\/em>.<\/p>\n<p>&nbsp;<\/p>\n<h4>Propiedades del mapa<\/h4>\n<p>El objeto <code>TiledMap<\/code> contiene informaci\u00f3n en forma de propiedades que podemos leer. Para la lectura de propiedades utilizaremos la clase <code>MapProperties<\/code> que ofrece <em>libGDX<\/em>.<\/p>\n<pre lang=\"Java\">MapProperties properties = map.getProperties();<\/pre>\n<p>Por defecto encontraremos una serie de propiedades definidas por <em>Tiled Map Editor<\/em>, y tambi\u00e9n podemos agregar las que necesitemos desde el editor de <em>Tiled<\/em>. De las propiedades que tiene el mapa, es muy probable que necesitemos al menos las siguientes:<\/p>\n<ul>\n<li><strong>width:<\/strong> indica el ancho del mapa en n\u00famero de tiles.<\/li>\n<li><strong>height:<\/strong> indica el alto del mapa en n\u00famero de tiles.<\/li>\n<li><strong>tilewidth:<\/strong> indica el ancho de cada tile en p\u00edxeles.<\/li>\n<li><strong>tileheigh:<\/strong> indica el alto de cada tile en p\u00edxeles.<\/li>\n<\/ul>\n<p>A partir de las propiedades anteriores podemos el calcular el tama\u00f1o total del mapa en p\u00edxeles, cosa que necesitaremos para, entre otras cosas, posicionar la c\u00e1mara:<\/p>\n<pre lang=\"Java\">public class MyGdxTiledGame extends ApplicationAdapter {\r\n    ...\r\n    \/\/ Map properties\r\n    private int tileWidth, tileHeight,\r\n                mapWidthInTiles, mapHeightInTiles,\r\n                mapWidthInPixels, mapHeightInPixels;\r\n    ...\r\n    @Override\r\n    public void create () {\r\n        ...\r\n        \/\/ Read properties\r\n        MapProperties properties = map.getProperties();\r\n        tileWidth         = properties.get(\"tilewidth\", Integer.class);\r\n        tileHeight        = properties.get(\"tileheight\", Integer.class);\r\n        mapWidthInTiles   = properties.get(\"width\", Integer.class);\r\n        mapHeightInTiles  = properties.get(\"height\", Integer.class);\r\n        mapWidthInPixels  = mapWidthInTiles  * tileWidth;\r\n        mapHeightInPixels = mapHeightInTiles * tileHeight;\r\n        ...\r\n    }\r\n    ...\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h4>Preparando la c\u00e1mara<\/h4>\n<p>Para dibujar la escena utilizaremos una c\u00e1mara ortogr\u00e1fica <code>OrthographicCamera<\/code>, en este ejemplo usando una resoluci\u00f3n de proyecci\u00f3n de 320<i>px<\/i> de ancho por 180<i>px<\/i> de alto. Una vez creada, ajustamos su posici\u00f3n para dibujar el mapa en la posici\u00f3n deseada.<\/p>\n<pre lang=\"java\">public class MyGdxTiledGame extends ApplicationAdapter {\r\n    ...\r\n    private OrthographicCamera camera;\r\n    ...\r\n    @Override\r\n    public void create () {\r\n        ...\r\n        \/\/ Set up the camera\r\n        camera = new OrthographicCamera(320.f, 180.f);\r\n        camera.position.x = mapWidthInPixels * .5f;\r\n        camera.position.y = mapHeightInPixels * .35f;\r\n        ...\r\n    }\r\n    ...\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<h4>Dibujando en la escena<\/h4>\n<p>La clase encarga de dibujar el mapa en nuestra escena es <code>OrthogonalTiledMapRenderer<\/code>. Creamos un objeto de esta clase, y lo instanciamos en el m\u00e9todo <code>create()<\/code> pas\u00e1ndo nuestro mapa como par\u00e1metro.<\/p>\n<p>Despu\u00e9s, en el m\u00e9todo <code>render()<\/code>, se limpia la pantalla con un color azul, se actualiza la c\u00e1mara y dibuja nuestro mapa.<\/p>\n<pre lang=\"java\">public class MyGdxTiledGame extends ApplicationAdapter {\r\n    ...\r\n    private OrthogonalTiledMapRenderer renderer;\r\n    \r\n    @Override\r\n    public void create () {\r\n        ...\r\n        renderer = new OrthogonalTiledMapRenderer(map);\r\n        ...\r\n    }\r\n\r\n    @Override\r\n    public void render () {\r\n        Gdx.gl.glClearColor(.5f, .7f, .9f, 1);\r\n        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);\r\n\r\n        camera.update();\r\n        renderer.setView(camera);\r\n        renderer.render();\r\n    }\r\n    ...\r\n}<\/pre>\n<p>La siguiente imagen muestra el resultado de la ejecuci\u00f3n:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-large wp-image-751\" src=\"http:\/\/www.pixnbgames.com\/blog\/wp-content\/uploads\/2017\/11\/Captura-de-pantalla-2017-11-22-a-las-23.20.38-1024x612.png\" alt=\"\" width=\"530\" height=\"317\" srcset=\"https:\/\/www.pixnbgames.com\/blog\/wp-content\/uploads\/2017\/11\/Captura-de-pantalla-2017-11-22-a-las-23.20.38-1024x612.png 1024w, https:\/\/www.pixnbgames.com\/blog\/wp-content\/uploads\/2017\/11\/Captura-de-pantalla-2017-11-22-a-las-23.20.38-300x179.png 300w, https:\/\/www.pixnbgames.com\/blog\/wp-content\/uploads\/2017\/11\/Captura-de-pantalla-2017-11-22-a-las-23.20.38-768x459.png 768w, https:\/\/www.pixnbgames.com\/blog\/wp-content\/uploads\/2017\/11\/Captura-de-pantalla-2017-11-22-a-las-23.20.38.png 1288w\" sizes=\"(max-width: 530px) 100vw, 530px\" \/><\/p>\n<p>Puedes descargar el proyecto completo desde <a href=\"https:\/\/github.com\/angelnavarro\/Gdx-MyExamples\/tree\/master\/gdx-tiled-draw-map\" target=\"_blank\" rel=\"noopener\">mi repositorio de <em>GitHub<\/em><\/a>.<\/p>\n<p>Gracia y saludos,<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Recursos del proyecto Una vez tenemos nuestro tileset y nuestro mapa, es hora de empezar a trabajar con libGDX, para ello creamos un nuevo proyecto y lo importamos a nuestro editor de c\u00f3digo. Una vez importado, lo primero ser\u00e1 a\u00f1adir <a class=\"more-link\" href=\"https:\/\/www.pixnbgames.com\/blog\/libgdx\/como-usar-libgdx-tiled-dibujando-con-libgdx\/\">Seguir leyendo <span class=\"screen-reader-text\">  C\u00f3mo usar libGDX + Tiled: dibujando con libGDX<\/span><span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":751,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[14],"tags":[15,55],"language":[5],"_links":{"self":[{"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/posts\/747"}],"collection":[{"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/comments?post=747"}],"version-history":[{"count":15,"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/posts\/747\/revisions"}],"predecessor-version":[{"id":771,"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/posts\/747\/revisions\/771"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/media\/751"}],"wp:attachment":[{"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/media?parent=747"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/categories?post=747"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/tags?post=747"},{"taxonomy":"language","embeddable":true,"href":"https:\/\/www.pixnbgames.com\/blog\/wp-json\/wp\/v2\/language?post=747"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}