188 lines
7.2 KiB
Java
188 lines
7.2 KiB
Java
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.Rectangle;
|
|
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.entities.gameentities.floor.FloorTileEntity;
|
|
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();
|
|
shapeRenderer.begin(ShapeType.Line);
|
|
|
|
Rectangle bounds = gameworld.camViewBoundaries;
|
|
|
|
float ftw = FloorTileEntity.FLOORTILE_WIDTH;
|
|
|
|
int minx = (int)((bounds.getX() + 0) / ftw) - 2;
|
|
int miny = (int)((bounds.getY() + 0) / ftw) - 2;
|
|
int maxx = (int)((bounds.getX() + bounds.getWidth()) / ftw) + 2;
|
|
int maxy = (int)((bounds.getY() + bounds.getHeight()) / ftw) + 2;
|
|
|
|
for (int x = minx; x < maxx; x++)
|
|
{
|
|
for (int y = miny; y < maxy; y++)
|
|
{
|
|
switch (gameworld.mapprovider.getTrigger(x, y))
|
|
{
|
|
case RUNBOTTOM:
|
|
shapeRenderer.setColor(1, 0, 0, 1f);
|
|
shapeRenderer.rect(x*ftw+0, y*ftw+0, ftw-0, ftw-0);
|
|
shapeRenderer.rect(x*ftw+4, y*ftw+4, ftw-8, ftw-8);
|
|
shapeRenderer.rect(x*ftw+8, y*ftw+8, ftw-16, ftw-16);
|
|
shapeRenderer.rect(x*ftw+12, y*ftw+12, ftw-24, ftw-24);
|
|
break;
|
|
case RUNTOP:
|
|
shapeRenderer.setColor(0, 1, 0, 1f);
|
|
shapeRenderer.rect(x*ftw+0, y*ftw+0, ftw-0, ftw-0);
|
|
shapeRenderer.rect(x*ftw+4, y*ftw+4, ftw-8, ftw-8);
|
|
shapeRenderer.rect(x*ftw+8, y*ftw+8, ftw-16, ftw-16);
|
|
shapeRenderer.rect(x*ftw+12, y*ftw+12, ftw-24, ftw-24);
|
|
break;
|
|
case FLY:
|
|
shapeRenderer.setColor(0, 0, 1, 1f);
|
|
shapeRenderer.rect(x*ftw+0, y*ftw+0, ftw-0, ftw-0);
|
|
shapeRenderer.rect(x*ftw+4, y*ftw+4, ftw-8, ftw-8);
|
|
shapeRenderer.rect(x*ftw+8, y*ftw+8, ftw-16, ftw-16);
|
|
shapeRenderer.rect(x*ftw+12, y*ftw+12, ftw-24, ftw-24);
|
|
break;
|
|
case END:
|
|
shapeRenderer.setColor(0, 1, 1, 1f);
|
|
shapeRenderer.rect(x*ftw+0, y*ftw+0, ftw-0, ftw-0);
|
|
shapeRenderer.rect(x*ftw+4, y*ftw+4, ftw-8, ftw-8);
|
|
shapeRenderer.rect(x*ftw+8, y*ftw+8, ftw-16, ftw-16);
|
|
shapeRenderer.rect(x*ftw+12, y*ftw+12, ftw-24, ftw-24);
|
|
break;
|
|
|
|
case GRAVITY:
|
|
shapeRenderer.setColor(1, 1, 0, 1f);
|
|
shapeRenderer.rect(x*ftw+0, y*ftw+0, ftw-0, ftw-0);
|
|
shapeRenderer.rect(x*ftw+4, y*ftw+4, ftw-8, ftw-8);
|
|
shapeRenderer.rect(x*ftw+8, y*ftw+8, ftw-16, ftw-16);
|
|
shapeRenderer.rect(x*ftw+12, y*ftw+12, ftw-24, ftw-24);
|
|
break;
|
|
|
|
case NOTHING:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//int px = (int)((gameworld.player.bounds.x + gameworld.player.bounds.width / 2f) / FloorTileEntity.FLOORTILE_WIDTH);
|
|
//int py = (int)((gameworld.player.bounds.y + gameworld.player.bounds.height / 2f) / FloorTileEntity.FLOORTILE_HEIGHT);
|
|
//shapeRenderer.setColor(0, 0, 1, 1f);
|
|
//shapeRenderer.rect(px * FloorTileEntity.FLOORTILE_WIDTH, py * FloorTileEntity.FLOORTILE_HEIGHT, FloorTileEntity.FLOORTILE_WIDTH, FloorTileEntity.FLOORTILE_HEIGHT);
|
|
|
|
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 +
|
|
" | Touch [T;L;B;R] := [" + (gameworld.player.isTouching_TOP()?1:0) +
|
|
";" + (gameworld.player.isTouching_LEFT()?1:0) +
|
|
";" + (gameworld.player.isTouching_BOTTOM()?1:0) +
|
|
";" + (gameworld.player.isTouching_RIGHT()?1:0) + "]");
|
|
|
|
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);
|
|
|
|
renderDebug("Player(tile): [" + (int)(gameworld.player.bounds.x / FloorTileEntity.FLOORTILE_WIDTH) + "|" + (int)(gameworld.player.bounds.y / FloorTileEntity.FLOORTILE_WIDTH) + "]");
|
|
renderDebug("Player(trigger): " + gameworld.player.getTrigger());
|
|
renderDebug("Player(velo): [" + gameworld.player.velocity.x + " | " + gameworld.player.velocity.y + "]");
|
|
|
|
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();
|
|
}
|
|
}
|