package mountainrangepvp.client;
import com.badlogic.gdx.Gdx;
import mountainrangepvp.client.input.InputHandler;
import mountainrangepvp.client.renderer.GameScreen;
import mountainrangepvp.core.*;
import mountainrangepvp.engine.AudioManager;
import mountainrangepvp.engine.Log;
import mountainrangepvp.engine.util.EventBus;
import mountainrangepvp.engine.util.EventHandler;
import mountainrangepvp.net.ServerInterface;
/**
* Container of game systems.
*/
public class ClientGame {
private final GameSettings config;
private final Log log;
private final EventBus eventBus;
private final Client client;
private final AudioManager audioManager;
private final InputHandler inputHandler;
private Session session;
private ClientId localId;
private GameScreen gameScreen;
public ClientGame(GameSettings config, ServerInterface server) {
this.config = config;
log = new Log("client");
eventBus = new EventBus();
client = Client.newClient(log, eventBus, server, config.nickname);
audioManager = new AudioManager();
audioManager.loadAudio(Sounds.SOUNDS);
audioManager.setMuted(true);
inputHandler = new InputHandler(eventBus,
Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
inputHandler.register();
eventBus.subscribe(SnapshotEvent.class, new EventHandler<SnapshotEvent>() {
@Override
public void receive(SnapshotEvent event) {
handleSnapshot(event.snapshot());
}
});
eventBus.subscribe(ConnectedEvent.class, new EventHandler<ConnectedEvent>() {
@Override
public void receive(ConnectedEvent event) {
localId = event.localId();
}
});
}
public void start() {
try {
client.start();
} catch (InterruptedException e) {
log.crash("Could not connect to server", e);
return;
}
// TODO: go to loading screen here (and wait for connection)
}
public void kill() {
client.shutdown();
}
private float timeSinceLastUpdate = 0;
public void render() {
float dt = Gdx.graphics.getDeltaTime();
timeSinceLastUpdate += dt;
if (timeSinceLastUpdate > config.TIMESTEP)
update(dt);
}
private void update(float dt) {
eventBus.flushPendingMessages();
if (session != null) {
inputHandler.update(config.TIMESTEP, session.getCameraRelativeToPlayer());
session.update(dt);
}
timeSinceLastUpdate = 0;
if (gameScreen != null) gameScreen.render(dt, client.lag());
eventBus.resetMessagesPerFrame();
}
private void handleSnapshot(Snapshot s) {
if (session == null) {
ChatManager chatManager = new ChatManager();
session = new Session(log, eventBus, localId, s, chatManager);
gameScreen = new GameScreen(log, eventBus, session);
}
}
}