com.lyeeedar.Roguelike3D.Graphics.Screens.LevelLoadingScreen.java Source code

Java tutorial

Introduction

Here is the source code for com.lyeeedar.Roguelike3D.Graphics.Screens.LevelLoadingScreen.java

Source

/*******************************************************************************
 * Copyright (c) 2013 Philip Collin.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Public License v3.0
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/gpl.html
 * 
 * Contributors:
 *     Philip Collin - initial API and implementation
 ******************************************************************************/
package com.lyeeedar.Roguelike3D.Graphics.Screens;

import java.util.ArrayList;
import java.util.HashMap;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.lyeeedar.Graphics.ParticleEffects.ParticleEffect;
import com.lyeeedar.Graphics.ParticleEffects.ParticleEmitter;
import com.lyeeedar.Roguelike3D.Roguelike3DGame;
import com.lyeeedar.Roguelike3D.Roguelike3DGame.GameScreen;
import com.lyeeedar.Roguelike3D.Game.GameData;
import com.lyeeedar.Roguelike3D.Game.GameData.Damage_Type;
import com.lyeeedar.Roguelike3D.Game.GameData.Element;
import com.lyeeedar.Roguelike3D.Game.GameObject;
import com.lyeeedar.Roguelike3D.Game.GameStats;
import com.lyeeedar.Roguelike3D.Game.Actor.Enemy;
import com.lyeeedar.Roguelike3D.Game.Actor.GameActor;
import com.lyeeedar.Roguelike3D.Game.Actor.Player;
import com.lyeeedar.Roguelike3D.Game.Item.Equipment_HAND;
import com.lyeeedar.Roguelike3D.Game.Item.Equipment_HAND.WeaponType;
import com.lyeeedar.Roguelike3D.Game.Level.Level;
import com.lyeeedar.Roguelike3D.Game.Level.LevelGraphics;
import com.lyeeedar.Roguelike3D.Game.Level.XML.BiomeReader;
import com.lyeeedar.Roguelike3D.Game.Level.XML.RoomReader;
import com.lyeeedar.Roguelike3D.Game.LevelObjects.LevelObject;
import com.lyeeedar.Roguelike3D.Graphics.Lights.LightManager;
import com.lyeeedar.Roguelike3D.Graphics.Lights.LightManager.LightQuality;
import com.lyeeedar.Roguelike3D.Graphics.Models.SkyBox;
import com.lyeeedar.Roguelike3D.Graphics.Renderers.ForwardRenderer;

public class LevelLoadingScreen extends AbstractScreen {

    Texture loading_bar;

    ArrayList<GameObject> objects = new ArrayList<GameObject>();

    float percent = 0;
    String message = "";

    float step;

    Level level;
    LevelGraphics graphics;
    BiomeReader biome;
    RoomReader rReader;

    float taskSteps;

    GameScreen nextScreen;

    int width;
    int height;

    public LevelLoadingScreen(Roguelike3DGame game) {
        super(game);
    }

    public void setSettings(BiomeReader biome, RoomReader rReader, GameScreen nextScreen) {
        this.width = biome.getWidth();
        this.height = biome.getHeight();

        this.rReader = rReader;
        this.biome = biome;
        this.nextScreen = nextScreen;

        float size = height * 1.5f;

        taskSteps = 100f / size;

        percent = 0;
        message = "";

        loadingStage = 0;
    }

    long time;
    int loadingStage = 0;

