implemented all sounds and music

This commit is contained in:
=
2018-01-19 17:41:05 +01:00
parent 53b9b6bb14
commit 2c19e3dcb5
52 changed files with 686 additions and 379 deletions

View File

@ -8,28 +8,46 @@ import de.frajul.endlessroll.entities.collision.geometry.Geometry;
import de.frajul.endlessroll.entities.particles.ParticleSource;
import de.frajul.endlessroll.entities.particles.ParticleSystem;
import de.frajul.endlessroll.main.game.Timer;
import de.frajul.endlessroll.sounds.SoundManager;
import de.frajul.endlessroll.sounds.SoundStream;
/**
* Created by Julian on 11.02.2016.
*/
public class Magnet extends Tool {
private SoundManager soundManager;
private ParticleSource particleSource;
private SoundStream soundStream;
public Magnet(Vector position, ParticleSystem particleSystem) {
public Magnet(Vector position, ParticleSystem particleSystem, SoundManager soundManager) {
super(ToolType.MAGNET, position, .24f, .24f, false, false);
this.soundManager = soundManager;
animation.setRequiredDelta(300);
animation.setIndexSequence(new int[]{1, 1, 0});
animation.setLooping(true);
super.setFloating(true);
particleSource = new ParticleSource(new Vector(position), particleSystem.magnet);
particleSource.start();
soundStream = soundManager.playSound(soundManager.magnetSound);
}
@Override
public void destroy(DestroyEffect destroyEffect) {
super.destroy(destroyEffect);
particleSource.kill();
soundManager.stopSound(soundStream);
}
public void updateSoundVolume(Player player) {
float distanceToPlayer = super.getPosition().vectorTo(player.getPosition()).length();
float factor = 1.0f / (distanceToPlayer * distanceToPlayer);
if (distanceToPlayer > 2 && player.getPosition().getX() > super.getPosition().getX()) {
soundManager.stopSound(soundStream);
return;
}
soundStream.setCurrentVolumeModifier(factor);
soundManager.onStreamVolumeChanged(soundStream);
}
@Override

View File

@ -5,6 +5,8 @@ import de.frajul.endlessroll.entities.DestroyEffect;
import de.frajul.endlessroll.entities.Player;
import de.frajul.endlessroll.entities.collision.geometry.Geometry;
import de.frajul.endlessroll.main.game.Timer;
import de.frajul.endlessroll.sounds.Sound;
import de.frajul.endlessroll.sounds.SoundManager;
/**
* Created by Julian on 02.10.2017.
@ -12,14 +14,18 @@ import de.frajul.endlessroll.main.game.Timer;
public class PowerMushroom extends Tool {
public PowerMushroom(Vector position) {
private SoundManager soundManager;
public PowerMushroom(Vector position, SoundManager soundManager) {
super(ToolType.POWER_MUSHROOM, position, .35f, .3f, true, true);
animation.disable();
this.soundManager = soundManager;
}
@Override
public void onPlayerCollision(Player player, Timer timer) {
player.startSuperPower((long) ToolType.POWER_MUSHROOM.getCurrentUpgradeValue(ToolUpgradeType.DURATION));
soundManager.playSound(soundManager.mushroomSound);
super.destroy(DestroyEffect.ENERGY_COLLECT);
}

View File

@ -5,6 +5,7 @@ import de.frajul.endlessroll.entities.Player;
import de.frajul.endlessroll.entities.collision.geometry.Geometry;
import de.frajul.endlessroll.entities.collision.geometry.Quad;
import de.frajul.endlessroll.main.game.Timer;
import de.frajul.endlessroll.sounds.SoundManager;
/**
* Created by Julian on 04.01.2016.
@ -12,11 +13,13 @@ import de.frajul.endlessroll.main.game.Timer;
public class Spring extends Tool {
private boolean hasYetCollided = false;
private SoundManager soundManager;
public Spring(Vector position) {
public Spring(Vector position, SoundManager soundManager) {
super(ToolType.SPRING, position, .3f, .35f, true, true);
animation.setIndexSequence(new int[]{1, 0, 0, 3, 3, 3, 1});
animation.setRequiredDelta(80);
this.soundManager = soundManager;
}
@Override
@ -29,6 +32,7 @@ public class Spring extends Tool {
public void onPlayerCollision(Player player, Timer timer) {
if (!hasYetCollided) {
hasYetCollided = true;
soundManager.playSound(soundManager.springSound);
player.clearAllForces();
player.getMovement().setY(0);

View File

@ -6,25 +6,30 @@ import de.frajul.endlessroll.entities.Player;
import de.frajul.endlessroll.entities.collision.geometry.Geometry;
import de.frajul.endlessroll.entities.particles.ParticleSource;
import de.frajul.endlessroll.entities.particles.ParticleSystem;
import de.frajul.endlessroll.main.game.GameScene;
import de.frajul.endlessroll.main.game.Timer;
import de.frajul.endlessroll.sounds.SoundManager;
import de.frajul.endlessroll.sounds.SoundStream;
/**
* Created by Julian on 11.02.2016.
*/
public class Stasis extends Tool {
private SoundManager soundManager;
private ParticleSource particleSource;
private boolean firstCollision = true;
private final static float Y_SLOW_FACTOR = .4f; //Final .2f
private final static float X_SLOW_FACTOR = .9f; //Final .8f
private float forceValue;
public Stasis(Vector position, ParticleSystem particleSystem) {
private SoundStream soundStream;
public Stasis(Vector position, ParticleSystem particleSystem, SoundManager soundManager) {
super(ToolType.STASIS, position,
.7f * ToolType.STASIS.getCurrentUpgradeValue(ToolUpgradeType.SIZE) / 100,
.7f * ToolType.STASIS.getCurrentUpgradeValue(ToolUpgradeType.SIZE) / 100, false,
false);
this.soundManager = soundManager;
animation.setLooping(true);
animation.setRequiredDelta(300);
animation.setIndexSequence(new int[]{1, 1, 2, 3, 2, 4, 4, 3, 2, 2, 3, 3});
@ -33,12 +38,31 @@ public class Stasis extends Tool {
particleSource.setSpawnSize(new Vector(super.width, super.height));
particleSource.start();
forceValue = ToolType.STASIS.getCurrentUpgradeValue(ToolUpgradeType.FORCE);
soundStream = soundManager.playSound(soundManager.stasisSound);
}
public void updateSoundVolume(Player player) {
float distanceToPlayer = super.getPosition().getX() - player.getPosition().getX();
boolean playerInXRange = (player.getRightEdge() >= super.getLeftEdge() && player
.getRightEdge() <= super.getRightEdge()) || (player.getLeftEdge() >= super
.getLeftEdge() && player.getLeftEdge() <= super.getRightEdge());
float factor = 1.0f;
if (!playerInXRange) {
factor = 1.0f / (distanceToPlayer * distanceToPlayer);
if (distanceToPlayer < -2) {
soundManager.stopSound(soundStream);
return;
}
}
soundStream.setCurrentVolumeModifier(factor);
soundManager.onStreamVolumeChanged(soundStream);
}
@Override
public void destroy(DestroyEffect destroyEffect) {
super.destroy(destroyEffect);
particleSource.kill();
soundManager.stopSound(soundStream);
}
@Override

View File

@ -11,32 +11,33 @@ import de.frajul.endlessroll.data.Vector;
import de.frajul.endlessroll.entities.particles.ParticleSystem;
import de.frajul.endlessroll.entities.textures.Texture;
import de.frajul.endlessroll.entities.textures.TexturePack;
import de.frajul.endlessroll.sounds.Sound;
import de.frajul.endlessroll.sounds.SoundManager;
public enum ToolType {
//Check newInstance when new Tool is added!
RAMP(R.string.tool_name_ramp, R.string.tool_description_ramp, R.drawable.tools_ramp,
R.drawable.tools_ramp_button, R.raw.ramp, 0, 1, 5,
R.drawable.tools_ramp_button, 0, 1, 5,
new ToolUpgrade(ToolUpgradeType.COOLDOWN, 3000, 1000)),
SPRING(R.string.tool_name_spring, R.string.tool_description_spring, R.drawable.tools_spring,
R.drawable.tools_spring_button, R.raw.ramp, 5, 2, 5,
R.drawable.tools_spring_button, 5, 2, 5,
new ToolUpgrade(ToolUpgradeType.COOLDOWN, 4000, 2000)),
BOMB(R.string.tool_name_bomb, R.string.tool_description_bomb, R.drawable.tools_bomb,
R.drawable.tools_bomb_button, R.raw.ramp, 12, 4, 5,
R.drawable.tools_bomb_button, 12, 4, 5,
new ToolUpgrade(ToolUpgradeType.COOLDOWN, 6000, 4000),
new ToolUpgrade(ToolUpgradeType.DURATION, 1200, 400),
new ToolUpgrade(ToolUpgradeType.RANGE, 100, 200)),
MAGNET(R.string.tool_name_magnet, R.string.tool_description_magnet, R.drawable.tools_magnet,
R.drawable.tools_magnet_button, R.raw.ramp, 10, 2, 5,
R.drawable.tools_magnet_button, 10, 2, 5,
new ToolUpgrade(ToolUpgradeType.COOLDOWN, 5000, 3000),
new ToolUpgrade(ToolUpgradeType.FORCE, 100, 500)),
POWER_MUSHROOM(R.string.tool_name_power_mushroom, R.string.tool_description_power_mushroom,
R.drawable.tools_power_mushroom, R.drawable.tools_power_mushroom_button, R.raw.ramp, 5,
R.drawable.tools_power_mushroom, R.drawable.tools_power_mushroom_button, 5,
5, 7, new ToolUpgrade(ToolUpgradeType.COOLDOWN, 15000, 11000),
new ToolUpgrade(ToolUpgradeType.DURATION, 5000, 10000)),
STASIS(R.string.tool_name_stasis, R.string.tool_description_stasis, R.drawable.tools_stasis,
R.drawable.tools_stasis_button, R.raw.ramp, 15, 4, 6,
R.drawable.tools_stasis_button, 15, 4, 6,
new ToolUpgrade(ToolUpgradeType.COOLDOWN, 6000, 4000),
new ToolUpgrade(ToolUpgradeType.FORCE, 1, 2),
new ToolUpgrade(ToolUpgradeType.SIZE, 100, 200));
@ -47,23 +48,20 @@ public enum ToolType {
private final int description;
private final int toolTextureId;
private final int buttonDrawable;
private final int placingSoundId;
private final int buyPrice;
private final int upgradePrice;
private final int maxUpgradeLevel;
private final List<ToolUpgrade> upgrades;
private Texture toolTexture = null;
private int placingSound = -1;
private boolean bought;
private int currentUpgradeLevel = 1;
ToolType(@StringRes int name, @StringRes int description, int toolTextureId, int buttonDrawable, int placingSoundId, int buyPrice, int upgradePrice, int maxUpgradeLevel, ToolUpgrade... upgrades) {
ToolType(@StringRes int name, @StringRes int description, int toolTextureId, int buttonDrawable, int buyPrice, int upgradePrice, int maxUpgradeLevel, ToolUpgrade... upgrades) {
this.name = name;
this.description = description;
this.toolTextureId = toolTextureId;
this.buttonDrawable = buttonDrawable;
this.placingSoundId = placingSoundId;
this.buyPrice = buyPrice;
this.upgradePrice = upgradePrice;
this.maxUpgradeLevel = maxUpgradeLevel;
@ -71,26 +69,26 @@ public enum ToolType {
}
@Nullable
public Tool newInstance(Vector position, ParticleSystem particleSystem) {
public Tool newInstance(Vector position, ParticleSystem particleSystem, SoundManager soundManager) {
Tool tool = null;
switch (this) {
case RAMP:
tool = new Ramp(position);
break;
case SPRING:
tool = new Spring(position);
tool = new Spring(position, soundManager);
break;
case MAGNET:
tool = new Magnet(position, particleSystem);
tool = new Magnet(position, particleSystem, soundManager);
break;
case BOMB:
tool = new Bomb(position);
break;
case POWER_MUSHROOM:
tool = new PowerMushroom(position);
tool = new PowerMushroom(position, soundManager);
break;
case STASIS:
tool = new Stasis(position,particleSystem);
tool = new Stasis(position, particleSystem, soundManager);
break;
}
if (tool != null && tool.isPlacedByRightEdge())
@ -98,22 +96,11 @@ public enum ToolType {
return tool;
}
public static void loadAllPlacingSounds(SoundManager soundManager) {
for (ToolType type : values())
type.loadPlacingSound(soundManager);
}
public static void loadAllToolTextures(TexturePack texturePack) {
for (ToolType type : values())
type.loadToolTexture(texturePack);
}
private void loadPlacingSound(SoundManager soundManager) {
if (placingSoundId == -1)
return;
placingSound = soundManager.loadSound(placingSoundId);
}
private void loadToolTexture(TexturePack texturePack) {
if (toolTextureId == -1)
return;
@ -131,10 +118,6 @@ public enum ToolType {
return buttonDrawable;
}
public int getPlacingSound() {
return placingSound;
}
@StringRes
public int getName() {
return name;

View File

@ -16,7 +16,8 @@ import de.frajul.endlessroll.user.User;
public class DataStorageHandler {
private final String PREFERENCES_NAME = "GamePreferences";
private final String SOUND_ON = "Sound";
private final String SOUNDS_MUTED = "SoundsMuted";
private final String MUSIC_MUTED = "MusicMuted";
private final String USER_EP = "EP";
private final String USER_LEVEL = "Level";
private final String USER_STARS = "Stars";
@ -37,13 +38,23 @@ public class DataStorageHandler {
database = new MyDatabase(activity);
}
public boolean readIsSoundOn() {
return preferences.getBoolean(SOUND_ON, false);
public boolean readIsSoundsMuted() {
return preferences.getBoolean(SOUNDS_MUTED, false);
}
public void writeSoundOn(boolean soundOn) {
public void writeSoundsMuted(boolean soundsMuted) {
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean(SOUND_ON, soundOn);
editor.putBoolean(SOUNDS_MUTED, soundsMuted);
editor.apply();
}
public boolean readIsMusicMuted() {
return preferences.getBoolean(MUSIC_MUTED, false);
}
public void writeMusicMuted(boolean musicMuted) {
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean(MUSIC_MUTED, musicMuted);
editor.apply();
}

View File

@ -91,7 +91,8 @@ public class GameActivity extends Activity implements ExceptionHandler, User.LvU
user = dataStorageHandler.readUserData(this);
soundManager = new SoundManager(this);
soundManager.setSoundOn(dataStorageHandler.readIsSoundOn());
soundManager.setSoundsMuted(dataStorageHandler.readIsSoundsMuted());
soundManager.setMusicMuted(dataStorageHandler.readIsMusicMuted());
levelManager = new LevelManager(this, dataStorageHandler);
tutorialManager = new TutorialManager(this);
@ -138,7 +139,7 @@ public class GameActivity extends Activity implements ExceptionHandler, User.LvU
}
public void flipToScreen(final Screen.ScreenType screen) {
if (screen != Screen.ScreenType.NONE) {
if (screen != Screen.ScreenType.NONE && flipper.getCurrentScreen().getType() != screen) {
runOnUiThread(new Runnable() {
@Override
public void run() {
@ -271,7 +272,7 @@ public class GameActivity extends Activity implements ExceptionHandler, User.LvU
glSurfaceView.onPause();
if (flipper.getCurrentScreen() == gameScreen)
gameScreen.onPause();
soundManager.pause();
soundManager.activityPause();
super.onPause();
}
@ -279,7 +280,7 @@ public class GameActivity extends Activity implements ExceptionHandler, User.LvU
protected void onResume() {
GameLog.d("OnResume");
glSurfaceView.onResume();
soundManager.resume();
soundManager.activityResume();
super.onResume();
}
@ -288,7 +289,6 @@ public class GameActivity extends Activity implements ExceptionHandler, User.LvU
GameLog.d("OnDestroy");
soundManager.destroy();
dataStorageHandler.writeSoundOn(soundManager.isSoundOn());
super.onDestroy();
}

View File

@ -68,7 +68,7 @@ public class Game extends Rendering<GameScene> {
this.timer = timer;
try {
if (isFirstTime) {
scene = new GameScene(texturePack, particleSystem);
scene = new GameScene(gameActivity, texturePack, particleSystem);
firework = new Firework(particleSystem.firework, scene.getCamera());
if (level != null)
startGame(levelPack, level);
@ -88,6 +88,7 @@ public class Game extends Rendering<GameScene> {
this.level = level;
this.levelPack = levelPack;
if (scene != null) {
gameActivity.getSoundManager().gameMusic.reset();
gameState = GameState.COUNTDOWN;
gameActivity.getTutorialManager().resetGameTutorials();
collectedStars.clear();
@ -106,8 +107,8 @@ public class Game extends Rendering<GameScene> {
}
public void countdownFinished() {
GameLog.i("Start music");
gameActivity.getSoundManager().setCurrentMusic(gameActivity.getSoundManager().gameMusic);
gameActivity.getSoundManager().resumeAllSounds();
gameActivity.getSoundManager().gameMusic.start();
gameState = GameState.RUNNING;
}
@ -205,6 +206,7 @@ public class Game extends Rendering<GameScene> {
public void tryToPause() {
if (gameState == GameState.GAME_OVER || gameState == GameState.LEVEL_FINISHED || gameState == GameState.PAUSED)
return;
gameActivity.getSoundManager().pauseAllSounds();
gameActivity.getSoundManager().gameMusic.pause();
viewManager.showShortMenu();
if (gameState == GameState.COUNTDOWN)
@ -222,7 +224,7 @@ public class Game extends Rendering<GameScene> {
private void addTool(float x, float y) {
try {
gameActivity.getSoundManager().playSound(currentTool.getPlacingSound());
gameActivity.getSoundManager().playSound(gameActivity.getSoundManager().placeToolSound);
scene.addTool(currentTool, x, y, physics);
} catch (Exception e) {
onException(e);
@ -230,8 +232,9 @@ public class Game extends Rendering<GameScene> {
}
public void onGameOver(boolean playerExplode) {
gameActivity.getSoundManager().gameMusic.pause();
//TODO: Die sound
gameActivity.getSoundManager().gameMusic.stop();
gameActivity.getSoundManager().stopAllSounds();
gameActivity.getSoundManager().playSound(gameActivity.getSoundManager().dieSound);
if (playerExplode) {
scene.getUncategorizedEntities().remove(player);
DestroyEffect.EXPLOSION.createEffect(particleSystem, player.getPosition(),
@ -242,8 +245,9 @@ public class Game extends Rendering<GameScene> {
}
private void onGoalReached() {
gameActivity.getSoundManager().gameMusic.pause();
//TODO: Goal + firework sound
gameActivity.getSoundManager().gameMusic.stop();
gameActivity.getSoundManager().stopAllSounds();
gameActivity.getSoundManager().playSound(gameActivity.getSoundManager().goalSound);
gameState = GameState.LEVEL_FINISHED;
if (!level.isFinished())
@ -263,6 +267,7 @@ public class Game extends Rendering<GameScene> {
}
firework.start();
gameActivity.getSoundManager().playSound(gameActivity.getSoundManager().fireworkSound);
//viewManager.showGameOverMessage(levelPack.isLastLevel(level), MessageType.WIN);
//TODO: fadeInWithDelay something
@ -290,13 +295,21 @@ public class Game extends Rendering<GameScene> {
}
public void onStarCollision(Star star) {
scene.onStarCollision(star);
collectedStars.add(star.getIndex());
if (!star.isDestroyed()) {
scene.onStarCollision(star);
gameActivity.getSoundManager()
.playSound(gameActivity.getSoundManager().collectStarSound);
collectedStars.add(star.getIndex());
}
}
public void onEnergyCollision(Energy energy) {
scene.onEnergyCollision(energy);
energyCollected = true;
if (!energy.isDestroyed()) {
scene.onEnergyCollision(energy);
gameActivity.getSoundManager()
.playSound(gameActivity.getSoundManager().collectEnergySound);
energyCollected = true;
}
}
@Override

View File

@ -12,12 +12,14 @@ import de.frajul.endlessroll.entities.particles.ParticleSystem;
import de.frajul.endlessroll.entities.shapes.PlayerShape;
import de.frajul.endlessroll.entities.textures.TexturePack;
import de.frajul.endlessroll.entities.tools.Bomb;
import de.frajul.endlessroll.entities.tools.Magnet;
import de.frajul.endlessroll.entities.tools.Stasis;
import de.frajul.endlessroll.entities.tools.Tool;
import de.frajul.endlessroll.entities.tools.ToolType;
import de.frajul.endlessroll.levels.Level;
import de.frajul.endlessroll.levels.ObstacleData;
import de.frajul.endlessroll.levels.worlds.World;
import de.frajul.endlessroll.main.GameActivity;
import de.frajul.endlessroll.main.GameLog;
import de.frajul.endlessroll.main.physics.Physics;
@ -26,13 +28,15 @@ import de.frajul.endlessroll.main.physics.Physics;
*/
public class GameScene extends Scene {
private GameActivity gameActivity;
private World currentWorld;
private CollisionDetector collisionDetector;
private Goal goal;
private float goalX;
public GameScene(TexturePack texturePack, ParticleSystem particleSystem) throws Exception {
super(texturePack, particleSystem);
public GameScene(GameActivity gameActivity, TexturePack texturePack, ParticleSystem particleSystem) throws Exception {
super(gameActivity, texturePack, particleSystem);
this.gameActivity = gameActivity;
collisionDetector = new CollisionDetector();
goal = new Goal(textures.goal);
@ -45,8 +49,8 @@ public class GameScene extends Scene {
terrain.loadData(world, level.getTerrainEdge(), level.getTerrainTiles());
ceiling.loadData(world, level.getCeilingEdge(), level.getCeilingTiles());
uncategorizedEntities.add(goal);
player.init(playerShape, terrain.getEdge(), level.getStartSpeed(),
level.getEndSpeed(), particleSystem);
player.init(playerShape, terrain.getEdge(), level.getStartSpeed(), level.getEndSpeed(),
particleSystem);
uncategorizedEntities.add(player);
collectables.init(level, textures);
for (ObstacleData data : level.getObstacles())
@ -55,10 +59,10 @@ public class GameScene extends Scene {
goalX = level.getGoalX();
goal.setGoalX(goalX);
if(world == World.ICY_MOUNTAINS){
if (world == World.ICY_MOUNTAINS) {
enviromentParticles = new ParticleSource(new Vector(), particleSystem.snow);
enviromentParticles.start();
}else if(enviromentParticles != null){
} else if (enviromentParticles != null) {
enviromentParticles.kill();
}
GameLog.d("Level " + level.getId() + " successfully loaded");
@ -79,7 +83,7 @@ public class GameScene extends Scene {
public void addTool(ToolType type, float screenX, float screenY, Physics physics) throws Exception {
Vector position = calcWorldFromScreenCoords(screenX, screenY);
Tool tool = type.newInstance(position, particleSystem);
Tool tool = type.newInstance(position, particleSystem, gameActivity.getSoundManager());
physics.checkSingleToolCollision(tool, this);
if (tool == null)
@ -123,6 +127,13 @@ public class GameScene extends Scene {
if (bomb.isExploding())
bomb.explode(obstacles, collisionDetector);
}
else if (tool instanceof Stasis) {
Stasis stasis = (Stasis) tool;
stasis.updateSoundVolume(player);
} else if(tool instanceof Magnet){
Magnet magnet = (Magnet) tool;
magnet.updateSoundVolume(player);
}
}
}

View File

@ -8,6 +8,7 @@ import java.util.List;
import de.frajul.endlessroll.data.Vector;
import de.frajul.endlessroll.entities.AnimatedEntity;
import de.frajul.endlessroll.entities.Background;
import de.frajul.endlessroll.entities.DestroyEffect;
import de.frajul.endlessroll.entities.Entity;
import de.frajul.endlessroll.entities.Obstacle;
import de.frajul.endlessroll.entities.Player;
@ -19,6 +20,7 @@ import de.frajul.endlessroll.entities.tileLists.Ceiling;
import de.frajul.endlessroll.entities.tileLists.Terrain;
import de.frajul.endlessroll.entities.tools.Tool;
import de.frajul.endlessroll.levels.worlds.World;
import de.frajul.endlessroll.main.GameActivity;
/**
* Created by Julian on 20.07.2016.
@ -28,6 +30,8 @@ public abstract class Scene {
//Not sure if needed, this why set on very high value
private final float MAX_Y_MOVEMENT = -1f;
private GameActivity gameActivity;
protected Camera camera;
private Vector screenSize;
private Entity playerArrow;
@ -46,7 +50,8 @@ public abstract class Scene {
protected List<Tool> tools = Collections.synchronizedList(new ArrayList<Tool>());
protected Collectables collectables = new Collectables();
public Scene(TexturePack texturePack, ParticleSystem particleSystem) {
public Scene(GameActivity gameActivity, TexturePack texturePack, ParticleSystem particleSystem) {
this.gameActivity = gameActivity;
this.particleSystem = particleSystem;
setTexturePack(texturePack);
camera = new Camera();
@ -120,9 +125,14 @@ public abstract class Scene {
moveEnviroment(finalMovement.x);
}
if (entity.isDestroyed() && entity.getDestroyEffect() != null)
if (entity.isDestroyed() && entity.getDestroyEffect() != null) {
if (entity.getDestroyEffect() == DestroyEffect.EXPLOSION) {
gameActivity.getSoundManager()
.playSound(gameActivity.getSoundManager().explosionSound);
}
entity.getDestroyEffect().createEffect(particleSystem, new Vector(entity.getPosition()),
new Vector(entity.getWidth(), entity.getHeight())).start();
}
if (entity.getRightEdge() - camera.getX() < -3f || entity.isDestroyed()) {
return true;
}

View File

@ -8,6 +8,7 @@ import de.frajul.endlessroll.entities.particles.ParticleSystem;
import de.frajul.endlessroll.entities.shapes.PlayerShape;
import de.frajul.endlessroll.entities.textures.TexturePack;
import de.frajul.endlessroll.levels.worlds.World;
import de.frajul.endlessroll.main.GameActivity;
public class StartScene extends Scene {
@ -15,8 +16,8 @@ public class StartScene extends Scene {
private Random random;
private World currentWorld = World.GRASSLANDS;
public StartScene(TexturePack texturePack, ParticleSystem particleSystem) {
super(texturePack, particleSystem);
public StartScene(GameActivity gameActivity, TexturePack texturePack, ParticleSystem particleSystem) {
super(gameActivity, texturePack, particleSystem);
player.init(PlayerShape.BALL, TERRAIN_EDGE, 0.5f, 0.5f, null);
uncategorizedEntities.add(player);

View File

@ -10,11 +10,12 @@ import de.frajul.endlessroll.entities.particles.ParticleSystem;
import de.frajul.endlessroll.entities.textures.TexturePack;
import de.frajul.endlessroll.levels.ObstacleData;
import de.frajul.endlessroll.levels.worlds.World;
import de.frajul.endlessroll.main.GameActivity;
public class TestScreenScene extends Scene {
public TestScreenScene(TexturePack texturePack, ParticleSystem particleSystem) {
super(texturePack, particleSystem);
public TestScreenScene(GameActivity gameActivity, TexturePack texturePack, ParticleSystem particleSystem) {
super(gameActivity, texturePack, particleSystem);
terrain.createEndless(World.ICY_MOUNTAINS, -1.0f);
background.changeTexture(World.ICY_MOUNTAINS.getBackgroundTexture());
new ParticleSource(new Vector(0, 0.0f), particleSystem.colorChange).start();

View File

@ -24,7 +24,7 @@ public class GLTestScreen extends GLScreen<RelativeLayout> {
@Override
public void prepareToBeShown() {
gameActivity.getSoundManager().setCurrentMusic(gameActivity.getSoundManager().menuMusic);
gameActivity.getSoundManager().menuMusic.start();
glView.setCurrentRendering(rendering);
}

View File

@ -29,8 +29,7 @@ public class GameScreen extends GLScreen<RelativeLayout> {
@Override
public void prepareToBeShown() {
gameActivity.getSoundManager().setCurrentMusic(null);
gameActivity.getSoundManager().menuMusic.reset();
gameActivity.getSoundManager().menuMusic.stop();
glView.setCurrentRendering(game);
game.getViewManager().prepareToBeShown();

View File

@ -62,7 +62,7 @@ public class LevelsScreen extends Screen<LinearLayout> implements LevelButtonOnC
@Override
public void prepareToBeShown() {
gameActivity.getSoundManager().setCurrentMusic(gameActivity.getSoundManager().menuMusic);
gameActivity.getSoundManager().menuMusic.start();
topBar.update();
build();

View File

@ -63,7 +63,7 @@ public class PlayerShapeShopScreen extends Screen<RelativeLayout> implements Pla
@Override
public void prepareToBeShown() {
gameActivity.getSoundManager().setCurrentMusic(gameActivity.getSoundManager().menuMusic);
gameActivity.getSoundManager().menuMusic.start();
createViews();
topBar.update();

View File

@ -19,6 +19,7 @@ public class SettingsScreen extends Screen<LinearLayout> implements View.OnClick
private final int CALL_ID_CONFIRM_RESET = 1;
private TopBar topBar;
private ToggleButton musicToggle;
private ToggleButton soundToggle;
private Button resetButton;
private boolean resetPressed = false;
@ -28,6 +29,8 @@ public class SettingsScreen extends Screen<LinearLayout> implements View.OnClick
public SettingsScreen(GameActivity gameActivity) {
super(ScreenType.SETTINGS, gameActivity, R.layout.settings);
topBar = super.createTopBar(R.id.settings_topbar);
musicToggle = (ToggleButton) layout.findViewById(R.id.settings_musictoggle);
musicToggle.setOnClickListener(this);
soundToggle = (ToggleButton) layout.findViewById(R.id.settings_soundtoggle);
soundToggle.setOnClickListener(this);
resetButton = (Button) layout.findViewById(R.id.settings_reset);
@ -38,16 +41,21 @@ public class SettingsScreen extends Screen<LinearLayout> implements View.OnClick
@Override
public void prepareToBeShown() {
gameActivity.getSoundManager().setCurrentMusic(gameActivity.getSoundManager().menuMusic);
gameActivity.getSoundManager().menuMusic.start();
topBar.update();
soundToggle.setChecked(gameActivity.getSoundManager().isSoundOn());
musicToggle.setChecked(!gameActivity.getSoundManager().isMusicMuted());
soundToggle.setChecked(!gameActivity.getSoundManager().isSoundsMuted());
resetButton.setEnabled(super.caller != ScreenType.GAME);
resetPressed = false;
}
@Override
public void onBackKeyDown() {
gameActivity.getDataStorageHandler()
.writeSoundsMuted(gameActivity.getSoundManager().isSoundsMuted());
gameActivity.getDataStorageHandler()
.writeMusicMuted(gameActivity.getSoundManager().isMusicMuted());
//ResetButton is disabled if caller is GAME, because shortMenu or GoalMessage would still be visible on next level start
if (resetPressed && (super.caller == ScreenType.LEVELS || super.caller == ScreenType.GAME)) {
super.caller = ScreenType.WORLDS;
@ -57,8 +65,10 @@ public class SettingsScreen extends Screen<LinearLayout> implements View.OnClick
@Override
public void onClick(View v) {
if (v.equals(soundToggle)) {
gameActivity.getSoundManager().setSoundOn(soundToggle.isChecked());
if (v.equals(musicToggle)) {
gameActivity.getSoundManager().setMusicMuted(!musicToggle.isChecked());
} else if (v.equals(soundToggle)) {
gameActivity.getSoundManager().setSoundsMuted(!soundToggle.isChecked());
} else if (v.equals(resetButton)) {
resetConfirmDialog.show(CALL_ID_CONFIRM_RESET, R.string.confirm_dialog_reset);
}

View File

@ -61,7 +61,7 @@ public class StartScreen extends GLScreen<RelativeLayout> implements View.OnClic
@Override
public void prepareToBeShown() {
gameActivity.getSoundManager().setCurrentMusic(gameActivity.getSoundManager().menuMusic);
gameActivity.getSoundManager().menuMusic.start();
glView.setCurrentRendering(rendering);
((StartScene) rendering.getScene()).randomizeWorld();

View File

@ -16,11 +16,13 @@ import de.frajul.endlessroll.rendering.Rendering;
*/
public class StartScreenRendering extends Rendering<StartScene> {
private GameActivity gameActivity;
private Timer timer;
private ParticleSystem particleSystem;
public StartScreenRendering(GameActivity gameActivity) throws Exception {
super(gameActivity);
this.gameActivity = gameActivity;
this.particleSystem = new ParticleSystem(gameActivity);
}
@ -29,7 +31,7 @@ public class StartScreenRendering extends Rendering<StartScene> {
GameLog.d("init Start Screen Rendering");
this.timer = timer;
if (isFirstTime)
scene = new StartScene(texturePack, particleSystem);
scene = new StartScene(gameActivity, texturePack, particleSystem);
else {
scene.setTexturePack(texturePack);
}

View File

@ -17,11 +17,13 @@ import de.frajul.endlessroll.rendering.Rendering;
*/
public class TestScreenRendering extends Rendering<TestScreenScene> {
private GameActivity gameActivity;
private Timer timer;
private ParticleSystem particleSystem;
public TestScreenRendering(GameActivity gameActivity) throws Exception{
super(gameActivity);
this.gameActivity = gameActivity;
particleSystem = new ParticleSystem(gameActivity);
}
@ -30,7 +32,7 @@ public class TestScreenRendering extends Rendering<TestScreenScene> {
this.timer = timer;
try {
if (isFirstTime)
scene = new TestScreenScene(texturePack, particleSystem);
scene = new TestScreenScene(gameActivity, texturePack, particleSystem);
else
scene.setTexturePack(texturePack);
}catch (Exception e){

View File

@ -87,7 +87,7 @@ public class ToolShopScreen extends Screen<RelativeLayout> implements View.OnCli
@Override
public void prepareToBeShown() {
gameActivity.getSoundManager().setCurrentMusic(gameActivity.getSoundManager().menuMusic);
gameActivity.getSoundManager().menuMusic.start();
topBar.update();
slotSettings.unlockSlotsIfLevelReached(gameActivity.getUser().getLevelUpBounties());

View File

@ -42,7 +42,7 @@ public class WorldsScreen extends Screen<RelativeLayout> implements WorldButtonO
@Override
public void prepareToBeShown() {
gameActivity.getSoundManager().setCurrentMusic(gameActivity.getSoundManager().menuMusic);
gameActivity.getSoundManager().menuMusic.start();
topBar.update();
for (WorldButton button : worldButtons)

View File

@ -12,64 +12,57 @@ public class Music {
private ExceptionHandler handler;
private MediaPlayer player;
private boolean mute;
private boolean paused = true;
private int pausedPosition;
private boolean started;
private boolean muted;
private boolean paused;
private boolean activityPaused;
public Music(ExceptionHandler handler, Context context, int id) {
this.handler = handler;
player = MediaPlayer.create(context, id);
}
public void setMute(boolean mute) {
this.mute = mute;
if (mute && !paused) {
stop();
paused = false;
}
if (!mute && !paused)
start();
}
public void pause() {
try {
if (!paused) {
player.pause();
paused = true;
pausedPosition = player.getCurrentPosition();
}
} catch (Exception e) {
handler.onException(e);
}
}
public void start() {
try {
if (!mute)
player.start();
paused = false;
} catch (Exception e) {
handler.onException(e);
}
started = true;
paused = false;
onStateChanged();
}
public void stop() {
try {
if (!paused)
player.pause();
player.seekTo(0);
paused = true;
} catch (Exception e) {
handler.onException(e);
}
started = false;
onStateChanged();
reset();
}
public void setMuted(boolean muted) {
this.muted = muted;
onStateChanged();
}
public void resume() {
public void pause() {
paused = true;
onStateChanged();
}
public void activityPause() {
activityPaused = true;
onStateChanged();
}
public void activityResume() {
activityPaused = false;
onStateChanged();
}
private void onStateChanged() {
try {
if (paused) {
player.seekTo(pausedPosition);
start();
boolean newState = started && !muted && !paused && !activityPaused;
if (player.isPlaying()) {
if (!newState)
player.pause();
} else {
if (newState)
player.start();
}
} catch (Exception e) {
handler.onException(e);

View File

@ -0,0 +1,55 @@
package de.frajul.endlessroll.sounds;
/**
* Created by Julian on 17.01.2018.
*/
public class Sound {
private int soundId;
private float volume;
private boolean looping;
public Sound(int soundId) {
this(soundId, 1.0f);
}
public Sound(int soundId, float volume) {
this(soundId, volume, false);
}
public Sound(int soundId, boolean looping) {
this(soundId, 1.0f, looping);
}
public Sound(int soundId, float volume, boolean looping) {
this.soundId = soundId;
this.volume = volume;
this.looping = looping;
}
public int getSoundId() {
return soundId;
}
public void setSoundId(int soundId) {
this.soundId = soundId;
}
public float getVolume() {
return volume;
}
public void setVolume(float volume) {
this.volume = volume;
}
public boolean isLooping() {
return looping;
}
public void setLooping(boolean looping) {
this.looping = looping;
}
}

View File

@ -4,8 +4,10 @@ import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;
import java.util.ArrayList;
import java.util.List;
import de.frajul.endlessroll.R;
import de.frajul.endlessroll.entities.tools.ToolType;
import de.frajul.endlessroll.main.GameActivity;
import de.frajul.endlessroll.main.GameLog;
@ -16,52 +18,93 @@ public class SoundManager {
private Context context;
private SoundPool soundPool;
private boolean soundOn;
private boolean soundsMuted;
private boolean musicMuted;
public final Music menuMusic;
public final Music gameMusic;
private Music currentMusic;
public final Sound goalSound;
public final Sound dieSound;
public final Sound collectStarSound;
public final Sound collectEnergySound;
public final Sound countdownSound;
public final Sound explosionSound;
public final Sound fireworkSound;
public final Sound stasisSound;
public final Sound mushroomSound;
public final Sound springSound;
public final Sound placeToolSound;
public final Sound magnetSound;
private List<SoundStream> allStartedStreams = new ArrayList<>();
public SoundManager(GameActivity activity) {
this.context = activity;
soundPool = new SoundPool(2, AudioManager.STREAM_MUSIC, 0);
soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
menuMusic = new Music(activity, activity, R.raw.music_menu);
menuMusic.getPlayer().setLooping(true);
gameMusic = new Music(activity, context, R.raw.music_game);
gameMusic.getPlayer().setLooping(true);
ToolType.loadAllPlacingSounds(this);
goalSound = new Sound(loadSound(R.raw.sound_goal));
dieSound = new Sound(loadSound(R.raw.sound_die));
collectStarSound = new Sound(loadSound(R.raw.sound_collect_star), .7f);
collectEnergySound = new Sound(loadSound(R.raw.sound_collect_energy));
countdownSound = new Sound(loadSound(R.raw.sound_countdown));
explosionSound = new Sound(loadSound(R.raw.sound_explosion), 2);
fireworkSound = new Sound(loadSound(R.raw.sound_firework));
stasisSound = new Sound(loadSound(R.raw.sound_stasis), 1.3f, true);
mushroomSound = new Sound(loadSound(R.raw.sound_mushroom));
springSound = new Sound(loadSound(R.raw.sound_spring), 1.5f);
placeToolSound = new Sound(loadSound(R.raw.sound_place_tool), 1.5f);
magnetSound = new Sound(loadSound(R.raw.sound_magnet), 1.2f, true);
}
public void setCurrentMusic(Music music) {
if (currentMusic != null && !currentMusic.equals(music)) {
currentMusic.pause();
public void setSoundsMuted(boolean soundsMuted) {
this.soundsMuted = soundsMuted;
for (SoundStream stream : allStartedStreams) {
float systemVolume = getSystemVolume();
soundPool.setVolume(stream.getId(), systemVolume * stream.getModifiedVolume(),
systemVolume * stream.getModifiedVolume());
}
this.currentMusic = music;
if (music != null)
currentMusic.start();
}
public void setSoundOn(boolean on) {
this.soundOn = on;
menuMusic.setMute(!on);
gameMusic.setMute(!on);
public void setMusicMuted(boolean musicMuted) {
this.musicMuted = musicMuted;
menuMusic.setMuted(musicMuted);
gameMusic.setMuted(musicMuted);
}
public boolean isSoundOn() {
return soundOn;
public boolean isSoundsMuted() {
return soundsMuted;
}
public void pause() {
public boolean isMusicMuted() {
return musicMuted;
}
public void activityPause() {
soundPool.autoPause();
if (currentMusic != null)
currentMusic.pause();
gameMusic.activityPause();
menuMusic.activityPause();
}
public void resume() {
public void activityResume() {
soundPool.autoResume();
if (currentMusic != null)
currentMusic.resume();
gameMusic.activityResume();
menuMusic.activityResume();
}
public void pauseAllSounds() {
for (SoundStream stream : allStartedStreams)
soundPool.pause(stream.getId());
}
public void resumeAllSounds() {
for (SoundStream stream : allStartedStreams)
soundPool.resume(stream.getId());
}
public void destroy() {
@ -75,21 +118,43 @@ public class SoundManager {
return sound;
}
public void playSound(int id) {
float volume = getVolume();
int feedback = soundPool.play(id, volume, volume, 1, 0, 1);
if (feedback == 0)
GameLog.e("SoundId: " + id + " cannot be played");
public SoundStream playSound(Sound sound) {
float systemVolume = getSystemVolume();
int streamId = soundPool.play(sound.getSoundId(), systemVolume * sound.getVolume(),
systemVolume * sound.getVolume(), 1, sound.isLooping() ? -1 : 0, 1);
if (streamId == 0)
GameLog.e("SoundId: " + sound.getSoundId() + " cannot be played");
SoundStream soundStream = new SoundStream(streamId, sound.getVolume());
allStartedStreams.add(soundStream);
return soundStream;
}
private float getVolume() {
if (soundOn) {
AudioManager manager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
float volume = manager.getStreamVolume(AudioManager.STREAM_MUSIC);
float maxVolume = manager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
return volume / maxVolume;
public void onStreamVolumeChanged(SoundStream stream) {
if (!soundsMuted) {
float systemVolume = getSystemVolume();
soundPool.setVolume(stream.getId(), systemVolume * stream.getModifiedVolume(),
systemVolume * stream.getModifiedVolume());
}
return 0;
}
public void stopSound(SoundStream stream) {
allStartedStreams.remove(stream);
soundPool.stop(stream.getId());
}
public void stopAllSounds() {
for (SoundStream stream : allStartedStreams)
soundPool.stop(stream.getId());
allStartedStreams.clear();
}
private float getSystemVolume() {
if (soundsMuted)
return 0;
AudioManager manager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
float volume = manager.getStreamVolume(AudioManager.STREAM_MUSIC);
float maxVolume = manager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
return volume / maxVolume;
}
}

View File

@ -0,0 +1,37 @@
package de.frajul.endlessroll.sounds;
/**
* Created by Julian on 19.01.2018.
*/
public class SoundStream {
private int id;
private float soundVolume;
private float currentVolumeModifier;
public SoundStream(int id, float soundVolume) {
this.id = id;
this.soundVolume = soundVolume;
}
public float getModifiedVolume() {
return soundVolume * currentVolumeModifier;
}
public int getId() {
return id;
}
public float getSoundVolume() {
return soundVolume;
}
public float getCurrentVolumeModifier() {
return currentVolumeModifier;
}
public void setCurrentVolumeModifier(float currentVolumeModifier) {
this.currentVolumeModifier = currentVolumeModifier;
}
}

View File

@ -1,7 +1,6 @@
package de.frajul.endlessroll.views;
import android.graphics.Typeface;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.AnimationUtils;
@ -9,6 +8,8 @@ import android.widget.TextView;
import de.frajul.endlessroll.R;
import de.frajul.endlessroll.main.game.Game;
import de.frajul.endlessroll.sounds.SoundManager;
import de.frajul.endlessroll.sounds.SoundStream;
/**
* Created by Julian on 31.07.2016.
@ -18,26 +19,35 @@ public class Countdown implements Animation.AnimationListener {
private Game game;
private AnimationSet animations;
private TextView textView;
private SoundManager soundManager;
private SoundStream soundStream;
private boolean firstHalfRepeated = true;
private int repeatCount = 0;
public Countdown(Game game, Typeface typeface, TextView textView) {
public Countdown(Game game, SoundManager soundManager, Typeface typeface, TextView textView) {
this.game = game;
this.soundManager = soundManager;
this.textView = textView;
this.textView.setTypeface(typeface);
animations = (AnimationSet) AnimationUtils.loadAnimation(game.getContext(), R.anim.countdown);
animations = (AnimationSet) AnimationUtils
.loadAnimation(game.getContext(), R.anim.countdown);
for (Animation animation : animations.getAnimations())
animation.setAnimationListener(this);
}
public void start() {
reset();
textView.startAnimation(animations);
if (textView.getAnimation() == null || !textView.getAnimation().isInitialized()) {
reset();
textView.startAnimation(animations);
soundStream = soundManager.playSound(soundManager.countdownSound);
}
}
public void stop() {
textView.clearAnimation();
if (soundStream != null)
soundManager.stopSound(soundStream);
}
private void reset() {
@ -59,6 +69,7 @@ public class Countdown implements Animation.AnimationListener {
public void onAnimationRepeat(Animation animation) {
if (!firstHalfRepeated)
repeatCount++;
firstHalfRepeated = !firstHalfRepeated;
textView.setText((3 - repeatCount) + "");
if (repeatCount == 1) {

View File

@ -18,6 +18,7 @@ import de.frajul.endlessroll.main.screens.Screen;
public class GameOverMessage implements View.OnClickListener {
private Animation fadeIn;
private GameActivity gameActivity;
private Game game;
private View layout;
@ -27,6 +28,7 @@ public class GameOverMessage implements View.OnClickListener {
public GameOverMessage(Game game, GameActivity gameActivity, View layout) {
this.game = game;
this.gameActivity = gameActivity;
this.layout = layout;
layout.setVisibility(View.GONE);
Typeface typeface = gameActivity.getTypeface();
@ -61,6 +63,7 @@ public class GameOverMessage implements View.OnClickListener {
private void hide() {
layout.clearAnimation();
layout.setVisibility(View.GONE);
gameActivity.getSoundManager().stopAllSounds();
}
@Override

View File

@ -87,6 +87,7 @@ public class GoalMessage implements GoalMessageLevelButtonOnClickListener, View.
private void hide() {
layout.clearAnimation();
layout.setVisibility(View.GONE);
gameActivity.getSoundManager().stopAllSounds();
}
@Override

View File

@ -51,7 +51,7 @@ public class ViewManager implements View.OnClickListener {
gameOverMessage = new GameOverMessage(game, gameActivity,
layout.findViewById(R.id.game_game_over_message));
goalMessage = new GoalMessage(game, gameActivity, layout.findViewById(R.id.game_goal_message));
countdown = new Countdown(game, gameActivity.getTypeface(),
countdown = new Countdown(game, gameActivity.getSoundManager(), gameActivity.getTypeface(),
(TextView) layout.findViewById(R.id.game_countdown));
}
});