diff --git a/core/src/io/github/lonamiwebs/klooni/actors/EffectCard.java b/core/src/io/github/lonamiwebs/klooni/actors/EffectCard.java index beb65bd..0046d8d 100644 --- a/core/src/io/github/lonamiwebs/klooni/actors/EffectCard.java +++ b/core/src/io/github/lonamiwebs/klooni/actors/EffectCard.java @@ -17,17 +17,14 @@ */ package io.github.lonamiwebs.klooni.actors; -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Batch; -import com.badlogic.gdx.math.Matrix4; +import com.badlogic.gdx.math.Rectangle; import io.github.lonamiwebs.klooni.Effect; import io.github.lonamiwebs.klooni.Klooni; import io.github.lonamiwebs.klooni.Theme; -import io.github.lonamiwebs.klooni.effects.IEffect; -import io.github.lonamiwebs.klooni.game.Cell; +import io.github.lonamiwebs.klooni.game.Board; import io.github.lonamiwebs.klooni.game.GameLayout; import io.github.lonamiwebs.klooni.game.Piece; @@ -37,11 +34,12 @@ public class EffectCard extends ShopCard { //region Members public final Effect effect; - private final Cell cell; - private IEffect currentEffect; + private final Board board; + + // We want to create an effect from the beginning + private boolean needCreateEffect = true; private final Texture background; - private Color color; //endregion @@ -50,13 +48,29 @@ public class EffectCard extends ShopCard { public EffectCard(final Klooni game, final GameLayout layout, final Effect effect) { super(game, layout, effect.getDisplay(), Klooni.theme.background); background = Theme.getBlankTexture(); - color = Klooni.theme.getRandomCellColor(); - this.effect = effect; - cell = Piece.randomCell(0, 0, cellSize); + + // Let the board have room for 3 cells, so cellSize * 3 + board = new Board(new Rectangle(0, 0, cellSize * 3, cellSize * 3), 3); + + setRandomPiece(); usedItemUpdated(); } + private void setRandomPiece() { + while (true) { + final Piece piece = Piece.random(); + if (piece.cellCols > 3 || piece.cellRows > 3) + continue; + + // Try to center it (max size is 3, so center is the second grid bit unless max size) + int x = piece.cellCols == 3 ? 0 : 1; + int y = piece.cellRows == 3 ? 0 : 1; + if (board.putPiece(piece, x, y)) + break; // Should not fail, but if it does, don't break + } + } + //endregion //region Public methods @@ -68,31 +82,37 @@ public class EffectCard extends ShopCard { batch.setColor(Klooni.theme.background); batch.draw(background, x, y, getWidth(), getHeight()); - // Avoid drawing on the borders by adding +1 cell padding +1 to center it - // so it's becomes cellSize * 2 - cell.pos.set(x + cellSize * 2, y + cellSize * 2); + // Avoid drawing on the borders by adding +1 cell padding + board.pos.set(x + cellSize * 1, y + cellSize * 1); - // If we're not showcasing (currentEffect == null), show the cell alone - if (currentEffect == null) - cell.draw(batch); + // Draw only if effects are done, i.e. not showcasing + if (board.effectsDone()) + board.draw(batch); super.draw(batch, parentAlpha); } @Override public boolean showcase(Batch batch, float yDisplacement) { - cell.pos.y += yDisplacement; + board.pos.y += yDisplacement; - // If it's null, create it, then we want to render - if (currentEffect == null) { - currentEffect = effect.create(cell, cell.pos); - } else if (currentEffect.isDone()) { - // Set to null so it's created the next time - currentEffect = null; - return false; + // If no effect is running + if (board.effectsDone()) { + // And we want to create a new one + if (needCreateEffect) { + // Clear at cells[1][1], the center one + board.clearAll(1, 1, effect); + needCreateEffect = false; + } else { + // Otherwise, the previous effect finished, so return false because we're done + // We also want to draw the next time so set the flag to true + setRandomPiece(); + needCreateEffect = true; + return false; + } } - currentEffect.draw(batch); + board.draw(batch); return true; } diff --git a/core/src/io/github/lonamiwebs/klooni/game/Board.java b/core/src/io/github/lonamiwebs/klooni/game/Board.java index 15907aa..86b94f6 100644 --- a/core/src/io/github/lonamiwebs/klooni/game/Board.java +++ b/core/src/io/github/lonamiwebs/klooni/game/Board.java @@ -17,8 +17,9 @@ */ package io.github.lonamiwebs.klooni.game; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.math.MathUtils; +import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; @@ -39,12 +40,12 @@ public class Board implements BinSerializable { public final int cellCount; public float cellSize; private Cell[][] cells; - private final Array effects; // Particle effects once they vanish + private final Array effects = new Array(); // Particle effects once they vanish - final Vector2 pos; + public final Vector2 pos = new Vector2(); // Used to animate cleared cells vanishing - private final Vector2 lastPutPiecePos; + private final Vector2 lastPutPiecePos = new Vector2(); //endregion @@ -53,12 +54,21 @@ public class Board implements BinSerializable { public Board(final GameLayout layout, int cellCount) { this.cellCount = cellCount; - lastPutPiecePos = new Vector2(); - pos = new Vector2(); - effects = new Array(32); // 32 capacity for 3 rows (most common) - // Cell size depends on the layout to be updated first layout.update(this); + createCells(); + } + + public Board(final Rectangle area, int cellCount) { + this.cellCount = cellCount; + + // Cell size depends on the layout to be updated first + pos.set(area.x, area.y); + cellSize = Math.min(area.height, area.width) / cellCount; + createCells(); + } + + private void createCells() { cells = new Cell[this.cellCount][this.cellCount]; for (int i = 0; i < this.cellCount; ++i) { for (int j = 0; j < this.cellCount; ++j) { @@ -95,7 +105,7 @@ public class Board implements BinSerializable { } // Returns true iff the piece was put on the board - private boolean putPiece(Piece piece, int x, int y) { + public boolean putPiece(Piece piece, int x, int y) { if (!canPutPiece(piece, x, y)) return false; @@ -112,7 +122,7 @@ public class Board implements BinSerializable { //region Public methods - public void draw(SpriteBatch batch) { + public void draw(final Batch batch) { batch.setTransformMatrix(batch.getTransformMatrix().translate(pos.x, pos.y, 0)); for (int i = 0; i < cellCount; ++i) @@ -137,7 +147,7 @@ public class Board implements BinSerializable { return false; } - boolean putScreenPiece(Piece piece) { + public boolean putScreenPiece(final Piece piece) { // Convert the on screen coordinates of the piece to the local-board-space coordinates // This is done by subtracting the piece coordinates from the board coordinates Vector2 local = piece.pos.cpy().sub(pos); @@ -225,6 +235,25 @@ public class Board implements BinSerializable { return clearCount; } + public int clearAll(final int clearFromX, final int clearFromY, final Effect effect) { + int clearCount = 0; + final Vector2 culprit = cells[clearFromY][clearFromX].pos; + + for (int i = 0; i < cellCount; ++i) { + for (int j = 0; j < cellCount; ++j) { + if (!cells[i][j].isEmpty()) { + clearCount++; + effects.add(effect.create(cells[i][j], culprit)); + cells[i][j].set(-1); + } + } + } + + return clearCount; + } + + public boolean effectsDone() { return effects.size == 0; } + //endregion //region Serialization diff --git a/core/src/io/github/lonamiwebs/klooni/game/Piece.java b/core/src/io/github/lonamiwebs/klooni/game/Piece.java index e1bda17..2044468 100644 --- a/core/src/io/github/lonamiwebs/klooni/game/Piece.java +++ b/core/src/io/github/lonamiwebs/klooni/game/Piece.java @@ -37,10 +37,10 @@ public class Piece { //region Members final Vector2 pos; - final int colorIndex; + public final int colorIndex; private final int rotation; - final int cellCols, cellRows; + public final int cellCols, cellRows; private boolean shape[][]; // Default arbitrary value @@ -112,16 +112,8 @@ public class Piece { //region Static methods - // Only the pieces know how many colors there are, so the method for - // creating cells belongs here as a public static one. - public static Cell randomCell(final float x, final float y, final float size) { - final Cell cell = new Cell(x, y, size); - cell.set(MathUtils.random(8)); - return cell; - } - // Generates a random piece with always the same color for the generated shape - static Piece random() { + public static Piece random() { // 9 pieces [0…8]; 4 possible rotations [0…3] return fromIndex(MathUtils.random(8), MathUtils.random(4)); }