package de.samdev.colorrunner.game.renderer; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Preferences; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector3; import de.samdev.colorrunner.CRGame; import de.samdev.colorrunner.game.world.CRGameWorld; import de.samdev.colorrunner.game.world.entities.CRGameEntity; import de.samdev.colorrunner.game.world.entities.MovingEntity; import de.samdev.colorrunner.game.world.map.provider.EndlessMapProvider; import de.samdev.colorrunner.game.world.map.provider.StaticMapProvider; public class CRGameRenderer extends AbstractGameRenderer { private CRGameWorld gameworld; public double avgExecTime = 0; private Preferences endlessGameInfos = Gdx.app.getPreferences("endlessGameInfos"); public CRGameRenderer(CRGameWorld _world, float width, float height) { super(width, height); gameworld = _world; } @Override public void doRender() { updateCameraOffset(gameworld.player.bounds.x + gameworld.player.bounds.width/2); gameworld.camViewBoundaries = getCamViewRectangle(); renderMain(); renderHud(); if (CRGame.DEBUG) renderDebugBoxes(); if (CRGame.DEBUG) renderDebugInfo(); } private void renderDebugBoxes() { shapeRenderer.begin(ShapeType.Line); shapeRenderer.setColor(1, 0, 1, 1); for (CRGameEntity e : gameworld.entities) { shapeRenderer.rect(e.bounds.x, e.bounds.y, e.bounds.width, e.bounds.height); if (e instanceof MovingEntity) { MovingEntity me = (MovingEntity) e; shapeRenderer.line(me.bounds.getCenter(new Vector2()), me.bounds.getCenter(new Vector2()).add(me.getVelocity().x / 15f, 0)); shapeRenderer.line(me.bounds.getCenter(new Vector2()), me.bounds.getCenter(new Vector2()).add(0 , me.getVelocity().y / 15f)); } } shapeRenderer.end(); } private void renderMain() { spriteBatch.begin(); for (CRGameEntity e : gameworld.entities) { TextureRegion tr = new TextureRegion(e.getTexture()); spriteBatch.draw(new TextureRegion(e.getTexture()), e.bounds.x + (e.bounds.width - tr.getRegionWidth())/2, e.bounds.y + (e.bounds.height - tr.getRegionHeight())/2, tr.getRegionWidth()/2, tr.getRegionHeight()/2, tr.getRegionWidth(), tr.getRegionHeight(), e.visualZoomX, e.visualZoomY, e.visualRotation, true); } spriteBatch.enableBlending(); Vector3 cw_coords = cam.unproject(new Vector3(Gdx.graphics.getWidth(), 0, 0)); spriteBatch.draw(CRAssets.TEX_COLORWHEEL, cw_coords.x - 70, cw_coords.y - 70, 64, 64); spriteBatch.disableBlending(); spriteBatch.end(); } private void renderDebugInfo() { beginDebug(); renderDebug("FPS: " + (int)gameworld.fps.getFPS()); renderDebug("Entitys: " + gameworld.entities.size()); renderDebug("ExecTime: " + (int)(avgExecTime*100) / 100.0+ " / " + (int)(10000/gameworld.fps.getFPS())/10.0 + "ms (" + (int)((avgExecTime/(1000/gameworld.fps.getFPS()))*1000) / 10.0 + "%)"); renderDebug("CameraOffset: (" + (int)cam.position.x + "|" + (int)cam.position.y + ")"); renderDebug("Player(x): " + (int)gameworld.player.bounds.x); if (gameworld.mapprovider instanceof EndlessMapProvider) renderDebug("Procedural Piece: \"" + ((EndlessMapProvider)gameworld.mapprovider).getCurrentSection(gameworld.player.bounds).piece_name + "\""); else if (gameworld.mapprovider instanceof StaticMapProvider) renderDebug("Level Progress: " + ((StaticMapProvider)gameworld.mapprovider).mapPlayerPos + "/" + ((StaticMapProvider)gameworld.mapprovider).mapMaxWidth); endDebug(); } private void renderHud(){ beginHud(); renderHud("Points: " + gameworld.scoreMeter, 10); renderHud("Last Best: " + endlessGameInfos.getInteger("lastBest", 0), (Gdx.graphics.getWidth() / 2) - 10); if (gameworld.mapprovider instanceof EndlessMapProvider)renderDebug("Procedural Piece: \"" + ((EndlessMapProvider)gameworld.mapprovider).getCurrentSection(gameworld.player.bounds).piece_name + "\""); endHud(); } }