package com.badlogic.gdx.backends.jglfw; import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.Audio; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.backends.lwjgl.LwjglNativesLoader; import com.badlogic.gdx.backends.lwjgl.audio.OpenALAudio; /** * ShadowJglfwApplication extends JglfwApplication and is * used by Shadow Engine. It currently is used as H4X as long * as there is no official OpenAL generator. */ public class ShadowJglfwApplication extends JglfwApplication { private static JglfwApplicationConfiguration config; private OpenALAudio audio; private int foregroundFPS, backgroundFPS, hiddenFPS; public static int audioDeviceSimultaneousSources = 16; public static int audioDeviceBufferCount = 9; public static int audioDeviceBufferSize = 512; public ShadowJglfwApplication(ApplicationListener listener) { this(listener, listener.getClass().getSimpleName(), 640, 480); } public ShadowJglfwApplication(ApplicationListener listener, String title, int width, int height) { this(listener, createConfig(title, width, height)); } public ShadowJglfwApplication(final ApplicationListener listener, final JglfwApplicationConfiguration config) { super(listener, ShadowJglfwApplication.config = config); } private static JglfwApplicationConfiguration createConfig(String title, int width, int height) { JglfwApplicationConfiguration config = new JglfwApplicationConfiguration(); config.title = title; config.width = width; config.height = height; return config; } /** * Starts the game loop and initializes OpenAL and other H4X dependant * stuff as overriding initialization was impossible... H4X FTW! */ @Override protected void start() { LwjglNativesLoader.load(); audio = new OpenALAudio(audioDeviceSimultaneousSources, audioDeviceBufferCount, audioDeviceBufferSize); Gdx.audio = audio; hiddenFPS = config.hiddenFPS; foregroundFPS = config.foregroundFPS; backgroundFPS = config.backgroundFPS; super.start(); } /** Handles posted runnables, input, audio and rendering for each frame. */ @Override protected void frame() { if (!running) return; if (executeRunnables()) graphics.requestRendering(); if (!running) return; input.update(); audio.update(); long frameStartTime = System.nanoTime(); int targetFPS = (graphics.isHidden() || graphics.isMinimized()) ? hiddenFPS : // (graphics.isForeground() ? foregroundFPS : backgroundFPS); if (targetFPS == -1) { // Rendering is paused. if (!isPaused) listener.pause(); isPaused = true; } else { if (isPaused) listener.resume(); isPaused = false; if (graphics.shouldRender()) render(frameStartTime); } if (targetFPS != 0) { if (targetFPS == -1) sleep(100); else Sync.sync(targetFPS); } } /** Called when an uncaught exception happens in the game loop. * This implementation disposes audio and then does the * usual stuff. */ protected void exception(Throwable ex) { if (audio != null) { audio.dispose(); } super.exception(ex); } protected void end() { audio.dispose(); super.end(); } @Override public Audio getAudio() { return audio; } }