com.github.fauu.helix.core.MapRegionLoader.java Source code

Java tutorial

Introduction

Here is the source code for com.github.fauu.helix.core.MapRegionLoader.java

Source

/*
 * 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);
        }
    }

}