io.piotrjastrzebski.sfg.utils.Assets.java Source code

Java tutorial

Introduction

Here is the source code for io.piotrjastrzebski.sfg.utils.Assets.java

Source

/*
 * Super Flying Gentlemen
 * Copyright (C) 2014  Piotr Jastrzbski <me@piotrjastrzebski.io>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package io.piotrjastrzebski.sfg.utils;

import io.piotrjastrzebski.sfg.screen.GameScreen;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.assets.loaders.ParticleEffectLoader;
import com.badlogic.gdx.assets.loaders.SkinLoader;
import com.badlogic.gdx.graphics.g2d.ParticleEffect;
import com.badlogic.gdx.graphics.g2d.ParticleEffectPool;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.utils.I18NBundle;
import com.badlogic.gdx.utils.ObjectMap;
import com.esotericsoftware.spine.AnimationStateData;
import com.esotericsoftware.spine.SkeletonData;
import com.esotericsoftware.spine.SkeletonJson;

public class Assets {
    /** Constants for i18n */
    public final static String SIGN_IN = "g_sign_in";
    public final static String SIGN_OUT = "g_sign_out";
    public final static String SCORE = "score";
    public final static String RECORD = "record";
    public final static String NEW_RECORD = "new_record";
    public final static String ACHIEVEMENTS = "achievements";
    public final static String LEADER_BOARDS = "leaderboards";
    public final static String RETRY = "retry";
    public final static String RESUME = "resume";
    public final static String GAME_OVER = "game_over";
    public final static String DIALOG_LIGHTS_1 = "dialog_lights_1";
    public final static String DIALOG_LIGHTS_2 = "dialog_lights_2";
    public final static String OK = "ok";
    public final static String CANCEL = "cancel";
    public final static String ABOUT = "about";
    public final static String ABOUT_TEXT_1 = "about_text_1";
    public final static String ABOUT_TEXT_2 = "about_text_2";
    public final static String ABOUT_TEXT_3 = "about_text_3";
    public final static String ABOUT_TEXT_WWW_PIOTRJ = "about_text_site_piotrj";
    public final static String ABOUT_TEXT_WWW_LIBGDX = "about_text_site_libgdx";
    public final static String ABOUT_TEXT_WWW_SPINE = "about_text_site_spine";
    public final static String BACK = "back";
    public final static String SOUND_VOLUME = "sound_volume";
    public final static String SOUND_MAX = "sound_max";
    public final static String SOUND_OFF = "sound_off";
    public final static String MUSIC_VOLUME = "music_volume";
    public final static String MUSIC_MAX = "music_max";
    public final static String MUSIC_OFF = "music_off";
    public final static String SETTINGS = "settings";
    public final static String UNLOCKED = "unlocked";
    public final static String LOCKED = "locked";
    public final static String LOCKED_PREMIUM = "locked_premium";
    public final static String OUTFITS = "outfits";
    public final static String OUTFITS_LABEL = "outfits_label";
    public final static String GET_PREMIUM = "get_premium";
    public static final String DIFFICULTY_SELECT = "difficulty_select";
    public static final String DIFFICULTY_BRUTAL = "diff_brutal";
    public static final String DIFFICULTY_VERY_HARD = "diff_very_hard";
    public static final String DIFFICULTY_HARD = "diff_hard";
    public static final String DIFFICULTY_CUSTOM = "diff_custom";
    public static final String DIFFICULTY_BABY = "diff_baby";
    public static final String LIGHTS_ENABLED = "lights_on";
    public static final String LIGHTS_DISABLED = "lights_off";
    public static final String IMMERSIVE_ENABLED = "immersive_on";
    public static final String IMMERSIVE_DISABLED = "immersive_off";
    public static final String RESTORE_PURCHASES = "restore_purchases";
    public static final String RATE = "rate";
    public static final String RESET_TUTORIALS = "reset_tutorials";
    public static final String RESET_TUTORIALS_TOAST = "reset_tutorials_toast";
    public static final String CUSTOM_DIFFICULTY = "custom_difficulty";
    public static final String START_GAME = "start_game";
    public static final String CUSTOM_BASE_SELECT = "custom_base_select";
    public static final String RESET_DIFFICULTY = "reset_difficulty";

    public static final String PICKUP_SETTINGS = "pickup_settings";
    public static final String PICKUP_SPAWN_CHANCE = "pickup_spawn_chance";
    public static final String PICKUP_SPAWN_DISTANCE = "pickup_spawn_distance";
    public static final String PICKUP_LIVES_MIN = "pickup_lives_min";
    public static final String PICKUP_LIVES_MAX = "pickup_lives_max";
    public static final String PICKUP_SHIELDS_MIN = "pickup_shields_min";
    public static final String PICKUP_SHIELDS_MAX = "pickup_shields_max";
    public static final String PICKUP_BOOST_MIN = "pickup_boost_min";
    public static final String PICKUP_BOOST_MAX = "pickup_boost_max";
    public static final String PICKUP_TOXIC_MIN = "pickup_toxic_min";
    public static final String PICKUP_TOXIC_MAX = "pickup_toxic_max";

    public static final String OBSTACLE_SETTINGS = "obstacle_settings";
    public static final String OBSTACLE_DISTANCE_MIN = "obstacle_distance_min";
    public static final String OBSTACLE_DISTANCE_MAX = "obstacle_distance_max";
    public static final String OBSTACLE_GAP_MIN = "obstacle_gap_min";
    public static final String OBSTACLE_GAP_MAX = "obstacle_gap_max";

    public static final String PLAYER_SETTINGS = "player_settings";
    public static final String PLAYER_INIT_LIVES = "player_init_lives";
    public static final String PLAYER_INIT_SHIELDS = "player_init_shields";
    public static final String PLAYER_SCALE = "player_scale";
    public static final String PLAYER_CENTRE_OFFSET = "player_centre_offset";
    public static final String PLAYER_FLY_SPEED = "player_fly_speed";
    public static final String PLAYER_FLY_MAX_SPEED = "player_fly_max_speed";
    public static final String PLAYER_FLY_IMPULSE = "player_fly_impulse";
    public static final String PLAYER_LINEAR_DAMPENING = "player_linear_dampening";
    public static final String PLAYER_JUMP_IMPULSE = "player_jump_impulse";
    public static final String PLAYER_JUMP_DELAY = "player_jump_delay";
    public static final String PLAYER_DASH_TIME = "player_dash_time";
    public static final String PLAYER_DASH_DELAY = "player_dash_delay";
    public static final String PLAYER_DASH_IMPULSE = "player_dash_impulse";

    public static final String WORLD_SETTINGS = "world_settings";
    public static final String GRAVITY = "world_gravity";
    public static final String CUSTOM_WARNING = "custom_warning";

    private final static String GAME_ATLAS = "data/pack/sfg.atlas";
    private final static String PARTICLE_ATLAS = "data/pack/sfg_particles.atlas";
    private final static String UI_ATLAS = "data/pack/sfg_ui.atlas";
    private final static String SKIN = "data/skin.json";
    private final static String P_EXPLOSION = "data/particles/explosion.p";
    private final static String P_BLOOD = "data/particles/blood.p";
    private final static String P_TOXIC = "data/particles/toxic.p";

    private final static String I18N = "data/i18n/SFGBundle";

    private final AssetManager assetManager;

    private Skin skin;

    private TextureAtlas gameAtlas;
    private TextureAtlas particleAtlas;
    private TextureAtlas uiAtlas;
    private SkeletonJson json;

    public static enum Particles {
        EXPLOSION, BLOOD, TOXIC
    }

    public static enum Animations {
        PLAYER, OBST_SPIKE, OBST_HAMMER, OBST_MOVING, PICKUP, TUT_JUMP, TUT_BOOST, TUT_BREAKABLE, SHIELD_BREAK
    }

    private ObjectMap<Particles, ParticleEffectPool> particleEffects;
    private ObjectMap<Animations, SkeletonData> skeletons;
    private ObjectMap<Animations, AnimationStateData> animationStates;

    private ObjectMap<String, TextureRegion> gameRegions;
    private ObjectMap<String, TextureRegion> uiRegions;

    private SoundManager soundManager;

    private I18NBundle bundle;

    public Assets() {
        gameRegions = new ObjectMap<String, TextureRegion>();
        uiRegions = new ObjectMap<String, TextureRegion>();
        assetManager = new AssetManager();
        assetManager.load(GAME_ATLAS, TextureAtlas.class);
        assetManager.load(UI_ATLAS, TextureAtlas.class);

        SkinLoader.SkinParameter skinParameter = new SkinLoader.SkinParameter(UI_ATLAS);
        assetManager.load(SKIN, Skin.class, skinParameter);

        ParticleEffectLoader.ParticleEffectParameter pep = new ParticleEffectLoader.ParticleEffectParameter();
        pep.atlasFile = PARTICLE_ATLAS;
        assetManager.load(P_EXPLOSION, ParticleEffect.class, pep);
        assetManager.load(P_BLOOD, ParticleEffect.class, pep);
        assetManager.load(P_TOXIC, ParticleEffect.class, pep);
        assetManager.load(I18N, I18NBundle.class);

        soundManager = new SoundManager(assetManager);
    }

    private boolean loaded = false;

    public boolean update() {
        final boolean isDone = assetManager.update();
        if (isDone && !loaded) {
            finishLoading();
            loaded = true;
        }
        return isDone;
    }

    private void finishLoading() {
        gameAtlas = assetManager.get(GAME_ATLAS, TextureAtlas.class);
        particleAtlas = assetManager.get(PARTICLE_ATLAS, TextureAtlas.class);
        uiAtlas = assetManager.get(UI_ATLAS, TextureAtlas.class);

        skin = assetManager.get(SKIN, Skin.class);

        skin.getFont("default-font").setMarkupEnabled(true);
        final ParticleEffectPool explosionParticles = new ParticleEffectPool(
                assetManager.get(P_EXPLOSION, ParticleEffect.class), 16, Integer.MAX_VALUE);
        final ParticleEffectPool bloodParticles = new ParticleEffectPool(
                assetManager.get(P_BLOOD, ParticleEffect.class), 8, Integer.MAX_VALUE);
        final ParticleEffectPool toxicParticles = new ParticleEffectPool(
                assetManager.get(P_TOXIC, ParticleEffect.class), 8, Integer.MAX_VALUE);
        particleEffects = new ObjectMap<Particles, ParticleEffectPool>();
        particleEffects.put(Particles.BLOOD, bloodParticles);
        particleEffects.put(Particles.EXPLOSION, explosionParticles);
        particleEffects.put(Particles.TOXIC, toxicParticles);

        bundle = assetManager.get(I18N, I18NBundle.class);

        loadGameAnimations();
        loadUIAnimations();

        soundManager.finishLoading();
    }

    private void loadGameAnimations() {
        skeletons = new ObjectMap<Animations, SkeletonData>();
        animationStates = new ObjectMap<Animations, AnimationStateData>();

        json = new SkeletonJson(gameAtlas);
        json.setScale(GameScreen.BOX2D_TO_PIXEL);

        final String[] animFiles = { "data/anim/obst_spike.json", "data/anim/obst_hammer.json",
                "data/anim/obst_moving.json", "data/anim/pickup.json", "data/anim/broken_shield.json" };
        final Animations[] animNames = { Animations.OBST_SPIKE, Animations.OBST_HAMMER, Animations.OBST_MOVING,
                Animations.PICKUP, Animations.SHIELD_BREAK };

        for (int i = 0; i < animFiles.length; i++) {
            final SkeletonData skeletonData = json.readSkeletonData(Gdx.files.internal(animFiles[i]));
            final AnimationStateData animationData = new AnimationStateData(skeletonData);
            skeletons.put(animNames[i], skeletonData);
            animationStates.put(animNames[i], animationData);
        }
        initPlayerAnimations(1.5f);
    }

    // default
    private float lastScale = -1;

    public void initPlayerAnimations(float scale) {
        // dont reinit if same scale as last time
        if (MathUtils.isEqual(lastScale, scale))
            return;
        lastScale = scale;
        json.setScale(GameScreen.BOX2D_TO_PIXEL * scale);
        final SkeletonData playerSkeletonData = json.readSkeletonData(Gdx.files.internal("data/anim/player.json"));
        final AnimationStateData playerAnimationData = new AnimationStateData(playerSkeletonData);
        skeletons.put(Animations.PLAYER, playerSkeletonData);
        animationStates.put(Animations.PLAYER, playerAnimationData);
    }

    private void loadUIAnimations() {
        final SkeletonJson json = new SkeletonJson(uiAtlas);
        json.setScale(GameScreen.BOX2D_TO_PIXEL);

        final String[] animTutFiles = { "data/anim/jump_tutorial.json", "data/anim/boost_tutorial.json",
                "data/anim/breakable_tutorial.json" };
        final Animations[] animTutNames = { Animations.TUT_JUMP, Animations.TUT_BOOST, Animations.TUT_BREAKABLE };

        for (int i = 0; i < animTutFiles.length; i++) {
            final SkeletonData skeletonData = json.readSkeletonData(Gdx.files.internal(animTutFiles[i]));
            final AnimationStateData animationData = new AnimationStateData(skeletonData);
            skeletons.put(animTutNames[i], skeletonData);
            animationStates.put(animTutNames[i], animationData);
        }
    }

    public void dispose() {
        skin.dispose();
        gameAtlas.dispose();
        particleAtlas.dispose();
        uiAtlas.dispose();
        assetManager.dispose();
        soundManager.dispose();

        gameRegions = null;
        uiRegions = null;
    }

    public TextureRegion getRegion(String name) {
        if (!gameRegions.containsKey(name)) {
            gameRegions.put(name, gameAtlas.findRegion(name));
        }
        return gameRegions.get(name);
    }

    public TextureRegion getUIRegion(String name) {
        if (!uiRegions.containsKey(name)) {
            uiRegions.put(name, uiAtlas.findRegion(name));
        }
        return uiRegions.get(name);
    }

    /**
    * Return sprite scaled to box2d size
    */
    public Sprite getScaledSprite(String name) {
        final Sprite sprite = new Sprite(getRegion(name));
        sprite.setSize(sprite.getWidth() * GameScreen.BOX2D_TO_PIXEL,
                sprite.getHeight() * GameScreen.BOX2D_TO_PIXEL);
        return sprite;
    }

    public String getText(String key) {
        return bundle.get(key);
    }

    public String getText(String key, Object... args) {
        return bundle.format(key, args);
    }

    public Skin getSkin() {
        return skin;
    }

    public ParticleEffectPool getParticles(Particles particle) {
        return particleEffects.get(particle);
    }

    public SkeletonData getSkeletonData(Animations animation) {
        return skeletons.get(animation);
    }

    public AnimationStateData getAnimationStateData(Animations animation) {
        return animationStates.get(animation);
    }

    public SoundManager getSoundManager() {
        return soundManager;
    }

    public TextureAtlas getUiAtlas() {
        return uiAtlas;
    }
}