    public void loadingTask() {
        if (loadingStage == 0) {
            time = System.nanoTime();
            message = "Disposing previous level";

            if (GameData.level != null)
                GameData.level.dispose();

            if (GameData.levelGraphics != null)
                GameData.levelGraphics.dispose();

            loadingStage++;
        } else if (loadingStage == 1) {
            message = "Loading Level";

            level = GameData.getCurrentLevelContainer().getLevel(biome, rReader);
            GameData.level = level;

            percent += taskSteps;

            if (level != null)
                loadingStage++;
        } else if (loadingStage == 2) {
            level.create();

            level.fixReferences();

            Player player = level.getPlayer();

            if (player == null) {
                player = new Player(new Color(0, 0.6f, 0, 1.0f), "blank", 0, 0, 0, 0.5f, GL20.GL_TRIANGLES, "file",
                        "model@");

                HashMap<Damage_Type, Integer> DAM_DEF = new HashMap<Damage_Type, Integer>();
                DAM_DEF.put(Damage_Type.PIERCE, 50);
                DAM_DEF.put(Damage_Type.IMPACT, 50);
                DAM_DEF.put(Damage_Type.TOUCH, 0);

                HashMap<Element, Integer> ELE_DEF = new HashMap<Element, Integer>();
                ELE_DEF.put(Element.FIRE, 0);
                ELE_DEF.put(Element.AIR, 0);
                ELE_DEF.put(Element.WATER, 0);
                ELE_DEF.put(Element.WOOD, 0);
                ELE_DEF.put(Element.METAL, 0);
                ELE_DEF.put(Element.AETHER, 100);
                ELE_DEF.put(Element.VOID, 0);

                player.R_HAND = Equipment_HAND.getWeapon(WeaponType.MELEE, "sword", "SWING", 15, ELE_DEF, DAM_DEF,
                        20, 85, false, 3, 1, level);
                player.L_HAND = Equipment_HAND.getWeapon(WeaponType.RANGED, "torch", "FIREBALL", 15, ELE_DEF,
                        DAM_DEF, 71, 13, false, 3, 1, level);

                player.create();
                player.visible = false;

                level.addGameActor(player);
            }

            GameStats.setPlayerStats(player);

            GameData.player = player;

            level.positionPlayer(player, GameData.prevLevel, GameData.currentLevel);

            percent += taskSteps;
            loadingStage++;

        } else if (loadingStage == 3) {
            message = "Creating Fundamental Structure";
            graphics = new LevelGraphics(level.levelArray, level.colours, biome, level.hasRoof);

            if (GameData.getCurrentLevelContainer().skybox != null) {
                GameData.skyBox = new SkyBox(GameData.getCurrentLevelContainer().skybox);
            } else
                GameData.skyBox = null;

            loadingStage++;
            percent += taskSteps * 5;
        } else if (loadingStage == 4) {
            message = "Forcing Matter Into Existence";
            boolean done = graphics.createTileRow();
            percent += taskSteps;

            if (done)
                loadingStage++;
        } else if (loadingStage == 5) {
            message = "Coalescing Matter";
            boolean done = graphics.createChunkRow();
            percent += taskSteps;

            if (done)
                loadingStage++;
        } else if (loadingStage == 6) {
            message = "Baking Lights";

            level.getLights(GameData.lightManager);
            level.evaluateUniqueBehaviour(lightManager);

            if (GameData.lightQuality != LightQuality.FORWARD_VERTEX) {
                loadingStage++;
                return;
            }

            graphics.bakeLights(GameData.lightManager, true);
            level.bakeLights(GameData.lightManager);

            loadingStage++;
        } else if (loadingStage == 7) {
            System.out.println(
                    "Level loading done in " + ((float) (System.nanoTime() - time) / 1000000000f) + "seconds");
            GameData.finishLoading(graphics, GameScreen.INGAME);
            loadingStage++;
        }

        if (percent > 100)
            percent = 100;
    }

    ArrayList<ParticleEmitter> emitters = new ArrayList<ParticleEmitter>();

    @Override
    public void drawModels(float delta) {
        renderer.begin();
        for (GameObject go : objects) {
            go.render(renderer, emitters, cam);
        }
        renderer.end(lightManager);
    }

    @Override
    public void drawOrthogonals(float delta) {

    }

    @Override
    public void drawTransparent(float delta) {

        spriteBatch.begin();

        spriteBatch.draw(loading_bar, 100, 200, percent * step, 25);

        font.drawMultiLine(spriteBatch, message, 250, 175);

        spriteBatch.end();
    }

    float xrotate = 360f / 560f;

    @Override
    public void update(float delta) {

        loadingTask();

        cam.update();
    }

    LightManager lightManager;

    @Override
    public void create() {

        lightManager = new LightManager(4, LightQuality.FORWARD_VERTEX);

        renderer = new ForwardRenderer();
        renderer.createShader(lightManager);

        GameObject go = new Enemy(new Color(), "icon", 0, 0, -4, 0.5f, GL20.GL_TRIANGLES, "cube", "2", "2", "2");
        go.create();
        go.bakeLights(lightManager, true);

        objects.add(go);

        loading_bar = new Texture(Gdx.files.internal("data/skins/loading_bar.png"));
    }

    @Override
    public void resize(int width, int height) {
        super.resize(width, height);

        step = (width - 200) / 100;
    }

    @Override
    public void hide() {

    }

    @Override
    public void show() {
        Gdx.input.setCursorCatched(false);
    }

    @Override
    public void pause() {

    }

    @Override
    public void resume() {
    }

    @Override
    public void superDispose() {
    }
}