diff --git a/android/assets/splash_texture.png b/android/assets/splash_texture.png new file mode 100755 index 0000000..906d1db Binary files /dev/null and b/android/assets/splash_texture.png differ diff --git a/android/assets/splashlogo.png b/android/assets/splashlogo.png deleted file mode 100755 index f2fab6d..0000000 Binary files a/android/assets/splashlogo.png and /dev/null differ diff --git a/core/src/zero1hd/rhythmbullet/RhythmBullet.java b/core/src/zero1hd/rhythmbullet/RhythmBullet.java index 2c086c8..3842c43 100755 --- a/core/src/zero1hd/rhythmbullet/RhythmBullet.java +++ b/core/src/zero1hd/rhythmbullet/RhythmBullet.java @@ -32,7 +32,7 @@ public class RhythmBullet extends Game { public static final int SPAWN_CIRCLE_RADIUS = 6; public static int pixels_per_unit; private boolean initiated; - private boolean resizing; + private boolean resizing, simpleResizeOnce; private int screenWidth, screenHeight; public static final String VERSION = "(1.0.0) R1-PreAlpha"; @@ -53,15 +53,25 @@ public class RhythmBullet extends Game { this.initialScreen = initialScreen; this.assetPack = assetPack; this.screenConfiguration = screenConfiguration; + screenConfiguration.queueBorderless(true); } @Override public void create() { - Gdx.app.setLogLevel(Application.LOG_DEBUG); - initialScreen.init(); setScreen(initialScreen); - - assetPack.initiateResources(); + Gdx.app.setLogLevel(Application.LOG_DEBUG); + screenWidth = Gdx.graphics.getWidth(); + screenHeight = Gdx.graphics.getHeight(); + initialScreen.init(); + initialLoad(); + } + + private void initialLoad() { + if (initiated) throw new IllegalStateException("Initiation cannot occur more than once."); + + simpleResizeOnce = true; + skin = new Skin(); + assetPack.initiate(); preferences = Gdx.app.getPreferences("RhythmBullet Preferences"); @@ -84,18 +94,23 @@ public class RhythmBullet extends Game { assetManager.setLoader(Sound.class, new SoundLoader(genericFileFinder)); rRHandler.setResolution(getPreferences().getInteger("screen-width"), getPreferences().getInteger("screen-height")); + queueAssets(); + } + + private void initialLoadComplete() { + screenConfiguration.queueBorderless(preferences.getBoolean("borderless", false)); - - screenWidth = Gdx.graphics.getWidth(); - screenHeight = Gdx.graphics.getHeight(); - + skin.addRegions(assetManager.get("uiskin.atlas", TextureAtlas.class)); pixels_per_unit = (int) (Float.valueOf(screenHeight)/Float.valueOf(WORLD_HEIGHT)); - if (getPreferences().getBoolean("fullscreen", true)) { Gdx.graphics.setFullscreenMode(Gdx.graphics.getDisplayMode()); } else { Gdx.graphics.setWindowedMode(getPreferences().getInteger("screen-width"), getPreferences().getInteger("screen-height")); } + assetPack.generateFonts(skin); + assetPack.setupSkin(skin); + assetPack.complete(assetManager); + } @Override @@ -110,8 +125,7 @@ public class RhythmBullet extends Game { Gdx.app.debug("Resize", "Post resize is starting..."); if (skin != null) skin.dispose(); skin = new Skin(); - skinAtlas = assetManager.get("uiskin.atlas", TextureAtlas.class); - getSkin().addRegions(skinAtlas); + skin.addRegions(assetManager.get("uiskin.atlas", TextureAtlas.class)); assetPack.generateFonts(skin); assetPack.setupSkin(skin); @@ -119,15 +133,14 @@ public class RhythmBullet extends Game { if (getScreen() instanceof ResizeReadyScreen) { ((ResizeReadyScreen) getScreen()).postAssetLoad(); } else { - throw new IllegalStateException("Cannot perform window resize on a screen that isn't using a resize ready screen."); + throw new IllegalStateException("Cannot perform window resize on a screen that isn't resize ready."); } Gdx.app.debug("Resize", "Post resize has ended."); - - if (!initiated) { - setScreen(((InitialScreen) initialScreen).createMainScreen(this)); - initiated = true; - } resizing = false; + } else if (!initiated) { + initiated = true; + initialLoadComplete(); + setScreen(((InitialScreen) initialScreen).advance(this)); } return true; } @@ -142,6 +155,7 @@ public class RhythmBullet extends Game { try { advancedResizeScreen.preAssetLoad(); } catch (NullPointerException cleanScreen) { + Gdx.app.debug("Screen", "clean screen: " + advancedResizeScreen.getClass().getSimpleName()); //Tried to perform pre-asset reload, but had uninitialized objects, meaning this is a new screen, or "clean" screen. } finally { advancedResizeScreen.postAssetLoad(); @@ -152,25 +166,30 @@ public class RhythmBullet extends Game { @Override public void resize(int width, int height) { - Gdx.app.debug("resize", "Current size:" + screenWidth + "x" + screenHeight + " new size: " + width + "x" + height); - if (width != screenWidth || height != screenHeight) { - screenWidth = Gdx.graphics.getWidth(); - screenHeight = Gdx.graphics.getHeight(); - + if (screenWidth != width || screenHeight != height) { + Gdx.app.debug("resize", "Current size:" + screenWidth + "x" + screenHeight + " new size: " + width + "x" + height); + screenWidth = width; + screenHeight = height; pixels_per_unit = (int) (Float.valueOf(screenHeight)/Float.valueOf(WORLD_HEIGHT)); - Gdx.app.debug("Resize", "Pre-resize is happening. Resizing to " + width + "x" + height); rRHandler.setResolution(width, height); - if (getScreen() instanceof ResizeReadyScreen) { - ((ResizeReadyScreen) getScreen()).preAssetLoad(); - } else { - throw new IllegalStateException("Cannot perform window resize on a screen that isn't using a resize ready screen."); - } preferences.putInteger("screen-width", width); preferences.putInteger("screen-height", height); preferences.flush(); - resizing = true; - assetManager.clear(); - queueAssets(); + + if (!simpleResizeOnce) { + Gdx.app.debug("Resize", "complex pre-resize is happening. Resizing to " + width + "x" + height); + if (getScreen() instanceof ResizeReadyScreen) { + ((ResizeReadyScreen) getScreen()).preAssetLoad(); + } else { + throw new IllegalStateException("Cannot perform window resize on a screen that isn't using a resize ready screen."); + } + + resizing = true; + assetManager.clear(); + queueAssets(); + } else { + simpleResizeOnce = false; + } super.resize(width, height); } } diff --git a/core/src/zero1hd/rhythmbullet/audio/MusicList.java b/core/src/zero1hd/rhythmbullet/audio/MusicList.java index 7b2b461..3a31d75 100755 --- a/core/src/zero1hd/rhythmbullet/audio/MusicList.java +++ b/core/src/zero1hd/rhythmbullet/audio/MusicList.java @@ -43,11 +43,11 @@ public class MusicList extends Observable { } /** - * Wrapper method that uses async refresh. + * Asynchronous recursive search on music directory. * Also notifies listeners that are on the main thread. * @param refresh does a search whether or not path has changed and whether or not this list has searched before this. */ - public void asyncSearch(boolean refresh) { + public void attemptAsyncSearch(boolean refresh) { if (refresh) { notifyObservers(states.LOADING); if (searchThread != null) { @@ -62,7 +62,7 @@ public class MusicList extends Observable { } } else { if (!searched || hasChanged()) { - asyncSearch(true); + attemptAsyncSearch(true); } } } diff --git a/core/src/zero1hd/rhythmbullet/audio/visualizer/DoubleHorizontalVisualizer.java b/core/src/zero1hd/rhythmbullet/audio/visualizer/DoubleHorizontalVisualizer.java index 0841902..27e9d20 100755 --- a/core/src/zero1hd/rhythmbullet/audio/visualizer/DoubleHorizontalVisualizer.java +++ b/core/src/zero1hd/rhythmbullet/audio/visualizer/DoubleHorizontalVisualizer.java @@ -147,6 +147,10 @@ public class DoubleHorizontalVisualizer implements Disposable { return y; } + public void updateMusic() { + pcm.updateMusic(); + } + @Override public void dispose() { pcm.dispose(); diff --git a/core/src/zero1hd/rhythmbullet/audio/visualizer/PCMSystem.java b/core/src/zero1hd/rhythmbullet/audio/visualizer/PCMSystem.java index 125d981..8bc3761 100755 --- a/core/src/zero1hd/rhythmbullet/audio/visualizer/PCMSystem.java +++ b/core/src/zero1hd/rhythmbullet/audio/visualizer/PCMSystem.java @@ -7,4 +7,6 @@ public interface PCMSystem extends Disposable { float[] getFrequencyBins(); int getWindowSize(); + + void updateMusic(); } \ No newline at end of file diff --git a/core/src/zero1hd/rhythmbullet/util/AssetPack.java b/core/src/zero1hd/rhythmbullet/util/AssetPack.java index a6271f2..d38d5f1 100755 --- a/core/src/zero1hd/rhythmbullet/util/AssetPack.java +++ b/core/src/zero1hd/rhythmbullet/util/AssetPack.java @@ -9,7 +9,7 @@ public interface AssetPack extends Disposable { /** * Called right after the game instance is created and passed to LWJGL. This method is called once for you to instantiate things for later use but require Libgdx functions. */ - public void initiateResources(); + public void initiate(); /** * Game manager calls this when it needs to load textures. diff --git a/core/src/zero1hd/rhythmbullet/util/InitialScreen.java b/core/src/zero1hd/rhythmbullet/util/InitialScreen.java index efeab6f..bc48afc 100755 --- a/core/src/zero1hd/rhythmbullet/util/InitialScreen.java +++ b/core/src/zero1hd/rhythmbullet/util/InitialScreen.java @@ -6,11 +6,12 @@ import zero1hd.rhythmbullet.RhythmBullet; public interface InitialScreen extends ResizeReadyScreen { /** + * Called when everythings loaded and ready to advance. * Screen should be created on platform. * @param gameManager the game manager. * @return the screen that is created. */ - public Screen createMainScreen(RhythmBullet gameManager); + public Screen advance(RhythmBullet gameManager); /** * Immediately called after the LibGDX instance has been instantiated. diff --git a/core/src/zero1hd/rhythmbullet/util/ScreenConfiguration.java b/core/src/zero1hd/rhythmbullet/util/ScreenConfiguration.java index f2aa9f6..4bcab49 100755 --- a/core/src/zero1hd/rhythmbullet/util/ScreenConfiguration.java +++ b/core/src/zero1hd/rhythmbullet/util/ScreenConfiguration.java @@ -26,5 +26,5 @@ public interface ScreenConfiguration { public void setWindowLocation(int x, int y); - public void setWindowBorderless(boolean borderless); + public void queueBorderless(boolean borderless); } diff --git a/desktop/src/zero1hd/rhythmbullet/desktop/DesktopAssetPack.java b/desktop/src/zero1hd/rhythmbullet/desktop/DesktopAssetPack.java index e32e05a..e9bfc0f 100755 --- a/desktop/src/zero1hd/rhythmbullet/desktop/DesktopAssetPack.java +++ b/desktop/src/zero1hd/rhythmbullet/desktop/DesktopAssetPack.java @@ -31,7 +31,7 @@ public class DesktopAssetPack implements AssetPack { private FreeTypeFontGenerator darktech_ldr_fontGenerator; @Override - public void initiateResources() { + public void initiate() { default_fontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/Gasalt-Regular.ttf")); darktech_ldr_fontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/darktech_ldr.ttf")); } diff --git a/desktop/src/zero1hd/rhythmbullet/desktop/DesktopLauncher.java b/desktop/src/zero1hd/rhythmbullet/desktop/DesktopLauncher.java index 02d1a56..eadd3e8 100755 --- a/desktop/src/zero1hd/rhythmbullet/desktop/DesktopLauncher.java +++ b/desktop/src/zero1hd/rhythmbullet/desktop/DesktopLauncher.java @@ -17,6 +17,8 @@ public class DesktopLauncher { config.resizable = false; config.useHDPI = true; config.samples = 2; + config.width = 320; + config.height = 320; config.allowSoftwareMode = true; core = new RhythmBullet(); core.setup(new SplashScreen(), new DesktopAssetPack(), screenConfig); diff --git a/desktop/src/zero1hd/rhythmbullet/desktop/DesktopScreenConfiguration.java b/desktop/src/zero1hd/rhythmbullet/desktop/DesktopScreenConfiguration.java index b37bfae..a5f67d6 100755 --- a/desktop/src/zero1hd/rhythmbullet/desktop/DesktopScreenConfiguration.java +++ b/desktop/src/zero1hd/rhythmbullet/desktop/DesktopScreenConfiguration.java @@ -73,9 +73,7 @@ public class DesktopScreenConfiguration implements ScreenConfiguration { } @Override - public void setWindowBorderless(boolean borderless) { - if (borderless) { - System.setProperty("org.lwjgl.opengl.Window.undecorated", String.valueOf(borderless)); - } + public void queueBorderless(boolean borderless) { + System.setProperty("org.lwjgl.opengl.Window.undecorated", String.valueOf(borderless)); } } diff --git a/desktop/src/zero1hd/rhythmbullet/desktop/audio/PCMObtainer.java b/desktop/src/zero1hd/rhythmbullet/desktop/audio/PCMObtainer.java index 7d4e826..fccd51a 100755 --- a/desktop/src/zero1hd/rhythmbullet/desktop/audio/PCMObtainer.java +++ b/desktop/src/zero1hd/rhythmbullet/desktop/audio/PCMObtainer.java @@ -119,8 +119,9 @@ public class PCMObtainer implements Observer, PCMSystem { } return false; } - - private void setMusic() { + + @Override + public void updateMusic() { Gdx.app.debug("PCMObtainer", "music set."); sourceID = -1; @@ -128,6 +129,8 @@ public class PCMObtainer implements Observer, PCMSystem { sampleRate = mc.getCurrentMusicHeader().getSampleRate(); String millisPerWindowF = df.format(windowSize/(float) sampleRate); millisPerWindow = (long) (Float.valueOf(millisPerWindowF)*1000); + + attemptToSync(); } @Override @@ -223,22 +226,28 @@ public class PCMObtainer implements Observer, PCMSystem { public void update(Observable o, Object arg) { if (o == mc) { if (arg == mc.states.LOADED) { - setMusic(); + updateMusic(); } else if (arg == mc.states.PLAYING) { - if (sourceID == -1) { - try { - Field sourceIDField = ClassReflection.getDeclaredField(OpenALMusic.class, "sourceID"); - sourceIDField.setAccessible(true); - sourceID = (int) sourceIDField.get(mc.getCurrentMusic()); - } catch (ReflectionException e) { - e.printStackTrace(); - } - } - streamReadThread.start(); + attemptToSync(); } } } - + + private void attemptToSync() { + if (mc.isPlaying()) { + if (sourceID == -1) { + try { + Field sourceIDField = ClassReflection.getDeclaredField(OpenALMusic.class, "sourceID"); + sourceIDField.setAccessible(true); + sourceID = (int) sourceIDField.get(mc.getCurrentMusic()); + } catch (ReflectionException e) { + e.printStackTrace(); + } + } + streamReadThread.start(); + } + } + @Override public void dispose() { streamReadThread.stop(); diff --git a/desktop/src/zero1hd/rhythmbullet/desktop/screens/SplashScreen.java b/desktop/src/zero1hd/rhythmbullet/desktop/screens/SplashScreen.java index c237ddf..f6d6f1e 100755 --- a/desktop/src/zero1hd/rhythmbullet/desktop/screens/SplashScreen.java +++ b/desktop/src/zero1hd/rhythmbullet/desktop/screens/SplashScreen.java @@ -3,10 +3,8 @@ package zero1hd.rhythmbullet.desktop.screens; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Screen; import com.badlogic.gdx.ScreenAdapter; -import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import zero1hd.rhythmbullet.RhythmBullet; @@ -14,18 +12,13 @@ import zero1hd.rhythmbullet.desktop.screens.main.MainScreen; import zero1hd.rhythmbullet.util.InitialScreen; public class SplashScreen extends ScreenAdapter implements InitialScreen { - private Sprite splashSprite; + private Texture splashTexture; private SpriteBatch batch; - private Color color = new Color(1f, 1f, 1f, 1f); - private float fadeTime = 1.5f; @Override public void init() { batch = new SpriteBatch(); - splashSprite = new Sprite(new Texture(Gdx.files.internal("splashlogo.png"))); - float scale = (Gdx.graphics.getHeight()/3f)/splashSprite.getHeight(); - splashSprite.setSize(scale*splashSprite.getWidth(), scale*splashSprite.getHeight()); - splashSprite.setPosition((Gdx.graphics.getWidth()-splashSprite.getWidth())/2f, (Gdx.graphics.getHeight()-splashSprite.getHeight())/2f); + splashTexture = new Texture(Gdx.files.internal("splash_texture.png")); } @Override @@ -33,10 +26,7 @@ public class SplashScreen extends ScreenAdapter implements InitialScreen { Gdx.gl.glClearColor(1f, 1f, 1f, 1f); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); batch.begin(); - float change = delta/fadeTime; - color.a -= change; - splashSprite.setColor(color); - splashSprite.draw(batch); + batch.draw(splashTexture, 0, 0); batch.end(); super.render(delta); @@ -44,7 +34,7 @@ public class SplashScreen extends ScreenAdapter implements InitialScreen { @Override public void hide() { - splashSprite.getTexture().dispose(); + splashTexture.dispose(); super.hide(); } @@ -62,7 +52,7 @@ public class SplashScreen extends ScreenAdapter implements InitialScreen { } @Override - public Screen createMainScreen(RhythmBullet game) { + public Screen advance(RhythmBullet game) { return new MainScreen(game); } } diff --git a/desktop/src/zero1hd/rhythmbullet/desktop/screens/main/MainPage.java b/desktop/src/zero1hd/rhythmbullet/desktop/screens/main/MainPage.java index 3bdcb7a..1b9196b 100755 --- a/desktop/src/zero1hd/rhythmbullet/desktop/screens/main/MainPage.java +++ b/desktop/src/zero1hd/rhythmbullet/desktop/screens/main/MainPage.java @@ -101,6 +101,12 @@ public class MainPage extends Page implements Observer { scrollText.setWidth(0.5f*getWidth()); scrollText.setPosition(15, getHeight() - scrollText.getHeight()-30f); addActor(scrollText); + + if (mc.getMusicList().isSearched() && amc.isSameSizeMusicList()) { + scrollText.setText("Currently playing: " + amc.getAudioMetadata(mc.getCurrentMusicFileHandle()).getTitle(), null); + dhv.updateMusic(); + } + } @Override @@ -145,7 +151,7 @@ public class MainPage extends Page implements Observer { } } } else if (o == amc) { - if (amc.size() != 0) { + if (amc.isSameSizeMusicList()) { scrollText.setText("Currently playing: " + amc.getAudioMetadata(mc.getCurrentMusicFileHandle()).getTitle(), null); } } else if (o == mc.getMusicList()) { diff --git a/desktop/src/zero1hd/rhythmbullet/desktop/screens/main/MainScreen.java b/desktop/src/zero1hd/rhythmbullet/desktop/screens/main/MainScreen.java index a59eea7..c6a61cb 100755 --- a/desktop/src/zero1hd/rhythmbullet/desktop/screens/main/MainScreen.java +++ b/desktop/src/zero1hd/rhythmbullet/desktop/screens/main/MainScreen.java @@ -44,6 +44,7 @@ public class MainScreen extends ScreenAdapter implements ResizeReadyScreen { private Texture background; private Batch screenBatch; + private boolean resizing; public MainScreen(RhythmBullet core) { this.rhythmBullet = core; @@ -64,19 +65,22 @@ public class MainScreen extends ScreenAdapter implements ResizeReadyScreen { public void render(float delta) { Gdx.gl.glClearColor(0f, 0f, 0f, 1f); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); - stage.act(delta); - if (bloomShader != null) { - bloomShader.begin(); - draw(); - bloomShader.end(stage.getWidth(), stage.getHeight()); - } else { - draw(); - } + + if (!resizing) { + stage.act(delta); + if (bloomShader != null) { + bloomShader.begin(); + draw(); + bloomShader.end(stage.getWidth(), stage.getHeight()); + } else { + draw(); + } - if (stage.getCamera().position.x != cameraPosition.x || stage.getCamera().position.y != cameraPosition.y) { - stage.getCamera().position.lerp(cameraPosition, 0.15f); - stage.getViewport().apply(); - } + if (stage.getCamera().position.x != cameraPosition.x || stage.getCamera().position.y != cameraPosition.y) { + stage.getCamera().position.lerp(cameraPosition, 0.15f); + stage.getViewport().apply(); + } + } super.render(delta); } @@ -91,6 +95,7 @@ public class MainScreen extends ScreenAdapter implements ResizeReadyScreen { @Override public void preAssetLoad() { + resizing = true; stage.clear(); if (bloomShader != null) { bloomShader.dispose(); @@ -103,7 +108,7 @@ public class MainScreen extends ScreenAdapter implements ResizeReadyScreen { @Override public void postAssetLoad() { - + resizing = false; bloomShader = new BloomShader(screenBatch); background = rhythmBullet.getAssetManager().get("backgrounds/mainBG.png", Texture.class); @@ -130,7 +135,7 @@ public class MainScreen extends ScreenAdapter implements ResizeReadyScreen { analysisPage = new AnalysisPage(rhythmBullet.getSkin(), listeners.returnToMainPageListener, listeners.confirmedSongListener); stage.addActor(analysisPage); - musicController.getMusicList().asyncSearch(false); + musicController.getMusicList().attemptAsyncSearch(false); } @Override diff --git a/desktop/src/zero1hd/rhythmbullet/desktop/screens/main/MusicSelectionPage.java b/desktop/src/zero1hd/rhythmbullet/desktop/screens/main/MusicSelectionPage.java index ca748e0..042cb5b 100755 --- a/desktop/src/zero1hd/rhythmbullet/desktop/screens/main/MusicSelectionPage.java +++ b/desktop/src/zero1hd/rhythmbullet/desktop/screens/main/MusicSelectionPage.java @@ -124,6 +124,8 @@ public class MusicSelectionPage extends Page implements Observer { mc.addObserver(this); mc.getMusicList().addObserver(this); selectionLoaderThread = new musicSelectionLoaderThread(); + + musicInfoTable.setToDefault(); } @Override diff --git a/desktop/src/zero1hd/rhythmbullet/desktop/screens/main/OptionsPage.java b/desktop/src/zero1hd/rhythmbullet/desktop/screens/main/OptionsPage.java index 5840cd4..f227962 100755 --- a/desktop/src/zero1hd/rhythmbullet/desktop/screens/main/OptionsPage.java +++ b/desktop/src/zero1hd/rhythmbullet/desktop/screens/main/OptionsPage.java @@ -93,7 +93,7 @@ public class OptionsPage extends Page { musicSearchTimer -= delta; if (musicSearchTimer <= 0) { musicController.getMusicList().setSearchPath(directoryField.getText()); - musicController.getMusicList().asyncSearch(false); + musicController.getMusicList().attemptAsyncSearch(false); } } super.act(delta);