package com.indignado.logicbricks.core;
import com.badlogic.ashley.core.EntitySystem;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.ai.msg.MessageManager;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.physics.box2d.*;
import com.badlogic.gdx.utils.Disposable;
import com.badlogic.gdx.utils.IntMap;
import com.indignado.logicbricks.config.Settings;
import com.indignado.logicbricks.systems.DraggableBodySystem;
import com.indignado.logicbricks.systems.LightRenderingSystem;
import com.indignado.logicbricks.systems.LogicBrickSystem;
import com.indignado.logicbricks.systems.RenderingSystem;
import java.util.Iterator;
/**
* @author Rubentxu.
*/
public class Game implements Disposable, ContactListener {
private static String tag = Game.class.getSimpleName();
private static int levelIndex = 0;
private final IntMap<LevelFactory> levelFactories;
private final World physics;
private final LogicBricksEngine engine;
private final RenderingSystem renderingSystem;
private CategoryBitsManager categoryBitsManager;
private float fixedTimesStepAccumulator = 0.0f;
private float fixedTimesStepAccumulatorRatio = 0.0f;
private int nSteps;
private int nStepsClamped;
public Game(LogicBricksEngine engine, World physics) {
this.engine = engine;
this.physics = physics;
renderingSystem = new RenderingSystem();
engine.addSystem(renderingSystem);
levelFactories = new IntMap<LevelFactory>();
categoryBitsManager = new CategoryBitsManager();
//engine.update(0);
Gdx.input.setInputProcessor(engine.getInputs());
physics.setContactListener(this);
Gdx.app.setLogLevel(Settings.DEBUG_LEVEL);
}
public void addLevelCreator(LevelFactory level) {
levelIndex++;
levelFactories.put(levelIndex, level);
}
public int getLevelsSize() {
return levelIndex;
}
public void createLevel(int levelNumber) {
engine.removeAllEntities();
LevelFactory level = levelFactories.get(levelNumber);
if (level != null) {
level.loadAssets();
level.createLevel();
}
if (Settings.DRAGGABLE_BOX2D_BODIES) engine.addSystem(new DraggableBodySystem());
}
public void update() {
update(Gdx.graphics.getDeltaTime());
}
public void update(float dt) {
fixedTimesStepAccumulator += dt;
nSteps = MathUtils.round(fixedTimesStepAccumulator / Settings.FIXED_TIME_STEP);
if(nSteps > 0) fixedTimesStepAccumulator -= nSteps * Settings.FIXED_TIME_STEP;
fixedTimesStepAccumulatorRatio = fixedTimesStepAccumulator / Settings.FIXED_TIME_STEP;
nStepsClamped = Math.min(nSteps, Settings.MAX_STEPS);
for(int i = 0; i < nStepsClamped; ++i) {
singleStep(Settings.FIXED_TIME_STEP);
}
renderingSystem.update(dt);
if(null != engine.getSystem(LightRenderingSystem.class)) engine.getSystem(LightRenderingSystem.class).update(dt);
}
public void singleStep(float dt) {
physics.step(dt, Settings.BOX2D_VELOCITY_ITERATIONS, Settings.BOX2D_POSITION_ITERATIONS);
engine.update(dt);
MessageManager.getInstance().update();
}
private void activeLogicBrickSystemProcessing(boolean active) {
Iterator<EntitySystem> it = engine.getSystems().iterator();
while (it.hasNext()) {
EntitySystem system = it.next();
if (system instanceof LogicBrickSystem) system.setProcessing(active);
}
}
/* public void resize(int width, int height) {
camera.viewportHeight = Settings.HEIGHT;
camera.viewportWidth = (Settings.HEIGHT / height) * width;
}
public void show() {
}
public void hide() {
}*/
public void pause() {
for (EntitySystem system : engine.getSystems()) {
system.setProcessing(false);
}
}
public void resume() {
for (EntitySystem system : engine.getSystems()) {
system.setProcessing(true);
}
}
@Override
public void dispose() {
}
public CategoryBitsManager getCategoryBitsManager() {
return categoryBitsManager;
}
@Override
public void beginContact(Contact contact) {
for (ContactListener contactListener : engine.getContactSystems()) {
contactListener.beginContact(contact);
}
}
@Override
public void endContact(Contact contact) {
for (ContactListener contactListener : engine.getContactSystems()) {
contactListener.endContact(contact);
}
}
@Override
public void preSolve(Contact contact, Manifold oldManifold) {
for (ContactListener contactListener : engine.getContactSystems()) {
contactListener.preSolve(contact, oldManifold);
}
}
@Override
public void postSolve(Contact contact, ContactImpulse impulse) {
for (ContactListener contactListener : engine.getContactSystems()) {
contactListener.postSolve(contact, impulse);
}
}
}