better control system; album art loading more efficient;
This commit is contained in:
		@@ -366,7 +366,7 @@ rect
 | 
			
		||||
  rotate: false
 | 
			
		||||
  xy: 176, 35
 | 
			
		||||
  size: 14, 14
 | 
			
		||||
  split: 4, 4, 4, 4
 | 
			
		||||
  split: 3, 3, 3, 3
 | 
			
		||||
  orig: 14, 14
 | 
			
		||||
  offset: 0, 0
 | 
			
		||||
  index: -1
 | 
			
		||||
@@ -374,7 +374,7 @@ rect-down
 | 
			
		||||
  rotate: false
 | 
			
		||||
  xy: 191, 35
 | 
			
		||||
  size: 14, 14
 | 
			
		||||
  split: 4, 4, 4, 4
 | 
			
		||||
  split: 3, 3, 3, 3
 | 
			
		||||
  orig: 14, 14
 | 
			
		||||
  offset: 0, 0
 | 
			
		||||
  index: -1
 | 
			
		||||
@@ -382,7 +382,7 @@ rect-disabled
 | 
			
		||||
  rotate: false
 | 
			
		||||
  xy: 206, 35
 | 
			
		||||
  size: 14, 14
 | 
			
		||||
  split: 4, 4, 4, 4
 | 
			
		||||
  split: 3, 3, 3, 3
 | 
			
		||||
  orig: 14, 14
 | 
			
		||||
  offset: 0, 0
 | 
			
		||||
  index: -1
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,7 @@ public class MusicController extends Observable implements OnCompletionListener,
 | 
			
		||||
	public final class States {
 | 
			
		||||
		public final Integer LOADED = new Integer(0), PLAYING = new Integer(1);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public final States states = new States();
 | 
			
		||||
	private MusicList musicList;
 | 
			
		||||
	private MinimalAudioHeader musicHeader;
 | 
			
		||||
@@ -191,6 +192,9 @@ public class MusicController extends Observable implements OnCompletionListener,
 | 
			
		||||
	@Override
 | 
			
		||||
	public void update(Observable o, Object arg) {
 | 
			
		||||
		if (o == musicList) {
 | 
			
		||||
			if (arg == musicList.states.LOADING) {
 | 
			
		||||
				pause();
 | 
			
		||||
			} else if (arg == musicList.states.COMPLETE) {
 | 
			
		||||
				if (shuffle) {
 | 
			
		||||
					shuffle();
 | 
			
		||||
				}
 | 
			
		||||
@@ -200,6 +204,7 @@ public class MusicController extends Observable implements OnCompletionListener,
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public String getCurrentSongName() {
 | 
			
		||||
		return getCurrentMusicFileHandle().nameWithoutExtension();
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,10 @@ import zero1hd.rhythmbullet.audio.processor.WAVAudioProcessor;
 | 
			
		||||
 * @author yunya
 | 
			
		||||
 */
 | 
			
		||||
public class MusicList extends Observable {
 | 
			
		||||
	public final class States {
 | 
			
		||||
		public final Integer LOADING = new Integer(0), COMPLETE = new Integer(1);
 | 
			
		||||
	}
 | 
			
		||||
	public States states = new States();
 | 
			
		||||
	private Array<FileHandle> musicList;
 | 
			
		||||
	private RecursiveMusicSearchThread searchThread;
 | 
			
		||||
	private AudioProcessorFactory audioProcFactory;
 | 
			
		||||
@@ -45,7 +49,7 @@ public class MusicList extends Observable {
 | 
			
		||||
	 */
 | 
			
		||||
	public void asyncSearch(boolean refresh) {
 | 
			
		||||
		if (refresh) {
 | 
			
		||||
			
 | 
			
		||||
			notifyObservers(states.LOADING);
 | 
			
		||||
			if (searchThread != null) {
 | 
			
		||||
				if (!searchThread.start()) {
 | 
			
		||||
					searchThread.stop();
 | 
			
		||||
@@ -57,9 +61,7 @@ public class MusicList extends Observable {
 | 
			
		||||
				searchThread.start();
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			if (searched && !hasChanged()) {
 | 
			
		||||
				notifyObservers();
 | 
			
		||||
			} else {
 | 
			
		||||
			if (!searched || hasChanged()) {
 | 
			
		||||
				asyncSearch(true);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
@@ -154,7 +156,7 @@ public class MusicList extends Observable {
 | 
			
		||||
				searched = true;
 | 
			
		||||
				Gdx.app.debug("MusicList", "recursive async search completed.");
 | 
			
		||||
				setChanged();
 | 
			
		||||
				notifyObservers();
 | 
			
		||||
				notifyObservers(states.COMPLETE);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ public class MP3Metadata implements AudioMetadata {
 | 
			
		||||
	private int length;
 | 
			
		||||
	private Texture albumCover;
 | 
			
		||||
	private FileHandle fileHandle;
 | 
			
		||||
	private byte[] imageData;
 | 
			
		||||
	private Pixmap pixmap;
 | 
			
		||||
	
 | 
			
		||||
	public MP3Metadata(FileHandle fileHandle) {
 | 
			
		||||
		this.fileHandle = fileHandle;
 | 
			
		||||
@@ -65,8 +65,8 @@ public class MP3Metadata implements AudioMetadata {
 | 
			
		||||
			mp3file = (MP3File) AudioFileIO.read(fileHandle.file());
 | 
			
		||||
			Artwork art = mp3file.getTag().getFirstArtwork();
 | 
			
		||||
			if (art != null) {
 | 
			
		||||
				imageData = art.getBinaryData();
 | 
			
		||||
 | 
			
		||||
				byte[] imageData = art.getBinaryData();
 | 
			
		||||
				pixmap = new Pixmap(imageData, 0, imageData.length);
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
		} catch (CannotReadException | IOException | TagException | ReadOnlyFileException | InvalidAudioFrameException e) {
 | 
			
		||||
@@ -109,11 +109,10 @@ public class MP3Metadata implements AudioMetadata {
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public Texture getAlbumCover() {
 | 
			
		||||
		if (albumCover == null && imageData != null) {
 | 
			
		||||
			Pixmap pixmap = new Pixmap(imageData, 0, imageData.length);
 | 
			
		||||
		if (pixmap != null && albumCover == null) {
 | 
			
		||||
			albumCover = new Texture(pixmap);
 | 
			
		||||
			pixmap.dispose();
 | 
			
		||||
			imageData = null;
 | 
			
		||||
			pixmap = null;
 | 
			
		||||
		}
 | 
			
		||||
		return albumCover;
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ public class WAVMetadata implements AudioMetadata {
 | 
			
		||||
	private int length;
 | 
			
		||||
	private Texture albumCover;
 | 
			
		||||
	private FileHandle fileHandle;
 | 
			
		||||
	private byte[] imageData;
 | 
			
		||||
	private Pixmap pixmap;
 | 
			
		||||
	
 | 
			
		||||
	public WAVMetadata(FileHandle fileHandle) {
 | 
			
		||||
		this.fileHandle = fileHandle;
 | 
			
		||||
@@ -52,10 +52,11 @@ public class WAVMetadata implements AudioMetadata {
 | 
			
		||||
		try {
 | 
			
		||||
			AudioFile wav = AudioFileIO.read(fileHandle.file());
 | 
			
		||||
			Artwork art = wav.getTag().getFirstArtwork();
 | 
			
		||||
			if (art != null) {
 | 
			
		||||
				imageData = art.getBinaryData();
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			if (art != null) {
 | 
			
		||||
				byte[] imageData = art.getBinaryData();
 | 
			
		||||
				pixmap = new Pixmap(imageData, 0, imageData.length);
 | 
			
		||||
			}
 | 
			
		||||
		} catch (CannotReadException | IOException | TagException | ReadOnlyFileException | InvalidAudioFrameException e) {
 | 
			
		||||
			e.printStackTrace();
 | 
			
		||||
		}
 | 
			
		||||
@@ -88,11 +89,10 @@ public class WAVMetadata implements AudioMetadata {
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public Texture getAlbumCover() {
 | 
			
		||||
		if (albumCover == null && imageData != null) {
 | 
			
		||||
			Pixmap pixmap = new Pixmap(imageData, 0, imageData.length);
 | 
			
		||||
		if (pixmap != null && albumCover == null) {
 | 
			
		||||
			albumCover = new Texture(pixmap);
 | 
			
		||||
			pixmap.dispose();
 | 
			
		||||
			imageData = null;
 | 
			
		||||
			pixmap = null;
 | 
			
		||||
		}
 | 
			
		||||
		return albumCover;
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,149 +0,0 @@
 | 
			
		||||
package zero1hd.rhythmbullet.controls;
 | 
			
		||||
 | 
			
		||||
import com.badlogic.gdx.Gdx;
 | 
			
		||||
import com.badlogic.gdx.Input.Keys;
 | 
			
		||||
import com.badlogic.gdx.Preferences;
 | 
			
		||||
import com.badlogic.gdx.assets.AssetManager;
 | 
			
		||||
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
 | 
			
		||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
 | 
			
		||||
 | 
			
		||||
public class KeyMap {
 | 
			
		||||
	TextureAtlas keyTextures;
 | 
			
		||||
	private Preferences keyBindPrefs;
 | 
			
		||||
	
 | 
			
		||||
	public static final String UP = "up";
 | 
			
		||||
	public static final String DOWN = "down";
 | 
			
		||||
	public static final String LEFT = "left";
 | 
			
		||||
	public static final String RIGHT = "right";
 | 
			
		||||
	
 | 
			
		||||
	public static final String SHOOT = "shoot";
 | 
			
		||||
	
 | 
			
		||||
	public static final String FIRSTTHIRDTELEPORT = "firstThirdTP";
 | 
			
		||||
	public static final String SECONDTHIRDTELEPORT = "secondThirdTP";
 | 
			
		||||
	public static final String THIRDTHIRDTELEPORT = "thirdThirdTP";
 | 
			
		||||
	
 | 
			
		||||
	public static final String ACCELERATE = "accelerate";
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * forward binding.
 | 
			
		||||
	 */
 | 
			
		||||
	public static int up;
 | 
			
		||||
	/**
 | 
			
		||||
	 * backward binding.
 | 
			
		||||
	 */
 | 
			
		||||
	public static int down;
 | 
			
		||||
	/**
 | 
			
		||||
	 * left binding.
 | 
			
		||||
	 */
 | 
			
		||||
	public static int left;
 | 
			
		||||
	/**
 | 
			
		||||
	 * right binding.
 | 
			
		||||
	 */
 | 
			
		||||
	public static int right;
 | 
			
		||||
	/**
 | 
			
		||||
	 * shoot binding
 | 
			
		||||
	 */
 | 
			
		||||
	public static int shoot;
 | 
			
		||||
	/**
 | 
			
		||||
	 * teleport first third binding
 | 
			
		||||
	 */
 | 
			
		||||
	public static int firstThirdTeleport;
 | 
			
		||||
	/**
 | 
			
		||||
	 * teleport second third binding
 | 
			
		||||
	 */
 | 
			
		||||
	public static int secondThirdTeleport;
 | 
			
		||||
	/**
 | 
			
		||||
	 * teleport third third binding
 | 
			
		||||
	 */
 | 
			
		||||
	public static int thirdThirdTeleport;
 | 
			
		||||
	
 | 
			
		||||
	public static int accelerate;
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	public KeyMap(AssetManager assets) {
 | 
			
		||||
		keyTextures = assets.get("keyboard.atlas", TextureAtlas.class);
 | 
			
		||||
		
 | 
			
		||||
		setKeys(Gdx.app.getPreferences("PolyJet_Controls"));
 | 
			
		||||
		updateKeys();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public Preferences getKeys() {
 | 
			
		||||
		return keyBindPrefs;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void setKeys(Preferences keys) {
 | 
			
		||||
		this.keyBindPrefs = keys;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public TextureRegion getIcon(int keycode) {
 | 
			
		||||
//		Gdx.app.debug("Keycode texture name", Keys.toString(keycode));
 | 
			
		||||
 | 
			
		||||
		switch (keycode) {
 | 
			
		||||
		case Keys.ALT_LEFT:
 | 
			
		||||
		case Keys.ALT_RIGHT:
 | 
			
		||||
			return keyTextures.findRegion("Keyboard_Black_Alt");
 | 
			
		||||
		case Keys.SHIFT_LEFT:
 | 
			
		||||
		case Keys.SHIFT_RIGHT:
 | 
			
		||||
			return keyTextures.findRegion("Keyboard_Black_Shift");
 | 
			
		||||
		case Keys.LEFT_BRACKET:
 | 
			
		||||
			return keyTextures.findRegion("Keyboard_Black_Bracket_Left");
 | 
			
		||||
		case Keys.RIGHT_BRACKET:
 | 
			
		||||
			return keyTextures.findRegion("Keyboard_Black_Bracket_Right");
 | 
			
		||||
		case Keys.SEMICOLON:
 | 
			
		||||
			return keyTextures.findRegion("Keyboard_Black_Semicolon");
 | 
			
		||||
		case Keys.SLASH:
 | 
			
		||||
			return keyTextures.findRegion("Keyboard_Black_Slash");
 | 
			
		||||
		case Keys.NUM:
 | 
			
		||||
			return keyTextures.findRegion("Keyboard_Black_Num_Lock");
 | 
			
		||||
		default:
 | 
			
		||||
			return keyTextures.findRegion("Keyboard_Black_" + Keys.toString(keycode).replace(' ', '_'));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void updateKeys() {
 | 
			
		||||
		up = keyBindPrefs.getInteger(KeyMap.UP, Keys.UP);
 | 
			
		||||
		down = keyBindPrefs.getInteger(KeyMap.DOWN, Keys.DOWN);
 | 
			
		||||
		left = keyBindPrefs.getInteger(KeyMap.LEFT, Keys.LEFT);
 | 
			
		||||
		right = keyBindPrefs.getInteger(KeyMap.RIGHT, Keys.RIGHT);
 | 
			
		||||
		
 | 
			
		||||
		shoot = keyBindPrefs.getInteger(KeyMap.SHOOT, Keys.SPACE);
 | 
			
		||||
		
 | 
			
		||||
		firstThirdTeleport = keyBindPrefs.getInteger(KeyMap.FIRSTTHIRDTELEPORT, Keys.Q);
 | 
			
		||||
		secondThirdTeleport = keyBindPrefs.getInteger(KeyMap.SECONDTHIRDTELEPORT, Keys.W);
 | 
			
		||||
		thirdThirdTeleport = keyBindPrefs.getInteger(KeyMap.THIRDTHIRDTELEPORT, Keys.E);
 | 
			
		||||
		
 | 
			
		||||
		accelerate = keyBindPrefs.getInteger(KeyMap.ACCELERATE, Keys.SHIFT_LEFT);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * resets all binding to default;
 | 
			
		||||
	 */
 | 
			
		||||
	public void resetAllBinding() {
 | 
			
		||||
		keyBindPrefs.clear();
 | 
			
		||||
		keyBindPrefs.flush();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public int stringToID(String control) {
 | 
			
		||||
		if (control == KeyMap.UP) {
 | 
			
		||||
			return KeyMap.up;
 | 
			
		||||
		} else if (control == KeyMap.DOWN) {
 | 
			
		||||
			return KeyMap.down;
 | 
			
		||||
		} else if (control == KeyMap.LEFT) {
 | 
			
		||||
			return KeyMap.left;
 | 
			
		||||
		} else if (control == KeyMap.RIGHT) {
 | 
			
		||||
			return KeyMap.right;
 | 
			
		||||
		} else if (control == KeyMap.SHOOT) {
 | 
			
		||||
			return KeyMap.shoot;
 | 
			
		||||
		} else if (control == KeyMap.FIRSTTHIRDTELEPORT) {
 | 
			
		||||
			return KeyMap.firstThirdTeleport;
 | 
			
		||||
		} else if (control == KeyMap.SECONDTHIRDTELEPORT) {
 | 
			
		||||
			return KeyMap.secondThirdTeleport;
 | 
			
		||||
		} else if (control == KeyMap.THIRDTHIRDTELEPORT) {
 | 
			
		||||
			return KeyMap.thirdThirdTeleport;
 | 
			
		||||
		} else if (control == KeyMap.ACCELERATE) {
 | 
			
		||||
			return KeyMap.accelerate;
 | 
			
		||||
		} else {
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -1,148 +0,0 @@
 | 
			
		||||
package zero1hd.rhythmbullet.game;
 | 
			
		||||
 | 
			
		||||
import com.badlogic.gdx.Gdx;
 | 
			
		||||
import com.badlogic.gdx.InputProcessor;
 | 
			
		||||
import com.badlogic.gdx.Preferences;
 | 
			
		||||
import com.badlogic.gdx.assets.AssetManager;
 | 
			
		||||
import com.badlogic.gdx.graphics.g2d.Batch;
 | 
			
		||||
import com.badlogic.gdx.utils.Disposable;
 | 
			
		||||
 | 
			
		||||
import zero1hd.rhythmbullet.controls.KeyMap;
 | 
			
		||||
import zero1hd.rhythmbullet.entity.CollisionDetector;
 | 
			
		||||
import zero1hd.rhythmbullet.entity.EntityManager;
 | 
			
		||||
import zero1hd.rhythmbullet.entity.ally.Laser;
 | 
			
		||||
import zero1hd.rhythmbullet.entity.ally.PolyjetEntity;
 | 
			
		||||
import zero1hd.rhythmbullet.entity.coordinator.CoordinatorManager;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
public class GameController implements Disposable, InputProcessor {
 | 
			
		||||
	public PolyjetEntity polyjet;
 | 
			
		||||
	
 | 
			
		||||
	public CoordinatorManager cm;
 | 
			
		||||
	public EntityManager em;
 | 
			
		||||
	private CollisionDetector collisionDetector;
 | 
			
		||||
	
 | 
			
		||||
	public ScoreManager score = new ScoreManager();
 | 
			
		||||
	
 | 
			
		||||
	public GameController(AssetManager assetManager, Preferences prefs) {
 | 
			
		||||
		Gdx.app.debug("Game Area", "new area created");
 | 
			
		||||
		
 | 
			
		||||
		polyjet = new PolyjetEntity(assetManager, 25f, 25f, 100, "standard");
 | 
			
		||||
		em = new EntityManager(assetManager, prefs);
 | 
			
		||||
		cm = new CoordinatorManager(em);
 | 
			
		||||
		
 | 
			
		||||
		collisionDetector = new CollisionDetector(em.activeEnemies, em.activeAllies, assetManager, prefs);
 | 
			
		||||
		em.activeAllies.add(polyjet);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void draw(Batch batch) {
 | 
			
		||||
		batch.begin();
 | 
			
		||||
		for (int i = 0; i < em.activeEnemies.size; i++) {
 | 
			
		||||
			em.activeEnemies.get(i).draw(batch);
 | 
			
		||||
		}
 | 
			
		||||
		for (int i = 0; i < em.activeAllies.size; i++) {
 | 
			
		||||
			em.activeAllies.get(i).draw(batch);
 | 
			
		||||
		}
 | 
			
		||||
		batch.end();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void prepare(float delta) {
 | 
			
		||||
		for (int i = 0; i < em.activeEnemies.size; i++) {
 | 
			
		||||
			em.activeEnemies.get(i).updatePosition();
 | 
			
		||||
		}
 | 
			
		||||
		for (int i = 0; i < em.activeAllies.size; i++) {
 | 
			
		||||
			em.activeAllies.get(i).updatePosition();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean keyDown(int keycode) {
 | 
			
		||||
		if (keycode == KeyMap.left) {
 | 
			
		||||
			polyjet.moveLeft = true;
 | 
			
		||||
		}
 | 
			
		||||
		if (keycode == KeyMap.right) {
 | 
			
		||||
			polyjet.moveRight = true;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		if (keycode == KeyMap.up) {
 | 
			
		||||
			polyjet.moveUp = true;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		if (keycode == KeyMap.down) {        
 | 
			
		||||
			polyjet.moveDown = true;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		if (keycode == KeyMap.accelerate) {
 | 
			
		||||
			polyjet.accelerate = true;
 | 
			
		||||
		}
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean keyUp(int keycode) {
 | 
			
		||||
		if (keycode == KeyMap.left) {
 | 
			
		||||
			polyjet.moveLeft = false;
 | 
			
		||||
		}
 | 
			
		||||
		if (keycode == KeyMap.right) {
 | 
			
		||||
			polyjet.moveRight = false;
 | 
			
		||||
		}
 | 
			
		||||
		if (keycode == KeyMap.up) {
 | 
			
		||||
			polyjet.moveUp = false;
 | 
			
		||||
		}
 | 
			
		||||
		if (keycode == KeyMap.down) {
 | 
			
		||||
			polyjet.moveDown = false;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		if (keycode == KeyMap.accelerate) {
 | 
			
		||||
			polyjet.accelerate = false;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		if (keycode == KeyMap.shoot) {
 | 
			
		||||
			Laser laser	= em.laser.buildEntity();
 | 
			
		||||
			laser.init(polyjet.getX() + polyjet.getWidth()/2f, polyjet.getY() + polyjet.getHeight()+1f, 60f);
 | 
			
		||||
		}
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public PolyjetEntity getPolyjetEntity() {
 | 
			
		||||
		return polyjet;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public void dispose() {
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public CollisionDetector getCollisionDetector() {
 | 
			
		||||
		return collisionDetector;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean keyTyped(char character) {
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean touchDown(int screenX, int screenY, int pointer, int button) {
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean touchUp(int screenX, int screenY, int pointer, int button) {
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean touchDragged(int screenX, int screenY, int pointer) {
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean mouseMoved(int screenX, int screenY) {
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean scrolled(int amount) {
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
package zero1hd.rhythmbullet.desktop.graphics.ui.components;
 | 
			
		||||
package zero1hd.rhythmbullet.graphics.ui.components;
 | 
			
		||||
 | 
			
		||||
import com.badlogic.gdx.math.MathUtils;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.actions.Actions;
 | 
			
		||||
							
								
								
									
										45
									
								
								desktop/src/zero1hd/rhythmbullet/desktop/Controls.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										45
									
								
								desktop/src/zero1hd/rhythmbullet/desktop/Controls.java
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
package zero1hd.rhythmbullet.desktop;
 | 
			
		||||
 | 
			
		||||
import com.badlogic.gdx.Preferences;
 | 
			
		||||
import com.badlogic.gdx.Input.Keys;
 | 
			
		||||
 | 
			
		||||
public enum Controls {
 | 
			
		||||
	UP("Forward", Keys.UP), DOWN("Backwards", Keys.DOWN), LEFT("Left", Keys.LEFT), RIGHT("Right", Keys.RIGHT), SHOOT("Shoot", Keys.SPACE), ACCELERATE("Boost", Keys.SHIFT_LEFT);
 | 
			
		||||
	private int keycode;
 | 
			
		||||
	private final String friendly;
 | 
			
		||||
	private final int defectKey;
 | 
			
		||||
	
 | 
			
		||||
	private Controls(String friendly, int defectKey) {
 | 
			
		||||
		this.friendly = friendly;
 | 
			
		||||
		this.defectKey = defectKey;
 | 
			
		||||
		this.keycode = defectKey;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public Controls setKeycode(int keycode) {
 | 
			
		||||
		Controls[] controls = Controls.values();
 | 
			
		||||
		for (int i = 0; i < controls.length; i++) {
 | 
			
		||||
			if (controls[i] != this && controls[i].getKeycode() == keycode) {
 | 
			
		||||
				return controls[i];
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		this.keycode = keycode;
 | 
			
		||||
		return null;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public int getKeycode() {
 | 
			
		||||
		return keycode;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void loadKeyFromPreferences(Preferences preferences) {
 | 
			
		||||
		setKeycode(preferences.getInteger(name(), defectKey));
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void saveKeyToPreferences(Preferences preferences) {
 | 
			
		||||
		preferences.putInteger(name(), keycode);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public String toString() {
 | 
			
		||||
		return friendly;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
package zero1hd.rhythmbullet.desktop;
 | 
			
		||||
 | 
			
		||||
import com.badlogic.gdx.Gdx;
 | 
			
		||||
import com.badlogic.gdx.Preferences;
 | 
			
		||||
import com.badlogic.gdx.assets.AssetManager;
 | 
			
		||||
import com.badlogic.gdx.audio.Sound;
 | 
			
		||||
import com.badlogic.gdx.graphics.Color;
 | 
			
		||||
@@ -94,13 +95,6 @@ public class DesktopAssetPack implements AssetPack {
 | 
			
		||||
		windowTextButton.font = skin.getFont("window-font");
 | 
			
		||||
		skin.add("window", windowTextButton);
 | 
			
		||||
		
 | 
			
		||||
		TextButtonStyle textButtonLeft = new TextButtonStyle();
 | 
			
		||||
		textButtonLeft.up = skin.getDrawable("left-button");
 | 
			
		||||
		textButtonLeft.down = skin.getDrawable("left-button-down");
 | 
			
		||||
		textButtonLeft.font = skin.getFont("default-font");
 | 
			
		||||
		textButtonLeft.fontColor = skin.getColor("default");
 | 
			
		||||
		skin.add("left", textButtonLeft);
 | 
			
		||||
		
 | 
			
		||||
		SliderStyle defaultSlider = new SliderStyle(skin.getDrawable("default-slider"), skin.getDrawable("default-slider-knob"));
 | 
			
		||||
		skin.add("default-horizontal", defaultSlider);
 | 
			
		||||
		
 | 
			
		||||
@@ -172,10 +166,13 @@ public class DesktopAssetPack implements AssetPack {
 | 
			
		||||
		shuffleButtonStyle.checkboxOn = skin.getDrawable("shuffle-down");
 | 
			
		||||
		skin.add("shuffle-button", shuffleButtonStyle);
 | 
			
		||||
		
 | 
			
		||||
		ButtonStyle musicSelectable = new ButtonStyle();
 | 
			
		||||
		musicSelectable.checked = skin.getDrawable("holo-pane-down");
 | 
			
		||||
		musicSelectable.up = skin.getDrawable("holo-pane");
 | 
			
		||||
		skin.add("music-selectable", musicSelectable);
 | 
			
		||||
		ButtonStyle selectableButton = new ButtonStyle();
 | 
			
		||||
		selectableButton.checked = skin.getDrawable("holo-pane-down");
 | 
			
		||||
		selectableButton.up = skin.getDrawable("holo-pane");
 | 
			
		||||
		skin.add("selectable-button", selectableButton);
 | 
			
		||||
		
 | 
			
		||||
		ButtonStyle selectableCleanButton = new ButtonStyle();
 | 
			
		||||
		skin.add("selectable-clean-button", selectableCleanButton);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
@@ -220,6 +217,14 @@ public class DesktopAssetPack implements AssetPack {
 | 
			
		||||
	@Override
 | 
			
		||||
	public void complete(AssetManager assetManager) {
 | 
			
		||||
		assetManager.get("standard_thrust.p", ParticleEffect.class).flipY();
 | 
			
		||||
		
 | 
			
		||||
		Preferences controlsPrefs = Gdx.app.getPreferences("RhythmBullet_Controls");
 | 
			
		||||
		Controls.UP.loadKeyFromPreferences(controlsPrefs);
 | 
			
		||||
		Controls.DOWN.loadKeyFromPreferences(controlsPrefs);
 | 
			
		||||
		Controls.LEFT.loadKeyFromPreferences(controlsPrefs);
 | 
			
		||||
		Controls.RIGHT.loadKeyFromPreferences(controlsPrefs);
 | 
			
		||||
		Controls.SHOOT.loadKeyFromPreferences(controlsPrefs);
 | 
			
		||||
		Controls.ACCELERATE.loadKeyFromPreferences(controlsPrefs);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,7 @@
 | 
			
		||||
package zero1hd.rhythmbullet.desktop;
 | 
			
		||||
 | 
			
		||||
import java.awt.Canvas;
 | 
			
		||||
import java.awt.Color;
 | 
			
		||||
 | 
			
		||||
import javax.swing.JFrame;
 | 
			
		||||
 | 
			
		||||
import org.lwjgl.LWJGLException;
 | 
			
		||||
import org.lwjgl.opengl.AWTGLCanvas;
 | 
			
		||||
 | 
			
		||||
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
 | 
			
		||||
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
 | 
			
		||||
import com.badlogic.gdx.backends.lwjgl.LwjglGraphics;
 | 
			
		||||
 | 
			
		||||
import zero1hd.rhythmbullet.RhythmBullet;
 | 
			
		||||
import zero1hd.rhythmbullet.desktop.screens.SplashScreen;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,123 +0,0 @@
 | 
			
		||||
package zero1hd.rhythmbullet.desktop.graphics.ui.components;
 | 
			
		||||
 | 
			
		||||
import com.badlogic.gdx.Gdx;
 | 
			
		||||
import com.badlogic.gdx.Input.Keys;
 | 
			
		||||
import com.badlogic.gdx.graphics.Color;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.Actor;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.InputEvent;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.InputListener;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.actions.Actions;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.ui.Label;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.ui.Table;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.utils.FocusListener;
 | 
			
		||||
import com.badlogic.gdx.utils.Align;
 | 
			
		||||
 | 
			
		||||
import zero1hd.rhythmbullet.controls.KeyMap;
 | 
			
		||||
 | 
			
		||||
public class ControlOptions extends Table {
 | 
			
		||||
	private KeyBindButton selected;
 | 
			
		||||
	
 | 
			
		||||
	public ControlOptions(Skin skin, KeyMap keyMap) {
 | 
			
		||||
		super(skin);
 | 
			
		||||
		align(Align.center);
 | 
			
		||||
		
 | 
			
		||||
		ClickListener selectedListener = new ClickListener() {
 | 
			
		||||
			@Override
 | 
			
		||||
			public void clicked(InputEvent event, float x, float y) {
 | 
			
		||||
				getStage().setKeyboardFocus(event.getTarget());
 | 
			
		||||
				event.getTarget().setColor(Color.ORANGE);
 | 
			
		||||
				selected = (KeyBindButton) event.getTarget();
 | 
			
		||||
				super.clicked(event, x, y);
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
		
 | 
			
		||||
		InputListener keyPressedListener = new InputListener() {
 | 
			
		||||
			@Override
 | 
			
		||||
			public boolean keyUp(InputEvent event, int keycode) {
 | 
			
		||||
				getStage().setKeyboardFocus(null);
 | 
			
		||||
				Gdx.app.debug("KeySetter", "input keycode received: " + keycode);
 | 
			
		||||
				if (keycode != Keys.ESCAPE) {
 | 
			
		||||
					Gdx.app.debug("keySetter", "input has been set to: " + Keys.toString(keycode));
 | 
			
		||||
					if (selected.setKey(keycode)) {
 | 
			
		||||
						keyMap.updateKeys();
 | 
			
		||||
						selected.addAction(Actions.sequence(Actions.color(Color.GREEN, 0.2f), Actions.color(Color.WHITE, 0.2f)));
 | 
			
		||||
					} else {
 | 
			
		||||
						selected.addAction(Actions.sequence(Actions.color(Color.RED, 0.2f), Actions.delay(0.1f), Actions.color(Color.WHITE, 0.2f)));
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				return super.keyUp(event, keycode);
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
		
 | 
			
		||||
		FocusListener deselected = new FocusListener() {
 | 
			
		||||
			@Override
 | 
			
		||||
			public void keyboardFocusChanged(FocusEvent event, Actor actor, boolean focused) {
 | 
			
		||||
				if (!focused) {
 | 
			
		||||
					unselect();
 | 
			
		||||
				}
 | 
			
		||||
				super.keyboardFocusChanged(event, actor, focused);
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
		
 | 
			
		||||
		Label forwardKeyLabel = new Label("Forward: ",skin);
 | 
			
		||||
		forwardKeyLabel.setName(KeyMap.UP);
 | 
			
		||||
		add(forwardKeyLabel).left();
 | 
			
		||||
		KeyBindButton forwardKeySetter = new KeyBindButton(keyMap, KeyMap.UP, selectedListener, keyPressedListener, deselected);
 | 
			
		||||
		add(forwardKeySetter).spaceRight(45f);
 | 
			
		||||
		Label shootKeyLabel = new Label("Shoot: ", skin);
 | 
			
		||||
		shootKeyLabel.setName(KeyMap.SHOOT);
 | 
			
		||||
		add(shootKeyLabel).left();
 | 
			
		||||
		KeyBindButton shootKeySetter = new KeyBindButton(keyMap, KeyMap.SHOOT, selectedListener, keyPressedListener, deselected);
 | 
			
		||||
		add(shootKeySetter);
 | 
			
		||||
		
 | 
			
		||||
		row();
 | 
			
		||||
 | 
			
		||||
		Label backwardKeyLabel = new Label("Backward: ", skin);
 | 
			
		||||
		backwardKeyLabel.setName(KeyMap.DOWN);
 | 
			
		||||
		add(backwardKeyLabel).left();
 | 
			
		||||
		KeyBindButton backwardKeySetter = new KeyBindButton(keyMap, KeyMap.DOWN, selectedListener, keyPressedListener, deselected);
 | 
			
		||||
		add(backwardKeySetter).spaceRight(45f);
 | 
			
		||||
		Label sector1TPKeyLabel = new Label("Left Teleport", skin);
 | 
			
		||||
		sector1TPKeyLabel.setName(KeyMap.FIRSTTHIRDTELEPORT);
 | 
			
		||||
		add(sector1TPKeyLabel).left();
 | 
			
		||||
		KeyBindButton Sector1TPKeySetter = new KeyBindButton(keyMap, KeyMap.FIRSTTHIRDTELEPORT, selectedListener, keyPressedListener, deselected);
 | 
			
		||||
		Sector1TPKeySetter.addListener(selectedListener);
 | 
			
		||||
		add(Sector1TPKeySetter);
 | 
			
		||||
		
 | 
			
		||||
		row();
 | 
			
		||||
		
 | 
			
		||||
		Label leftKeyLabel = new Label("Left: ", skin);
 | 
			
		||||
		leftKeyLabel.setName(KeyMap.LEFT);
 | 
			
		||||
		add(leftKeyLabel).left();
 | 
			
		||||
		KeyBindButton leftKeySetter = new KeyBindButton(keyMap, KeyMap.LEFT, selectedListener, keyPressedListener, deselected);
 | 
			
		||||
		add(leftKeySetter).spaceRight(45f);
 | 
			
		||||
		Label sector2TPKeyLabel = new Label("Middle Teleport: ", skin);
 | 
			
		||||
		sector2TPKeyLabel.setName(KeyMap.SECONDTHIRDTELEPORT);
 | 
			
		||||
		add(sector2TPKeyLabel).left();
 | 
			
		||||
		KeyBindButton sector2TPKeySetter = new KeyBindButton(keyMap, KeyMap.SECONDTHIRDTELEPORT, selectedListener, keyPressedListener, deselected);
 | 
			
		||||
		sector2TPKeySetter.addListener(selectedListener);
 | 
			
		||||
		add(sector2TPKeySetter);
 | 
			
		||||
		
 | 
			
		||||
		row();
 | 
			
		||||
		
 | 
			
		||||
		Label rightKeyLabel = new Label("Right: ", skin);
 | 
			
		||||
		rightKeyLabel.setName(KeyMap.RIGHT);
 | 
			
		||||
		add(rightKeyLabel).left();
 | 
			
		||||
		KeyBindButton rightKeySetter = new KeyBindButton(keyMap, KeyMap.RIGHT, selectedListener, keyPressedListener, deselected);
 | 
			
		||||
		add(rightKeySetter).spaceRight(45f);
 | 
			
		||||
		Label sector3TPKeyLabel = new Label("Right Teleport: ", skin);
 | 
			
		||||
		sector3TPKeyLabel.setName(KeyMap.THIRDTHIRDTELEPORT);
 | 
			
		||||
		add(sector3TPKeyLabel).left();
 | 
			
		||||
		KeyBindButton sector3TPKeySetter = new KeyBindButton(keyMap, KeyMap.THIRDTHIRDTELEPORT, selectedListener, keyPressedListener, deselected);
 | 
			
		||||
		sector3TPKeySetter.addListener(selectedListener);
 | 
			
		||||
		add(sector3TPKeySetter);
 | 
			
		||||
		
 | 
			
		||||
		setFillParent(true);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private void unselect() {
 | 
			
		||||
		selected.setColor(Color.WHITE);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -1,45 +0,0 @@
 | 
			
		||||
package zero1hd.rhythmbullet.desktop.graphics.ui.components;
 | 
			
		||||
 | 
			
		||||
import com.badlogic.gdx.graphics.g2d.Batch;
 | 
			
		||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.Actor;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.InputListener;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.utils.FocusListener;
 | 
			
		||||
 | 
			
		||||
import zero1hd.rhythmbullet.controls.KeyMap;
 | 
			
		||||
 | 
			
		||||
public class KeyBindButton extends Actor {
 | 
			
		||||
	private TextureRegion keyIcon;
 | 
			
		||||
	private KeyMap keyMap;
 | 
			
		||||
	private String controlKey;
 | 
			
		||||
	
 | 
			
		||||
	public KeyBindButton(final KeyMap keyMap, final String control, ClickListener selectionListener, InputListener keyPressListener, FocusListener deselectedListener) {
 | 
			
		||||
		this.keyMap = keyMap;
 | 
			
		||||
		this.keyIcon = keyMap.getIcon(keyMap.stringToID(control));
 | 
			
		||||
		this.controlKey = control;
 | 
			
		||||
		setSize(keyIcon.getRegionWidth(), keyIcon.getRegionHeight());
 | 
			
		||||
		
 | 
			
		||||
		addListener(selectionListener);
 | 
			
		||||
		addListener(keyPressListener);
 | 
			
		||||
		addListener(deselectedListener);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	public boolean setKey(int keycode) {
 | 
			
		||||
		if (keyMap.getIcon(keycode) != null) {
 | 
			
		||||
			keyMap.getKeys().putInteger(controlKey, keycode);
 | 
			
		||||
			keyIcon = keyMap.getIcon(keycode);
 | 
			
		||||
			return true;
 | 
			
		||||
		} else {
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public void draw(Batch batch, float parentAlpha) {
 | 
			
		||||
		batch.setColor(getColor());
 | 
			
		||||
		batch.draw(keyIcon, getX(), getY(), getWidth(), getHeight());
 | 
			
		||||
		super.draw(batch, parentAlpha);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -13,13 +13,11 @@ import zero1hd.rhythmbullet.RhythmBullet;
 | 
			
		||||
import zero1hd.rhythmbullet.audio.MusicController;
 | 
			
		||||
import zero1hd.rhythmbullet.audio.visualizer.CircularVisualizer;
 | 
			
		||||
import zero1hd.rhythmbullet.desktop.audio.PCMObtainer;
 | 
			
		||||
import zero1hd.rhythmbullet.game.GameController;
 | 
			
		||||
 | 
			
		||||
public class GameScreen extends ScreenAdapter {
 | 
			
		||||
	private AssetManager assets;
 | 
			
		||||
	private SpriteBatch batch;
 | 
			
		||||
	private ExtendViewport viewport;
 | 
			
		||||
	private GameController gc;
 | 
			
		||||
	private CircularVisualizer circleVisualizer;
 | 
			
		||||
	
 | 
			
		||||
	public GameScreen(AssetManager assets, Preferences prefs, MusicController musicController) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,30 +1,224 @@
 | 
			
		||||
package zero1hd.rhythmbullet.desktop.screens.main;
 | 
			
		||||
 | 
			
		||||
import com.badlogic.gdx.Gdx;
 | 
			
		||||
import com.badlogic.gdx.Preferences;
 | 
			
		||||
import com.badlogic.gdx.Input.Keys;
 | 
			
		||||
import com.badlogic.gdx.assets.AssetManager;
 | 
			
		||||
import com.badlogic.gdx.graphics.Color;
 | 
			
		||||
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
 | 
			
		||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
 | 
			
		||||
import com.badlogic.gdx.math.Vector3;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.Actor;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.InputEvent;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.InputListener;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.Touchable;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.actions.Actions;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.ui.Button;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.ui.ButtonGroup;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.ui.Image;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.ui.Label;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.ui.VerticalGroup;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
 | 
			
		||||
import com.badlogic.gdx.utils.Array;
 | 
			
		||||
 | 
			
		||||
import zero1hd.rhythmbullet.controls.KeyMap;
 | 
			
		||||
import zero1hd.rhythmbullet.desktop.graphics.ui.components.ControlOptions;
 | 
			
		||||
import zero1hd.rhythmbullet.desktop.Controls;
 | 
			
		||||
import zero1hd.rhythmbullet.graphics.ui.Page;
 | 
			
		||||
 | 
			
		||||
public class KeybindPage extends Page {
 | 
			
		||||
	private ControlOptions controlTable;
 | 
			
		||||
	private KeyMap keyMap;
 | 
			
		||||
	private TextButton backButton;
 | 
			
		||||
	private ButtonGroup<KeyChangeButton> buttonOptions;
 | 
			
		||||
	private VerticalGroup group;
 | 
			
		||||
	private ScrollPane scrollPane;
 | 
			
		||||
	private Skin skin;
 | 
			
		||||
	TextureAtlas keyTextures;
 | 
			
		||||
	private Preferences keyBindPrefs;
 | 
			
		||||
	private InputListener inputListener;
 | 
			
		||||
	private ChangeListener checkedListener;
 | 
			
		||||
	
 | 
			
		||||
	public KeybindPage(AssetManager assetManager, Skin skin, ChangeListener backButtonListener) {
 | 
			
		||||
		super(-1, -1);
 | 
			
		||||
		keyMap = new KeyMap(assetManager);
 | 
			
		||||
		controlTable = new ControlOptions(skin, keyMap);
 | 
			
		||||
		
 | 
			
		||||
		addActor(controlTable);
 | 
			
		||||
		
 | 
			
		||||
		backButton = new TextButton("Back", skin);
 | 
			
		||||
		backButton.setPosition(10, getHeight() - 10 - backButton.getHeight());
 | 
			
		||||
		backButton.setWidth(backButton.getWidth() + 20);
 | 
			
		||||
		setTouchable(Touchable.enabled);
 | 
			
		||||
		this.skin = skin;
 | 
			
		||||
		keyTextures = assetManager.get("keyboard.atlas", TextureAtlas.class);
 | 
			
		||||
		this.keyBindPrefs = Gdx.app.getPreferences("PolyJet_Controls");		
 | 
			
		||||
		TextButton backButton = new TextButton("Back", skin);
 | 
			
		||||
		backButton.setWidth(backButton.getWidth()+20f);
 | 
			
		||||
		backButton.setPosition(getWidth()-backButton.getWidth()-15f, getHeight() - backButton.getHeight() - 15f);
 | 
			
		||||
		backButton.addListener(backButtonListener);
 | 
			
		||||
		
 | 
			
		||||
		addActor(backButton);
 | 
			
		||||
		
 | 
			
		||||
		inputListener = new InputListener() {
 | 
			
		||||
			@Override
 | 
			
		||||
			public boolean keyUp(InputEvent event, int keycode) {
 | 
			
		||||
				KeyChangeButton button = buttonOptions.getChecked();
 | 
			
		||||
				if (button != null) {
 | 
			
		||||
					if (keycode != Keys.ESCAPE) {
 | 
			
		||||
						button.attemptSetKeycode(keycode);
 | 
			
		||||
					}
 | 
			
		||||
					getStage().setKeyboardFocus(null);
 | 
			
		||||
				}
 | 
			
		||||
				return super.keyUp(event, keycode);
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
		
 | 
			
		||||
		checkedListener = new ChangeListener() {
 | 
			
		||||
			@Override
 | 
			
		||||
			public void changed(ChangeEvent event, Actor actor) {
 | 
			
		||||
				KeyChangeButton button = (KeyChangeButton) actor;
 | 
			
		||||
				if (button.isChecked()) {
 | 
			
		||||
					button.ready();
 | 
			
		||||
				} else {
 | 
			
		||||
					button.done();
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
		
 | 
			
		||||
		buttonOptions = new ButtonGroup<>();
 | 
			
		||||
		buttonOptions.setMinCheckCount(0);
 | 
			
		||||
		buttonOptions.setMaxCheckCount(1);
 | 
			
		||||
		group = new VerticalGroup();
 | 
			
		||||
		group.setTouchable(Touchable.childrenOnly);
 | 
			
		||||
		group.space(15f);
 | 
			
		||||
		Controls[] controls = Controls.values();
 | 
			
		||||
		for (int i = 0; i < controls.length; i++) {
 | 
			
		||||
			KeyChangeButton button = new KeyChangeButton(controls[i]);
 | 
			
		||||
			buttonOptions.add(button);
 | 
			
		||||
			group.addActor(button);
 | 
			
		||||
		}
 | 
			
		||||
		scrollPane = new ScrollPane(group);
 | 
			
		||||
		scrollPane.setHeight(Math.min(getHeight(), group.getPrefHeight()));
 | 
			
		||||
		scrollPane.setWidth(group.getPrefWidth());
 | 
			
		||||
		scrollPane.setPosition((getWidth()-scrollPane.getWidth())/2f, (getHeight()-scrollPane.getHeight())/2f);
 | 
			
		||||
		scrollPane.setTouchable(Touchable.childrenOnly);
 | 
			
		||||
		addActor(scrollPane);
 | 
			
		||||
		addListener(new ClickListener() {
 | 
			
		||||
			@Override
 | 
			
		||||
			public void clicked(InputEvent event, float x, float y) {
 | 
			
		||||
				if (hit(x, y, true) == event.getListenerActor()) {
 | 
			
		||||
					simpleDebug("unchecking selected key change buttons.");
 | 
			
		||||
					buttonOptions.uncheckAll();
 | 
			
		||||
				}
 | 
			
		||||
				super.clicked(event, x, y);
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public void setCameraPositionToPage(Vector3 cameraPosition) {
 | 
			
		||||
		getStage().setScrollFocus(scrollPane);
 | 
			
		||||
		super.setCameraPositionToPage(cameraPosition);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public void dispose() {
 | 
			
		||||
		save();
 | 
			
		||||
		super.dispose();
 | 
			
		||||
	}
 | 
			
		||||
	public void save() {
 | 
			
		||||
		keyBindPrefs.flush();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public class KeyChangeButton extends Button {
 | 
			
		||||
		private Image keyImage;
 | 
			
		||||
		private Label nameLabel;
 | 
			
		||||
		private Controls control;
 | 
			
		||||
		private boolean error;
 | 
			
		||||
		
 | 
			
		||||
		public KeyChangeButton(Controls control) {
 | 
			
		||||
			super(skin, "selectable-clean-button");
 | 
			
		||||
			this.control = control;
 | 
			
		||||
			nameLabel = new Label(control.toString(), skin);
 | 
			
		||||
			keyImage = new Image(getIcon(control.getKeycode()));
 | 
			
		||||
			
 | 
			
		||||
			add(nameLabel).expandX().left().spaceRight(20f);
 | 
			
		||||
			add(keyImage).expandX().right();
 | 
			
		||||
			
 | 
			
		||||
			addListener(inputListener);
 | 
			
		||||
			addListener(checkedListener);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		public void attemptSetKeycode(int keycode) {
 | 
			
		||||
			simpleDebug("Attempting to set keycode to " + keycode);
 | 
			
		||||
			TextureRegion textureRegion = getIcon(keycode);
 | 
			
		||||
			if (textureRegion != null) {
 | 
			
		||||
				setKeycode(keycode, textureRegion);
 | 
			
		||||
				error = false;
 | 
			
		||||
			} else {
 | 
			
		||||
				error = true;
 | 
			
		||||
			}
 | 
			
		||||
			setChecked(false);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		public void setKeycode(int keycode, TextureRegion texture) {
 | 
			
		||||
			
 | 
			
		||||
			Controls conflict = control.setKeycode(keycode);
 | 
			
		||||
			if (conflict != null) {
 | 
			
		||||
				Array<KeyChangeButton> buttons = buttonOptions.getButtons();
 | 
			
		||||
				for (int i = 0; i < buttons.size; i++) {
 | 
			
		||||
					System.out.println(buttons.get(i).getControl());
 | 
			
		||||
					if (buttons.get(i).getControl() == conflict) {
 | 
			
		||||
						KeyChangeButton b = buttons.get(i);
 | 
			
		||||
						scrollPane.scrollTo(b.getX(), b.getY(), b.getWidth(), b.getHeight());
 | 
			
		||||
						b.done(true);
 | 
			
		||||
						return;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			} 
 | 
			
		||||
			TextureRegion textureRegion = getIcon(keycode);
 | 
			
		||||
			if (textureRegion != null) {
 | 
			
		||||
				keyImage.setDrawable(new TextureRegionDrawable(texture));
 | 
			
		||||
				control.saveKeyToPreferences(keyBindPrefs);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		public void ready() {
 | 
			
		||||
			getStage().setKeyboardFocus(this);
 | 
			
		||||
			keyImage.setColor(Color.ORANGE);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		public void done() {
 | 
			
		||||
			done(error);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		public void done(boolean error) {
 | 
			
		||||
			if (error) {
 | 
			
		||||
				keyImage.addAction(Actions.repeat(3, Actions.sequence(Actions.color(Color.RED, 0.2f), Actions.color(Color.WHITE, 0.1f))));
 | 
			
		||||
			} else {
 | 
			
		||||
				keyImage.addAction(Actions.color(Color.WHITE, 0.2f));
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		public Controls getControl() {
 | 
			
		||||
			return control;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public TextureRegion getIcon(int keycode) {
 | 
			
		||||
		switch (keycode) {
 | 
			
		||||
		case Keys.ALT_LEFT:
 | 
			
		||||
		case Keys.ALT_RIGHT:
 | 
			
		||||
			return keyTextures.findRegion("Keyboard_Black_Alt");
 | 
			
		||||
		case Keys.SHIFT_LEFT:
 | 
			
		||||
		case Keys.SHIFT_RIGHT:
 | 
			
		||||
			return keyTextures.findRegion("Keyboard_Black_Shift");
 | 
			
		||||
		case Keys.LEFT_BRACKET:
 | 
			
		||||
			return keyTextures.findRegion("Keyboard_Black_Bracket_Left");
 | 
			
		||||
		case Keys.RIGHT_BRACKET:
 | 
			
		||||
			return keyTextures.findRegion("Keyboard_Black_Bracket_Right");
 | 
			
		||||
		case Keys.SEMICOLON:
 | 
			
		||||
			return keyTextures.findRegion("Keyboard_Black_Semicolon");
 | 
			
		||||
		case Keys.SLASH:
 | 
			
		||||
			return keyTextures.findRegion("Keyboard_Black_Slash");
 | 
			
		||||
		case Keys.NUM:
 | 
			
		||||
			return keyTextures.findRegion("Keyboard_Black_Num_Lock");
 | 
			
		||||
		case Keys.ESCAPE:
 | 
			
		||||
			return null;
 | 
			
		||||
		default:
 | 
			
		||||
			return keyTextures.findRegion("Keyboard_Black_" + Keys.toString(keycode).replace(' ', '_'));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
package zero1hd.rhythmbullet.desktop.screens.main;
 | 
			
		||||
 | 
			
		||||
import com.badlogic.gdx.Gdx;
 | 
			
		||||
import com.badlogic.gdx.Input.Keys;
 | 
			
		||||
import com.badlogic.gdx.ScreenAdapter;
 | 
			
		||||
import com.badlogic.gdx.graphics.GL20;
 | 
			
		||||
import com.badlogic.gdx.graphics.Texture;
 | 
			
		||||
@@ -9,11 +8,8 @@ import com.badlogic.gdx.graphics.g2d.Batch;
 | 
			
		||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
 | 
			
		||||
import com.badlogic.gdx.math.Vector3;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.Actor;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.InputEvent;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.InputListener;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.Stage;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
 | 
			
		||||
import com.badlogic.gdx.utils.viewport.ScreenViewport;
 | 
			
		||||
 | 
			
		||||
import zero1hd.rhythmbullet.RhythmBullet;
 | 
			
		||||
@@ -139,28 +135,6 @@ public class MainScreen extends ScreenAdapter implements ResizeReadyScreen {
 | 
			
		||||
		analysisPage = new AnalysisPage(rhythmBullet.getSkin(), listeners.returnToMainPageListener, listeners.confirmedSongListener);
 | 
			
		||||
		stage.addActor(analysisPage);
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
		stage.addListener(new InputListener() {
 | 
			
		||||
			@Override
 | 
			
		||||
			public boolean keyUp(InputEvent event, int keycode) {
 | 
			
		||||
				if (keycode == Keys.ESCAPE) {
 | 
			
		||||
					stage.unfocusAll();
 | 
			
		||||
				}
 | 
			
		||||
				return super.keyUp(event, keycode);
 | 
			
		||||
			}
 | 
			
		||||
		});	
 | 
			
		||||
		
 | 
			
		||||
		stage.addListener(new ClickListener() {
 | 
			
		||||
			@Override
 | 
			
		||||
			public void clicked(InputEvent event, float x, float y) {
 | 
			
		||||
				if (stage.hit(x, y, true) == null) {
 | 
			
		||||
					stage.unfocusAll();
 | 
			
		||||
				}
 | 
			
		||||
				super.clicked(event, x, y);
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
		
 | 
			
		||||
		musicController.getMusicList().asyncSearch(false);
 | 
			
		||||
		resizing = false;
 | 
			
		||||
	}
 | 
			
		||||
@@ -221,7 +195,6 @@ public class MainScreen extends ScreenAdapter implements ResizeReadyScreen {
 | 
			
		||||
			@Override
 | 
			
		||||
			public void changed(ChangeEvent event, Actor actor) {
 | 
			
		||||
				setDisplayedPage(musicSelectionPage);
 | 
			
		||||
				stage.setKeyboardFocus(musicSelectionPage);
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
		
 | 
			
		||||
 
 | 
			
		||||
@@ -26,8 +26,6 @@ import com.badlogic.gdx.scenes.scene2d.ui.Table;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.ui.VerticalGroup;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.utils.Drawable;
 | 
			
		||||
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
 | 
			
		||||
import com.badlogic.gdx.utils.Align;
 | 
			
		||||
import com.badlogic.gdx.utils.Array;
 | 
			
		||||
@@ -57,6 +55,8 @@ public class MusicSelectionPage extends Page implements Observer {
 | 
			
		||||
	
 | 
			
		||||
	private boolean down, up;
 | 
			
		||||
	
 | 
			
		||||
	private boolean frameUsed;
 | 
			
		||||
	
 | 
			
		||||
	private TextButton beginButton;
 | 
			
		||||
	
 | 
			
		||||
	private float scrollTimer, scrollDelay = 0.2f, scrollDelMod, songSelectionTimer;
 | 
			
		||||
@@ -77,6 +77,7 @@ public class MusicSelectionPage extends Page implements Observer {
 | 
			
		||||
		scrollPane.setSize(0.45f*getWidth(), getHeight());
 | 
			
		||||
		scrollPane.setOverscroll(false, false);
 | 
			
		||||
		scrollPane.setClamp(true);
 | 
			
		||||
		scrollPane.setSmoothScrolling(false);
 | 
			
		||||
		scrollPane.setColor(Color.BLUE);
 | 
			
		||||
		addActor(scrollPane);
 | 
			
		||||
		back = new TextButton("Back", skin);
 | 
			
		||||
@@ -121,11 +122,18 @@ public class MusicSelectionPage extends Page implements Observer {
 | 
			
		||||
		
 | 
			
		||||
		mmc.addObserver(this);
 | 
			
		||||
		mc.addObserver(this);
 | 
			
		||||
		mc.getMusicList().addObserver(this);
 | 
			
		||||
		selectionLoaderThread = new musicSelectionLoaderThread();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public void act(float delta) {
 | 
			
		||||
		
 | 
			
		||||
		if (frameUsed) {
 | 
			
		||||
			frameUsed = false;
 | 
			
		||||
			simpleDebug("New frame.");
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		if (down) {
 | 
			
		||||
			if (scrollDelMod > 0.25f) {
 | 
			
		||||
				scrollDelMod -= delta/0.5f;
 | 
			
		||||
@@ -210,24 +218,31 @@ public class MusicSelectionPage extends Page implements Observer {
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public void dispose() {
 | 
			
		||||
		mc.getMusicList().deleteObserver(this);
 | 
			
		||||
		super.dispose();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public void update(Observable o, Object arg) {
 | 
			
		||||
		if (o == mmc) {
 | 
			
		||||
			musicInfoTable.setToDefault();
 | 
			
		||||
			selectionLoaderThread.start();
 | 
			
		||||
		} else if (o == mc) {
 | 
			
		||||
			if (mc.getMusicList().getTotal() == selectables.size() && mc.getCurrentMusicFileHandle() != selectables.getChecked().getMetadata().getFileHandle()) {
 | 
			
		||||
				selectables.setChecked(mc.getCurrentMusicFileHandle());
 | 
			
		||||
			}
 | 
			
		||||
		} else if (o == mc.getMusicList()) {
 | 
			
		||||
			if (arg == mc.getMusicList().states.LOADING) {
 | 
			
		||||
				vGroup.clear();
 | 
			
		||||
				selectables.clear();
 | 
			
		||||
				musicInfoTable.setToDefault();
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public void setCameraPositionToPage(Vector3 cameraPosition) {
 | 
			
		||||
		getStage().setKeyboardFocus(this);
 | 
			
		||||
		getStage().setScrollFocus(scrollPane);
 | 
			
		||||
		super.setCameraPositionToPage(cameraPosition);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
@@ -244,22 +259,14 @@ public class MusicSelectionPage extends Page implements Observer {
 | 
			
		||||
		@Override
 | 
			
		||||
		public void run() {
 | 
			
		||||
			while (work) {
 | 
			
		||||
				if (selectables.size() != mmc.size()) {
 | 
			
		||||
					selectables.clear();
 | 
			
		||||
					for (int mid = 0; mid < mmc.size(); mid++) {
 | 
			
		||||
 | 
			
		||||
					}
 | 
			
		||||
					selectables.uncheckAll();
 | 
			
		||||
				} else {
 | 
			
		||||
					synchronized (this) {
 | 
			
		||||
				while (queueList.size != 0) {
 | 
			
		||||
							AudioMetadata metadata = queueList.pop();
 | 
			
		||||
					AudioMetadata metadata;
 | 
			
		||||
					synchronized (this) {
 | 
			
		||||
						metadata = queueList.pop();
 | 
			
		||||
						metadata.loadAlbumCover();
 | 
			
		||||
						simpleDebug("Loading " + metadata.getTitle());
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				synchronized (this) {
 | 
			
		||||
					try {
 | 
			
		||||
						wait();
 | 
			
		||||
@@ -283,10 +290,10 @@ public class MusicSelectionPage extends Page implements Observer {
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		public synchronized void queue(AudioMetadata metadata) {
 | 
			
		||||
		public void queue(AudioMetadata metadata) {
 | 
			
		||||
			if (!queueList.contains(metadata, true)) {
 | 
			
		||||
				queueList.add(metadata);
 | 
			
		||||
				notify();
 | 
			
		||||
				start();
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
@@ -298,14 +305,15 @@ public class MusicSelectionPage extends Page implements Observer {
 | 
			
		||||
		private Table informationTable;
 | 
			
		||||
		private Label name, artist;
 | 
			
		||||
		private Label time;
 | 
			
		||||
		private float timeSinceOnScreen;
 | 
			
		||||
		private boolean offScreen;
 | 
			
		||||
		private float timeSinceChanged;
 | 
			
		||||
		private AudioMetadata metadata;
 | 
			
		||||
		private Texture defaultAlbumArt;
 | 
			
		||||
		private TextureRegion albumArtTexture;
 | 
			
		||||
		private boolean albumArtUsed, albumArtAttempted;
 | 
			
		||||
		private boolean albumArtDisplayed, albumArtAttempted;
 | 
			
		||||
		
 | 
			
		||||
		public MusicSelectable(AudioMetadata metadata) {
 | 
			
		||||
			super(skin, "music-selectable");
 | 
			
		||||
			super(skin, "selectable-button");
 | 
			
		||||
			
 | 
			
		||||
			this.metadata = metadata;
 | 
			
		||||
			this.defaultAlbumArt = assets.get("defaultCover.png");
 | 
			
		||||
@@ -314,7 +322,6 @@ public class MusicSelectionPage extends Page implements Observer {
 | 
			
		||||
			albumCoverImage = new Image();
 | 
			
		||||
			updateAlbumArtImage(defaultAlbumArt);
 | 
			
		||||
			
 | 
			
		||||
			setSize(getPrefWidth(), getPrefHeight());
 | 
			
		||||
			informationTable = new Table();
 | 
			
		||||
			informationTable.row().width(0.75f*getWidth());
 | 
			
		||||
			name = new Label(metadata.getTitle(), skin, "default-font", skin.getColor("default"));
 | 
			
		||||
@@ -349,21 +356,27 @@ public class MusicSelectionPage extends Page implements Observer {
 | 
			
		||||
 | 
			
		||||
		@Override
 | 
			
		||||
		public void draw(Batch batch, float parentAlpha) {
 | 
			
		||||
			synchronized (albumCoverImage) {
 | 
			
		||||
			super.draw(batch, parentAlpha);
 | 
			
		||||
		}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		public void onScreenAct(float delta) {
 | 
			
		||||
			timeSinceOnScreen = 0;
 | 
			
		||||
			if (metadata.getAlbumCover() != null && !albumArtUsed) {
 | 
			
		||||
			if (offScreen) {
 | 
			
		||||
				offScreen = false;
 | 
			
		||||
				timeSinceChanged = 0;
 | 
			
		||||
			} else if (timeSinceChanged < 0.75f) {
 | 
			
		||||
				timeSinceChanged += delta;
 | 
			
		||||
			}
 | 
			
		||||
			if (timeSinceChanged >= 0.75f) {
 | 
			
		||||
				if (!frameUsed && metadata.getAlbumCover() != null && !albumArtDisplayed) {
 | 
			
		||||
					updateAlbumArtImage(metadata.getAlbumCover());
 | 
			
		||||
				albumArtUsed = true;
 | 
			
		||||
					albumArtDisplayed = true;
 | 
			
		||||
					frameUsed = true;
 | 
			
		||||
				} else if (!albumArtAttempted) {
 | 
			
		||||
					selectionLoaderThread.queue(metadata);
 | 
			
		||||
					albumArtAttempted = true;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		private void updateAlbumArtImage(Texture texture) {
 | 
			
		||||
			if (texture == null) throw new IllegalArgumentException("Texture can't be null!");
 | 
			
		||||
@@ -372,12 +385,16 @@ public class MusicSelectionPage extends Page implements Observer {
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		public void offScreenAct(float delta) {
 | 
			
		||||
			if (!offScreen) {
 | 
			
		||||
				offScreen = true;
 | 
			
		||||
				timeSinceChanged = 0;
 | 
			
		||||
			}
 | 
			
		||||
			if (metadata.getAlbumCover() != null) {
 | 
			
		||||
				timeSinceOnScreen += delta;
 | 
			
		||||
				if (timeSinceOnScreen >= 2) {
 | 
			
		||||
				timeSinceChanged += delta;
 | 
			
		||||
				if (timeSinceChanged >= 2) {
 | 
			
		||||
					updateAlbumArtImage(defaultAlbumArt);
 | 
			
		||||
					metadata.unloadAlbumCover();
 | 
			
		||||
					albumArtUsed = false;
 | 
			
		||||
					albumArtDisplayed = false;
 | 
			
		||||
					albumArtAttempted = false;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
@@ -446,6 +463,7 @@ public class MusicSelectionPage extends Page implements Observer {
 | 
			
		||||
		protected boolean canCheck(MusicSelectable button, boolean newState) {
 | 
			
		||||
			if (newState) {
 | 
			
		||||
				musicInfoTable.setDisplayedSelectable(button);
 | 
			
		||||
				musicSelectDelay = 0f;
 | 
			
		||||
			}
 | 
			
		||||
			return super.canCheck(button, newState);
 | 
			
		||||
		}
 | 
			
		||||
@@ -464,7 +482,6 @@ public class MusicSelectionPage extends Page implements Observer {
 | 
			
		||||
		private Image albumCover;
 | 
			
		||||
		
 | 
			
		||||
		private Table subInformation;
 | 
			
		||||
		private MusicSelectable displayedSelectable;
 | 
			
		||||
		
 | 
			
		||||
		public InformationTable(float width, float height) {
 | 
			
		||||
			defaults().center();
 | 
			
		||||
@@ -481,7 +498,6 @@ public class MusicSelectionPage extends Page implements Observer {
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		public void setDisplayedSelectable(MusicSelectable displayedSelectable) {
 | 
			
		||||
			this.displayedSelectable = displayedSelectable;
 | 
			
		||||
			if (displayedSelectable != null) {
 | 
			
		||||
				AudioMetadata metadata = displayedSelectable.getMetadata();
 | 
			
		||||
				albumCover.setDrawable(new TextureRegionDrawable(displayedSelectable.getAlbumArtTexture()));
 | 
			
		||||
@@ -502,6 +518,7 @@ public class MusicSelectionPage extends Page implements Observer {
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		public void setToDefault() {
 | 
			
		||||
			
 | 
			
		||||
			clear();
 | 
			
		||||
			subInformation.clear();
 | 
			
		||||
			
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user