package uk.co.flyingsquirrels.gamestates; import org.jbox2d.collision.AABB; import org.jbox2d.common.Vec2; import org.jbox2d.dynamics.World; import org.newdawn.slick.GameContainer; import org.newdawn.slick.Graphics; import org.newdawn.slick.Input; import org.newdawn.slick.SlickException; import org.newdawn.slick.state.BasicGameState; import org.newdawn.slick.state.StateBasedGame; import uk.co.flyingsquirrels.AdAstra; import uk.co.flyingsquirrels.SelfRenderable; import uk.co.flyingsquirrels.models.Ground; import uk.co.flyingsquirrels.models.Vehicle; import uk.co.flyingsquirrels.rendering.AdAstraDebugDraw; public class PlayingGameState extends BasicGameState { public static final int ID = 3; private static final int WORLD_STEP_ITERATIONS = 10; private static final int VIEW_SCALE_FACTOR = 10; private static final int WORLD_WIDTH = 16000; private static final int WORLD_HEIGHT = 16000; private static final int GROUND_RESOLUTION = 100; private static final int MAX_GROUND_ELEVATION = 3; private static final int MIN_GROUND_ELEVATION = -100; private StateBasedGame game; private int viewTransX; private int viewTransY; private World world; private AdAstraDebugDraw debugDraw; private Vehicle vehicle; @Override public int getID() { return ID; } public void init(GameContainer container, StateBasedGame game) throws SlickException { this.game = game; viewTransX = AdAstra.DISPLAY_WIDTH / VIEW_SCALE_FACTOR / 2; viewTransY = AdAstra.DISPLAY_HEIGHT / VIEW_SCALE_FACTOR / 2; debugDraw = new AdAstraDebugDraw(container.getDefaultFont()); createWorld(); createGround(); createVehicle(); vehicle.setPosition(new Vec2(0, MAX_GROUND_ELEVATION).add(vehicle .getInitialPosition())); vehicle.setVelocity(vehicle.getInitialVelocity()); } private void createWorld() { AABB worldAABB = new AABB(); worldAABB.lowerBound = new Vec2(-WORLD_WIDTH, MIN_GROUND_ELEVATION); worldAABB.upperBound = new Vec2(WORLD_WIDTH, WORLD_HEIGHT); Vec2 gravity = new Vec2(0.0f, -10.0f); world = new World(worldAABB, gravity, false); } private void createGround() { new Ground(world, WORLD_WIDTH, GROUND_RESOLUTION, MAX_GROUND_ELEVATION, MIN_GROUND_ELEVATION); } private void createVehicle() { Class<? extends Vehicle> selectedVehicleClass = AdAstra .getSelectedVehicleClass(); try { vehicle = selectedVehicleClass.getConstructor(World.class) .newInstance(world); } catch (Exception e) { throw new RuntimeException("Could not create new instance of " + selectedVehicleClass, e); } } public void update(GameContainer container, StateBasedGame game, int delta) throws SlickException { vehicle.handleInput(container.getInput()); vehicle.update(delta / 1000f); world.step(delta / 1000f, WORLD_STEP_ITERATIONS); } public void render(GameContainer container, StateBasedGame game, Graphics g) throws SlickException { Vec2 vehiclePosition = vehicle.getPosition(); g.scale(VIEW_SCALE_FACTOR, -VIEW_SCALE_FACTOR); g.translate(-vehiclePosition.x + viewTransX, -1 * (vehiclePosition.y + viewTransY)); doDebugDraw(g); if (vehicle instanceof SelfRenderable) { SelfRenderable selfRenderable = (SelfRenderable) vehicle; selfRenderable.renderToWorld(g); g.resetTransform(); selfRenderable.renderToScreen(AdAstra.DISPLAY_WIDTH, AdAstra.DISPLAY_HEIGHT, g); } } private void doDebugDraw(Graphics g) { world.setDebugDraw(debugDraw); debugDraw.setGraphics(g); world.drawDebugData(); world.setDebugDraw(null); } public void keyReleased(int key, char c) { if (key == Input.KEY_ESCAPE) { game.enterState(OptionsMenuGameState.ID); } } }