Pass spritebatch instance to all entity's render methods

Scale spritebatch and shaperenderer projections to PIXEL_PER_METER,
no longer have to scale in each entity's render method
Use a separate spritebatch for font rendering
Dispose the texture atlas
This commit is contained in:
Matt Low 2018-11-22 15:44:13 +04:00
parent 70f142c2fa
commit 53feedf407
11 changed files with 60 additions and 54 deletions

View File

@ -10,9 +10,11 @@ import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.PolygonSpriteBatch;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.math.Matrix4;
import com.badlogic.gdx.utils.viewport.FitViewport;
import com.badlogic.gdx.utils.viewport.Viewport;
import com.me.brickbuster.state.MenuState;
import com.me.brickbuster.state.PlayState;
public class BrickBuster extends Game {
@ -26,8 +28,8 @@ public class BrickBuster extends Game {
public BitmapFont font;
public SpriteBatch sb;
public SpriteBatch fb;
public ShapeRenderer sr;
public PolygonSpriteBatch pb;
public AssetManager assets;
@ -42,8 +44,8 @@ public class BrickBuster extends Game {
font.getRegion().getTexture().setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear);
sb = new SpriteBatch();
fb = new SpriteBatch();
sr = new ShapeRenderer();
pb = new PolygonSpriteBatch();
assets = new AssetManager();
@ -62,9 +64,10 @@ public class BrickBuster extends Game {
public void resize(int width, int height) {
viewport.update(width, height);
sb.setProjectionMatrix(cam.combined);
sr.setProjectionMatrix(cam.combined);
pb.setProjectionMatrix(cam.combined);
Matrix4 projection = cam.combined.cpy().scl(PlayState.PIXEL_PER_METER);
sb.setProjectionMatrix(projection);
fb.setProjectionMatrix(cam.combined);
sr.setProjectionMatrix(projection);
super.resize(width, height);
}

View File

@ -43,15 +43,12 @@ public class Ball extends Entity implements PhysicsBody, CollisionListener {
}
@Override
public void render(ShapeRenderer sr) {
SpriteBatch sb = state.getGame().sb;
sb.begin();
public void render(SpriteBatch sb, ShapeRenderer sr) {
sb.setColor(Color.WHITE);
sb.draw(texture, (pos.x - RADIUS) * PlayState.PIXEL_PER_METER,
(pos.y - RADIUS) * PlayState.PIXEL_PER_METER,
RADIUS*2 * PlayState.PIXEL_PER_METER,
RADIUS*2 * PlayState.PIXEL_PER_METER);
sb.end();
sb.draw(texture, pos.x - RADIUS,
pos.y - RADIUS,
RADIUS*2,
RADIUS*2);
}
@Override

View File

@ -40,15 +40,15 @@ public class Brick extends Entity implements PhysicsBody, CollisionListener {
}
@Override
public void render(ShapeRenderer sr) {
SpriteBatch sb = state.getGame().sb;
public void render(SpriteBatch sb, ShapeRenderer sr) {
sb.setColor(type.getColor());
float x = (getX() - BRICK_WIDTH/2) * PlayState.PIXEL_PER_METER;
float y = (getY() - BRICK_HEIGHT/2) * PlayState.PIXEL_PER_METER;
float x = pos.x - BRICK_WIDTH/2;
float y = pos.y - BRICK_HEIGHT/2;
sb.draw(region, x, y,
BRICK_WIDTH/2 * PlayState.PIXEL_PER_METER, BRICK_HEIGHT/2 * PlayState.PIXEL_PER_METER,
BRICK_WIDTH * PlayState.PIXEL_PER_METER, BRICK_HEIGHT * PlayState.PIXEL_PER_METER,
1f, 1f, MathUtils.radiansToDegrees * body.getAngle());
BRICK_WIDTH/2, BRICK_HEIGHT/2,
BRICK_WIDTH, BRICK_HEIGHT,
1f, 1f,
MathUtils.radiansToDegrees * body.getAngle());
}
@Override

View File

@ -1,5 +1,6 @@
package com.me.brickbuster.entity;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.math.Vector2;
import com.me.brickbuster.state.FieldState;
@ -19,7 +20,7 @@ public abstract class Entity {
this.pos = new Vector2(x, y);
}
public abstract void render(ShapeRenderer sr);
public abstract void render(SpriteBatch sb, ShapeRenderer sr);
public abstract void update(float dt);

View File

@ -3,6 +3,7 @@ package com.me.brickbuster.entity;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
import com.badlogic.gdx.math.MathUtils;
@ -38,13 +39,10 @@ public class Paddle extends Entity implements PhysicsBody {
}
@Override
public void render(ShapeRenderer sr) {
public void render(SpriteBatch sb, ShapeRenderer sr) {
sr.begin(ShapeType.Filled);
sr.setColor(sticky? STICKY_COLOR : PADDLE_COLOR);
sr.rect((getX() - width/2) * PlayState.PIXEL_PER_METER,
getY() * PlayState.PIXEL_PER_METER,
width * PlayState.PIXEL_PER_METER,
PADDLE_HEIGHT * PlayState.PIXEL_PER_METER);
sr.rect(pos.x - width/2, pos.y, width, PADDLE_HEIGHT);
sr.end();
}

View File

@ -1,6 +1,7 @@
package com.me.brickbuster.entity;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
@ -24,12 +25,10 @@ public class Shield extends Entity implements PhysicsBody {
}
@Override
public void render(ShapeRenderer sr) {
public void render(SpriteBatch sb, ShapeRenderer sr) {
sr.begin(ShapeRenderer.ShapeType.Filled);
sr.setColor(PowerUpType.SHIELD.getColor());
sr.rect(0, pos.y * PlayState.PIXEL_PER_METER,
PlayState.BOARD_WIDTH * PlayState.PIXEL_PER_METER,
SHIELD_HEIGHT * PlayState.PIXEL_PER_METER);
sr.rect(0, pos.y, PlayState.BOARD_WIDTH, SHIELD_HEIGHT);
sr.end();
}

View File

@ -1,6 +1,7 @@
package com.me.brickbuster.entity.powerup;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
import com.badlogic.gdx.math.Vector2;
@ -35,12 +36,10 @@ public abstract class PowerUp extends Entity implements PhysicsBody, CollisionLi
}
@Override
public void render(ShapeRenderer sr) {
public void render(SpriteBatch sb, ShapeRenderer sr) {
sr.begin(ShapeType.Filled);
sr.setColor(color);
sr.circle(getX() * PlayState.PIXEL_PER_METER,
getY() * PlayState.PIXEL_PER_METER,
RADIUS * PlayState.PIXEL_PER_METER);
sr.circle(pos.x, pos.y, RADIUS);
sr.end();
}

View File

@ -22,7 +22,7 @@ import java.util.ArrayList;
public class EditorState extends FieldState {
public static final long BLINK_INTERVAL = 250l;
public static final int COLUMNS = 11;
public static final int COLUMNS = 10;
public static final int ROWS = 33;
private Brick placeHolder;
@ -72,25 +72,25 @@ public class EditorState extends FieldState {
}
Brick brick = bricks[col][row];
if (brick != null) {
brick.render(game.sr);
brick.render(game.sb, game.sr);
}
}
}
if (!blink) {
placeHolder.render(game.sr);
placeHolder.render(game.sb, game.sr);
}
game.sb.end();
debugRenderer.render(world, game.cam.combined.cpy().scl(PlayState.PIXEL_PER_METER));
game.sb.begin();
game.fb.begin();
game.font.setColor(Color.GRAY);
game.font.draw(game.sb, String.format("Current powerup: %s", curPowerUpType), 10, 230);
game.font.draw(game.sb, "WASD: Move brick", 10, 170);
game.font.draw(game.sb, "ENTER: Set brick BACKSPACE: Delete brick F12: Save", 10, 110);
game.font.draw(game.sb, "UP/DOWN: type LEFT/RIGHT: shape SPACE: powerup", 10, 55);
game.sb.end();
game.font.draw(game.fb, String.format("Current powerup: %s", curPowerUpType), 10, 230);
game.font.draw(game.fb, "WASD: Move brick", 10, 170);
game.font.draw(game.fb, "ENTER: Set brick BACKSPACE: Delete brick F12: Save", 10, 110);
game.font.draw(game.fb, "UP/DOWN: type LEFT/RIGHT: shape SPACE: powerup", 10, 55);
game.fb.end();
}
@Override

View File

@ -21,4 +21,9 @@ public abstract class FieldState extends State {
textures = game.assets.get("textures.atlas", TextureAtlas.class);
}
@Override
public void dispose() {
textures.dispose();
}
}

View File

@ -21,11 +21,13 @@ public class MenuState extends State {
@Override
public void render() {
game.sb.setProjectionMatrix(game.cam.combined);
game.sb.begin();
game.sb.draw(playButton,
BrickBuster.BOARD_WIDTH/2-playButton.getWidth()/2,
BrickBuster.BOARD_HEIGHT/2-playButton.getHeight()/2);
game.sb.end();
game.sb.setProjectionMatrix(game.cam.combined.cpy().scl(PlayState.PIXEL_PER_METER));
}
@Override

View File

@ -80,30 +80,32 @@ public class PlayState extends FieldState {
}
long start = System.nanoTime();
game.sb.begin();
for (Brick block : bricks) {
block.render(game.sr);
}
game.sb.end();
for (PowerUp powerUp : powerUps) {
powerUp.render(game.sr);
block.render(game.sb, game.sr);
}
for (Ball ball : balls) {
ball.render(game.sr);
ball.render(game.sb, game.sr);
}
game.sb.end();
for (PowerUp powerUp : powerUps) {
powerUp.render(game.sb, game.sr);
}
for (Shield shield : shields) {
shield.render(game.sr);
shield.render(game.sb, game.sr);
}
paddle.render(game.sr);
paddle.render(game.sb, game.sr);
//debugRenderer.render(world, game.cam.combined.cpy().scl(PIXEL_PER_METER));
long renderTime = System.nanoTime() - start;
game.sb.begin();
game.fb.begin();
game.font.setColor(Color.GRAY);
game.font.draw(game.sb, String.format("FPS: %d Update: %.2f ms Render: %.2f ms",
game.font.draw(game.fb, String.format("FPS: %d Update: %.2f ms Render: %.2f ms",
Gdx.graphics.getFramesPerSecond(), updateTime/1000000f, renderTime/1000000f), 10, BrickBuster.BOARD_HEIGHT-10);
game.sb.end();
game.fb.end();
}
@Override