package com.igorcrevar.rolloverchuck; import java.util.HashMap; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Preferences; import com.badlogic.gdx.assets.AssetManager; import com.badlogic.gdx.assets.loaders.resolvers.InternalFileHandleResolver; import com.badlogic.gdx.audio.Music; import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.graphics.glutils.ShaderProgram; import com.badlogic.gdx.utils.Disposable; import com.igorcrevar.rolloverchuck.GameType.BaseGameType; import com.igorcrevar.rolloverchuck.GameType.Difficulty; import com.igorcrevar.rolloverchuck.mesh.CubeMesh; import com.igorcrevar.rolloverchuck.mesh.CubeMeshWithNormals; import com.igorcrevar.rolloverchuck.mesh.FieldMesh; import com.igorcrevar.rolloverchuck.mesh.IMesh; import com.igorcrevar.rolloverchuck.mesh.SphereMesh; import com.igorcrevar.rolloverchuck.objects.StarsObject; import com.igorcrevar.rolloverchuck.utils.ShaderAssetLoader; public class GameManager implements Disposable { private AssetManager assetManager = new AssetManager(); private boolean isSoundOn; private HashMap<String, IMesh> meshMap = new HashMap<String, IMesh>(8); private GameData gameData = new GameData(); private Preferences preferences; private StarsObject stars; private Sprite overlaySprite; public GameManager() { //load top score, etc preferences = Gdx.app.getPreferences("crewprefs"); isSoundOn = preferences.getBoolean("sound_on", true); assetManager.setLoader(ShaderProgram.class, new ShaderAssetLoader(new InternalFileHandleResolver())); // add all needed assets to queue assetManager.load("fonts/font.fnt", BitmapFont.class); assetManager.load("atlases/widgets.atlas", TextureAtlas.class); assetManager.load("atlases/base.atlas", TextureAtlas.class); assetManager.load("sounds/intro.ogg", Music.class); assetManager.load("sounds/game.ogg", Music.class); assetManager.load("light", ShaderProgram.class); assetManager.load("field", ShaderProgram.class); assetManager.load("simple", ShaderProgram.class); assetManager.load("shadow", ShaderProgram.class); assetManager.load("region", ShaderProgram.class); } public void setSoundOn(boolean value) { isSoundOn = value; preferences.putBoolean("sound_on", value); preferences.flush(); if (isSoundOn) { playIntroMusic(); } else { stopIntroMusic(); } } public void saveScore(GameType gameType, long score) { // games played by player String gamesPlayedKey = "games_played" + gameType.toString(); preferences.putLong(gamesPlayedKey, preferences.getLong(gamesPlayedKey, 0) + 1); // save top score String topScoreKey = "top_score" + gameType.toString(); long topScore = preferences.getLong(topScoreKey, 0); if (topScore < score) { preferences.putLong(topScoreKey, score); } preferences.flush(); } public long getTopScore(GameType gameType) { return preferences.getLong("top_score" + gameType.toString(), 0); } public long getTotalGamesPlayed(GameType gameType) { return preferences.getLong("games_played" + gameType.toString(), 0); } public long getAllGamesPlayed() { long res = 0; for (BaseGameType baseType : BaseGameType.values()) { for (Difficulty difficulty : Difficulty.values()) { String key = String.format("games_played%d-%d", baseType.ordinal(), difficulty.ordinal()); res += preferences.getLong(key, 0); } } return res; } public boolean getIsSoundOn() { return isSoundOn; } /** * Update loading of assets * @return true if loading is finished */ public boolean updateLoading() { if (assetManager.update()) { // add meshes addMesh("plane", new FieldMesh(gameData)); addMesh("sphere", new SphereMesh(gameData)); addMesh("cube", new CubeMesh(gameData)); addMesh("cube_with_normals", new CubeMeshWithNormals(gameData)); return true; } return false; } @Override public void dispose() { assetManager.dispose(); for (IMesh m : meshMap.values()) { m.dispose(); } } public TextureAtlas getTextureAtlas(String fileName) { String fullName = "atlases/" + fileName + ".atlas"; return assetManager.get(fullName, TextureAtlas.class); } public Texture getTexture(String fileName) { return assetManager.get("images/" + fileName, Texture.class); } public Sound getSound(String fileName) { return assetManager.get("sounds/" + fileName, Sound.class); } public ShaderProgram getShader(final String fileName) { return assetManager.get(fileName, ShaderProgram.class); } public void addMesh(final String name, IMesh mesh) { meshMap.put(name, mesh); } public IMesh getMesh(final String name) { return meshMap.get(name); } public void playIntroMusic() { if (isSoundOn && assetManager.isLoaded("sounds/intro.ogg", Music.class)) { Music music = assetManager.get("sounds/intro.ogg", Music.class); music.setLooping(true); music.play(); } } public void stopIntroMusic() { if (assetManager.isLoaded("sounds/intro.ogg", Music.class)) { Music music = assetManager.get("sounds/intro.ogg", Music.class); music.stop(); } } public void playGameMusic() { if (isSoundOn && assetManager.isLoaded("sounds/game.ogg", Music.class)) { Music music = assetManager.get("sounds/game.ogg", Music.class); music.setLooping(false); music.play(); } } public void stopGameMusic() { if (assetManager.isLoaded("sounds/game.ogg", Music.class)) { Music music = assetManager.get("sounds/game.ogg", Music.class); music.stop(); } } public void playCoinSound() { if (isSoundOn) { getSound("coin.wav").play(); } } public void playMoveSound() { if (isSoundOn) { getSound("move.wav").play(); } } public void playDieSound() { if (isSoundOn) { getSound("die.wav").play(); } } public BitmapFont getBitmapFont() { return assetManager.get("fonts/font.fnt", BitmapFont.class); } public boolean isBitmapFontLoaded() { return assetManager.isLoaded("fonts/font.fnt", BitmapFont.class); } public GameData getGameData() { return gameData; } public StarsObject getStars() { if (stars == null) { stars = new StarsObject(); } return stars; } public Sprite getOverlaySprite(float rgbFactor, float alphaFactor) { if (overlaySprite == null) { overlaySprite = new Sprite(); overlaySprite.setBounds(0, 0, 1920, 1080); overlaySprite.setOrigin(960, 540); overlaySprite.setRegion(getTextureAtlas("base").findRegion("myfont")); } overlaySprite.setColor(rgbFactor, rgbFactor, rgbFactor, alphaFactor); return overlaySprite; } }