Java tutorial
/* * Copyright 2012 Antti Kolehmainen * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.sturdyhelmetgames.dodgethecars.screen; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.InputAdapter; import com.badlogic.gdx.Screen; import com.badlogic.gdx.graphics.GL10; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Matrix4; import com.sturdyhelmetgames.dodgethecars.DodgeTheCarsGame; import com.sturdyhelmetgames.dodgethecars.assets.Art; /** * Basic stuff needed by all game screens. * * @author Antti 18.6.2012 * */ public abstract class BasicScreen extends InputAdapter implements Screen { public DodgeTheCarsGame game; protected final OrthographicCamera camera = new OrthographicCamera(48, 32); protected final SpriteBatch spriteBatch = new SpriteBatch(); protected final Matrix4 normalProjection = new Matrix4(); protected boolean isGL20Available = false; protected boolean stepped = false; private static final int MAX_FPS = 60; private static final int MIN_FPS = 15; private static final float TIME_STEP = 1f / MAX_FPS; private static final float MAX_STEPS = 1f + MAX_FPS / MIN_FPS; private static final float MAX_TIME_PER_FRAME = TIME_STEP * MAX_STEPS; private float stepTimeLeft; public BasicScreen(DodgeTheCarsGame game) { this.game = game; // check if gl2 is available isGL20Available = Gdx.graphics.isGL20Available(); // reset camera camera.position.set(0, 0, 0); camera.update(); // set a normal projection matrix normalProjection.setToOrtho2D(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); } /** * Does a fixed timestep independently of framerate. * * @param delta * Delta time. * @return True if stepped, false otherwise. */ private void fixedStep(float delta) { stepTimeLeft += delta; if (stepTimeLeft > MAX_TIME_PER_FRAME) stepTimeLeft = MAX_TIME_PER_FRAME; while (stepTimeLeft >= TIME_STEP) { updateScreen(TIME_STEP); stepTimeLeft -= TIME_STEP; } } /** * Updates the game logic. * * @param fixedStep * A fixed timestep. */ protected abstract void updateScreen(float fixedStep); /** * Renders the game graphics. * * @param delta * Delta time. */ public abstract void renderScreen(float delta); @Override public void render(float delta) { fixedStep(delta); if (isGL20Available) { Gdx.graphics.getGL20().glClear(GL20.GL_COLOR_BUFFER_BIT); } else { Gdx.graphics.getGL10().glClear(GL10.GL_COLOR_BUFFER_BIT); } // render screen graphics renderScreen(delta); // render fps if in debug mode if (isDebug()) { spriteBatch.getProjectionMatrix().set(normalProjection); spriteBatch.begin(); Art.debugFont.draw(spriteBatch, "FPS: " + Gdx.graphics.getFramesPerSecond(), 0, 20); spriteBatch.end(); } } @Override public void dispose() { spriteBatch.dispose(); } /** * Is the screen in DEBUG mode? * * @return If screen is in DEBUG mode returns true, otherwise returns false. */ protected boolean isDebug() { return DodgeTheCarsGame.DEBUG; } @Override public void show() { } @Override public void hide() { } @Override public void pause() { } @Override public void resume() { } @Override public void resize(int width, int height) { } }