256 lines
6.4 KiB
Java
Executable File

package zero1hd.polyjet.screens;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.InputMultiplexer;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.ScreenAdapter;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.ImageButton;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.ui.WidgetGroup;
import com.badlogic.gdx.scenes.scene2d.ui.Window;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import zero1hd.polyjet.Polyjet;
import zero1hd.polyjet.audio.AudioData;
import zero1hd.polyjet.ui.stages.GamePlayArea;
import zero1hd.polyjet.ui.windows.FPSWindow;
public class GameScreen extends ScreenAdapter implements InputProcessor {
private GamePlayArea gameArea;
public InputMultiplexer inputs;
public boolean paused = false;
private boolean debug = false;
public Polyjet core;
public Stage overlay;
private Label scoreLabel;
Window pauseMenu;
FPSWindow FPSDisplay;
private AudioData music;
public GameScreen(Polyjet polyJet) {
core = polyJet;
// Overlay stuff
overlay = new Stage();
scoreLabel = new Label("Score: 0", core.getDefaultSkin(), "default-font", Color.WHITE);
scoreLabel.setPosition(25, Gdx.graphics.getHeight() - scoreLabel.getHeight() - 25);
ImageButton pause = new ImageButton(core.getDefaultSkin().getDrawable("pause"),
core.getDefaultSkin().getDrawable("pause-down"));
pause.setPosition(Gdx.graphics.getWidth() - pause.getWidth() - 25,
Gdx.graphics.getHeight() - pause.getHeight() - 25);
pause.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
pause();
}
});
WidgetGroup healthBar = new WidgetGroup();
final Image healthBarTank = new Image(core.getDefaultSkin().getPatch("bar-empty"));
healthBarTank.setHeight(100);
healthBar.setSize(healthBarTank.getWidth(), healthBarTank.getHeight());
healthBar.setPosition(Gdx.graphics.getWidth() - healthBar.getWidth() - 16,
pause.getY() - healthBar.getHeight() - 32);
Image healthBarFiller = new Image(core.getDefaultSkin().getPatch("bar-fill")) {
@Override
public void act(float delta) {
setHeight(
((float) gameArea.getPolyjet().health / (float) gameArea.getMaxHealth()) * (healthBarTank.getHeight()));
super.act(delta);
}
};
healthBar.addActor(healthBarFiller);
healthBar.addActor(healthBarTank);
overlay.addActor(healthBar);
FPSDisplay = new FPSWindow("FPS", core.getDefaultSkin());
overlay.addActor(pause);
overlay.addActor(scoreLabel);
// Pause menu
pauseMenu = new Window("Paused", core.getDefaultSkin());
pauseMenu.add(new TextButton("resume", core.getDefaultSkin()) {
{
addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
reBegin();
}
});
}
}).space(20f);
pauseMenu.setModal(true);
pauseMenu.setPosition((Gdx.graphics.getWidth() - pauseMenu.getWidth()) / 2,
(Gdx.graphics.getHeight() - pauseMenu.getHeight()) / 2);
// Continue to add things to input multiplexer
gameArea = new GamePlayArea(polyJet.getAssetManager());
inputs = new InputMultiplexer();
inputs.addProcessor(this);
inputs.addProcessor(overlay);
inputs.addProcessor(gameArea);
if (!paused) {
music.getPlaybackMusic().play();
}
}
@Override
public void show() {
Gdx.input.setInputProcessor(inputs);
super.show();
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(1f, 1f, 1f, 1f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
Gdx.gl.glLineWidth(1f);
gameArea.getViewport().apply();
gameArea.draw();
overlay.getViewport().apply();
overlay.draw();
if (!paused) {
music.readIndexUpdate();
scoreLabel.setText("Score: " + gameArea.getScore());
gameArea.act(delta);
if (gameArea.getPolyjet().isDead()) {
end(false);
}
overlay.act(delta);
}
if (!music.getPlaybackMusic().isPlaying()) {
end(true);
}
super.render(delta);
}
private void end(boolean trueEnd) {
if (trueEnd) {
// TODO they didn't die
} else {
// TODO They done goofed and ended up dying.
}
}
@Override
public void dispose() {
overlay.dispose();
gameArea.dispose();
super.dispose();
}
@Override
public void resize(int width, int height) {
gameArea.getViewport().update(width, height, true);
overlay.getViewport().update(width, height, true);
super.resize(width, height);
}
@Override
public void pause() {
paused = true;
overlay.addActor(pauseMenu);
music.getPlaybackMusic().pause();
super.pause();
}
@Override
public void resume() {
super.resume();
}
public void reBegin() {
paused = false;
pauseMenu.remove();
music.getPlaybackMusic().play();
}
@Override
public boolean keyUp(int keycode) {
switch (keycode) {
case Keys.F3:
if (debug) {
debug = false;
for (int i = 0; i < gameArea.getActors().size; i++) {
gameArea.setDebugAll(debug);
}
FPSDisplay.remove();
} else {
debug = true;
for (int i = 0; i < gameArea.getActors().size; i++) {
gameArea.setDebugAll(debug);
}
overlay.addActor(FPSDisplay);
}
break;
case Keys.ESCAPE:
if (paused) {
reBegin();
} else {
pause();
}
break;
}
return false;
}
@Override
public boolean keyTyped(char character) {
return false;
}
@Override
public boolean mouseMoved(int screenX, int screenY) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean scrolled(int amount) {
return false;
}
@Override
public boolean keyDown(int keycode) {
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;
}
}