Java tutorial
/* * Copyright (C) 2014 Helix Engine Developers (http://github.com/fauu/HelixEngine) * * This software is licensed under the GNU General Public License * (version 3 or later). See the COPYING file in this distribution. * * You should have received a copy of the GNU Library General Public License * along with this software. If not, see <http://www.gnu.org/licenses/>. * * Authored by: Piotr Grabowski <fau999@gmail.com> */ package com.github.fauu.helix.core; import com.badlogic.gdx.assets.AssetDescriptor; import com.badlogic.gdx.assets.AssetLoaderParameters; import com.badlogic.gdx.assets.AssetManager; import com.badlogic.gdx.assets.loaders.AsynchronousAssetLoader; import com.badlogic.gdx.assets.loaders.FileHandleResolver; import com.badlogic.gdx.assets.loaders.TextureAtlasLoader; import com.badlogic.gdx.assets.loaders.resolvers.InternalFileHandleResolver; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.graphics.g3d.Model; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.GdxRuntimeException; import com.badlogic.gdx.utils.XmlReader; import java.io.IOException; import java.util.HashSet; import java.util.Set; public class MapRegionLoader extends AsynchronousAssetLoader<MapRegion, MapRegionLoader.Parameters> { public static class Parameters extends AssetLoaderParameters<MapRegion> { } protected MapRegion mapRegion; protected XmlReader xml = new XmlReader(); protected XmlReader.Element root; public MapRegionLoader() { super(new InternalFileHandleResolver()); } public MapRegionLoader(FileHandleResolver resolver) { super(resolver); } @Override public void loadAsync(AssetManager manager, String fileName, FileHandle hmrFile, Parameters parameters) { } @Override public MapRegion loadSync(AssetManager manager, String fileName, FileHandle hmrFile, Parameters parameters) { try { hmrFile = resolve(fileName); root = xml.parse(hmrFile); mapRegion = loadMapRegion(manager, root, hmrFile); return mapRegion; } catch (IOException e) { throw new GdxRuntimeException("Couldn't load map region '" + fileName + "'", e); } } protected MapRegion loadMapRegion(AssetManager manager, XmlReader.Element root, FileHandle hmrFile) { final int mapRegionWidth = root.getIntAttribute("width", 0); final int mapRegionHeight = root.getIntAttribute("height", 0); final Tile[] tiles = new Tile[mapRegionWidth * mapRegionHeight]; final XmlReader.Element tilesElement = root.getChildByName("tiles"); int tileCount = 0; for (XmlReader.Element tileElement : tilesElement.getChildrenByName("tile")) { final int tilePositionX = tileElement.getIntAttribute("x", 0); final int tilePositionY = tileElement.getIntAttribute("y", 0); final int tileElevation = tileElement.getIntAttribute("elevation", 0); final int tileTextureId = tileElement.getIntAttribute("textureid", 0); final int tileGeometryId = tileElement.getIntAttribute("geometryid", 0); final String tileFacingString = tileElement.getAttribute("facing", "south"); final String tileTypeString = tileElement.getAttribute("type", "default_walkable"); Direction tileFacing = Direction.SOUTH; if (tileFacingString.compareTo("north") == 0) { tileFacing = Direction.NORTH; } else if (tileFacingString.compareTo("east") == 0) { tileFacing = Direction.EAST; } else if (tileFacingString.compareTo("south") == 0) { tileFacing = Direction.SOUTH; } else if (tileFacingString.compareTo("west") == 0) { tileFacing = Direction.WEST; } Tile.Type tileType = Tile.Type.DEFAULT_WALKABLE; if (tileTypeString.compareTo("default_nonwalkable") == 0) { tileType = Tile.Type.DEFAULT_NONWALKABLE; } else if (tileTypeString.compareTo("default_walkable") == 0) { tileType = Tile.Type.DEFAULT_WALKABLE; } final Tile tile = new Tile.Builder().setNo(tileCount) .setPosition(new Vector2(tilePositionX, tilePositionY)).setElevation(tileElevation) .setTextureId(tileTextureId).setFacing(tileFacing).setGeometryId(tileGeometryId) .setType(tileType).build(); tiles[tileCount++] = tile; } final Array<Object> objects = new Array<Object>(); final XmlReader.Element objectsElement = root.getChildByName("objects"); for (XmlReader.Element objectElement : objectsElement.getChildrenByName("object")) { final int objectPositionX = objectElement.getIntAttribute("x", 0); final int objectPositionY = objectElement.getIntAttribute("y", 0); final String objectModelName = objectElement.getAttribute("model"); final Model objectModel = manager.get("assets/objects/" + objectModelName + ".g3db"); final int objectElevation = objectElement.getIntAttribute("elevation", 0); final String objectFacingString = objectElement.getAttribute("facing", "south"); Direction objectFacing = Direction.SOUTH; if (objectFacingString.compareTo("north") == 0) { objectFacing = Direction.NORTH; } else if (objectFacingString.compareTo("east") == 0) { objectFacing = Direction.EAST; } else if (objectFacingString.compareTo("south") == 0) { objectFacing = Direction.SOUTH; } else if (objectFacingString.compareTo("west") == 0) { objectFacing = Direction.WEST; } final Object object = new Object(new Vector2(objectPositionX, objectPositionY), objectModelName, objectModel, objectElevation, objectFacing); objects.add(object); } final int geometrySetId = root.getIntAttribute("geometrysetid"); final int textureSetId = root.getIntAttribute("texturesetid"); // FIXME: File paths shouldn't be handled like that mapRegion = new MapRegion(new Vector2(mapRegionWidth, mapRegionHeight), tiles, objects, manager.get("assets/texturesets/" + Integer.toString(textureSetId) + ".atlas", TextureAtlas.class), manager.get("assets/geometrysets/" + Integer.toString(geometrySetId) + ".hgs", GeometrySet.class)); return mapRegion; } @Override public Array<AssetDescriptor> getDependencies(String fileName, FileHandle hmrFile, Parameters parameters) { final Array<AssetDescriptor> dependencies = new Array(); try { root = xml.parse(hmrFile); final XmlReader.Element objectsElement = root.getChildByName("objects"); final Array<String> objectModelNames = new Array<String>(); for (XmlReader.Element objectElement : objectsElement.getChildrenByName("object")) { objectModelNames.add(objectElement.getAttribute("model")); } final int textureSetId = root.getIntAttribute("texturesetid", 0); final int geometrySetId = root.getIntAttribute("geometryesetid", 0); final TextureAtlasLoader.TextureAtlasParameter textureAtlasParameter = new TextureAtlasLoader.TextureAtlasParameter(); textureAtlasParameter.flip = true; // FIXME: File paths shouldn't be handled like that dependencies.add(new AssetDescriptor<TextureAtlas>( "assets/texturesets/" + Integer.toString(textureSetId) + ".atlas", TextureAtlas.class, textureAtlasParameter)); dependencies.add(new AssetDescriptor<GeometrySet>( "assets/geometrysets/" + Integer.toString(geometrySetId) + ".hgs", GeometrySet.class)); final Set<String> objectModelNameSet = new HashSet<String>(); for (String objectModelName : objectModelNames) { objectModelNameSet.add(objectModelName); } for (String objectModelName : objectModelNameSet) { dependencies.add( new AssetDescriptor<Model>("assets/objects/" + objectModelName + ".g3db", Model.class)); } return dependencies; } catch (IOException e) { throw new GdxRuntimeException("Couldn't load map region '" + fileName + "'", e); } } }