diff --git a/core/src/com/me/brickbuster/BrickBuster.java b/core/src/com/me/brickbuster/BrickBuster.java index eff946f..f75e153 100644 --- a/core/src/com/me/brickbuster/BrickBuster.java +++ b/core/src/com/me/brickbuster/BrickBuster.java @@ -6,6 +6,7 @@ import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; 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.utils.viewport.FitViewport; @@ -25,6 +26,7 @@ public class BrickBuster extends Game { public BitmapFont font; public SpriteBatch sb; public ShapeRenderer sr; + public PolygonSpriteBatch pb; @Override public void create () { @@ -38,6 +40,7 @@ public class BrickBuster extends Game { sb = new SpriteBatch(); sr = new ShapeRenderer(); + pb = new PolygonSpriteBatch(); setScreen(new MenuState(this)); } @@ -56,6 +59,7 @@ public class BrickBuster extends Game { sb.setProjectionMatrix(cam.combined); sr.setProjectionMatrix(cam.combined); + pb.setProjectionMatrix(cam.combined); super.resize(width, height); } diff --git a/core/src/com/me/brickbuster/entity/Brick.java b/core/src/com/me/brickbuster/entity/Brick.java index 59edee9..f7a21ab 100644 --- a/core/src/com/me/brickbuster/entity/Brick.java +++ b/core/src/com/me/brickbuster/entity/Brick.java @@ -1,14 +1,19 @@ package com.me.brickbuster.entity; import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.PolygonRegion; +import com.badlogic.gdx.graphics.g2d.PolygonSpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; -import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType; -import com.badlogic.gdx.math.MathUtils; +import com.badlogic.gdx.math.EarClippingTriangulator; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.physics.box2d.BodyDef; import com.badlogic.gdx.physics.box2d.FixtureDef; import com.badlogic.gdx.physics.box2d.PolygonShape; +import com.badlogic.gdx.utils.ShortArray; import com.me.brickbuster.entity.powerup.PowerUpType; import com.me.brickbuster.physics.CollisionListener; import com.me.brickbuster.physics.EntityType; @@ -21,38 +26,66 @@ public class Brick extends Entity implements PhysicsBody, CollisionListener { public static final float BRICK_WIDTH = 5f; public static final float BRICK_HEIGHT = 2.5f; + private static final EarClippingTriangulator ECT = new EarClippingTriangulator(); + + private BrickType type; + private BrickShape shape; private PowerUpType powerUpType; + private Color color; + private Pixmap pm; + private Texture solid; + private TextureRegion region; private Body body; private boolean hitByBall = false; + private final Vector2 tmp = new Vector2(); + public Brick(PlayState state, PowerUpType powerUpType, float x, float y) { this(state, powerUpType, true, x, y); } - public Brick(PlayState state, PowerUpType powerUpType, boolean hidePowerup, float x, float y) { - this(state, powerUpType, DEFAULT_COLOR, hidePowerup, x, y); + public Brick(PlayState state, BrickShape shape, PowerUpType powerUpType, float x, float y) { + this(state, BrickType.STANDARD_10, shape, powerUpType, DEFAULT_COLOR, true, x, y); } - public Brick(PlayState state, PowerUpType powerUpType, Color color, boolean hidePowerUp, float x, float y) { + public Brick(PlayState state, PowerUpType powerUpType, boolean hidePowerup, float x, float y) { + this(state, BrickType.STANDARD_10, BrickShape.RECTANGLE, powerUpType, DEFAULT_COLOR, hidePowerup, x, y); + } + + public Brick(PlayState state, BrickType type, BrickShape shape, PowerUpType powerUpType, Color color, boolean hidePowerUp, float x, float y) { super(state, x, y); + this.type = type; + this.shape = shape; this.powerUpType = powerUpType; this.color = powerUpType != null && !hidePowerUp? powerUpType.getColor() : color; + this.pm = new Pixmap(1,1, Pixmap.Format.RGBA8888); + pm.setColor(color); + pm.fill(); + this.solid = new Texture(pm); + this.region = new TextureRegion(solid); createBody(); } @Override public void render(ShapeRenderer sr) { - sr.begin(ShapeType.Filled); - sr.setColor(color); - sr.rect((pos.x - BRICK_WIDTH/2) * PlayState.PIXEL_PER_METER, - (pos.y - BRICK_HEIGHT/2) * PlayState.PIXEL_PER_METER, - 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, - body.getAngle() * MathUtils.radiansToDegrees); - sr.end(); + PolygonShape shape = (PolygonShape) body.getFixtureList().get(0).getShape(); + float[] vertices = new float[shape.getVertexCount()*2]; + for (int i = 0; i < vertices.length/2; i++) { + shape.getVertex(i, tmp); + Vector2 vertex = body.getWorldPoint(tmp); + vertices[i*2] = vertex.x * PlayState.PIXEL_PER_METER; + vertices[i*2 + 1] = vertex.y * PlayState.PIXEL_PER_METER; + } + ShortArray triangleIndices = ECT.computeTriangles(vertices); + + PolygonRegion polyRegion = new PolygonRegion(region, vertices, triangleIndices.toArray()); + + PolygonSpriteBatch pb = state.getGame().pb; + pb.begin(); + pb.draw(polyRegion, 0, 0); + pb.end(); } @Override @@ -75,15 +108,28 @@ public class Brick extends Entity implements PhysicsBody, CollisionListener { brickBody.position.set(pos.cpy()); PolygonShape brickShape = new PolygonShape(); - brickShape.setAsBox(BRICK_WIDTH/2, BRICK_HEIGHT/2, - Vector2.Zero, 0); + + switch (shape) { + case DIAMOND: + brickShape.set(new float[] { + -BRICK_WIDTH/2, 0, // Left + 0, BRICK_HEIGHT/2, // UP + BRICK_WIDTH/2, 0, // Right + 0, -BRICK_HEIGHT/2 // Down + }); + break; + default: + brickShape.setAsBox(BRICK_WIDTH/2, BRICK_HEIGHT/2, Vector2.Zero, 0f); + } + FixtureDef brickFixture = new FixtureDef(); brickFixture.shape = brickShape; brickFixture.friction = 0f; + brickFixture.density = 0.5f; brickFixture.filter.categoryBits = EntityType.BRICK; - brickFixture.filter.maskBits = EntityType.BALL; + brickFixture.filter.maskBits = EntityType.BALL | EntityType.BRICK | EntityType.BOUNDARY; body = state.world.createBody(brickBody); body.createFixture(brickFixture); diff --git a/core/src/com/me/brickbuster/entity/BrickShape.java b/core/src/com/me/brickbuster/entity/BrickShape.java new file mode 100644 index 0000000..e35915d --- /dev/null +++ b/core/src/com/me/brickbuster/entity/BrickShape.java @@ -0,0 +1,23 @@ +package com.me.brickbuster.entity; + +public enum BrickShape { + + RECTANGLE, + DIAMOND, + DOWN_RIGHT_TRIANGLE, + UP_RIGHT_TRIANGLE, + UP_LEFT_TRIANGLE, + DOWN_LEFT_TRIANGLE, + HALF_LOWER, + HALF_UPPER, + HALF_LEFT, + HALF_RIGHT, + THIRD_LEFT, + THIRD_HMIDDLE, + THIRD_RIGHT, + THIRD_UPPER, + THIRD_VMIDDLE, + THIRD_LOWER, + ; + +} diff --git a/core/src/com/me/brickbuster/entity/BrickType.java b/core/src/com/me/brickbuster/entity/BrickType.java new file mode 100644 index 0000000..e430aa3 --- /dev/null +++ b/core/src/com/me/brickbuster/entity/BrickType.java @@ -0,0 +1,19 @@ +package com.me.brickbuster.entity; + +public enum BrickType { + + STANDARD_10, + STANDARD_20, + STANDARD_30, + STANDARD_40, + STANDARD_50, + STANDARD_60, + STANDARD_70, + STANDARD_80, + EXPLOSIVE, + HARD, + HARDER, + UNBREAKABLE + ; + +} diff --git a/core/src/com/me/brickbuster/state/State.java b/core/src/com/me/brickbuster/state/State.java index 84abf53..722120e 100644 --- a/core/src/com/me/brickbuster/state/State.java +++ b/core/src/com/me/brickbuster/state/State.java @@ -26,6 +26,10 @@ public abstract class State extends ScreenAdapter { this.disposed = true; } + public BrickBuster getGame() { + return game; + } + public abstract void setup(); public abstract void render();