diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e42b01e..f83384c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,7 +9,7 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> - + diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/Area.java b/app/src/main/java/org/agp8x/android/games/fillgrid/Area.java new file mode 100644 index 0000000..47eb579 --- /dev/null +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/Area.java @@ -0,0 +1,52 @@ +package org.agp8x.android.games.fillgrid; + +/** + * Created by clemensk on 09.04.17. + */ + +public final class Area { + public final int top; + public final int left; + public final int bottom; + public final int right; + + public Area(int top, int left, int bottom, int right) { + this.top = top; + this.left = left; + this.bottom = bottom; + this.right = right; + } + + @Override + public String toString() { + return "Area{" + + "top=" + top + + ", left=" + left + + ", bottom=" + bottom + + ", right=" + right + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Area area = (Area) o; + + if (top != area.top) return false; + if (left != area.left) return false; + if (bottom != area.bottom) return false; + return right == area.right; + + } + + @Override + public int hashCode() { + int result = top; + result = 31 * result + left; + result = 31 * result + bottom; + result = 31 * result + right; + return result; + } +} diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/CellPaintProvider.java b/app/src/main/java/org/agp8x/android/games/fillgrid/CellPaintProvider.java index bbd2c19..77b345d 100644 --- a/app/src/main/java/org/agp8x/android/games/fillgrid/CellPaintProvider.java +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/CellPaintProvider.java @@ -9,7 +9,7 @@ import org.agp8x.android.games.fillgrid.data.Cell; * Created by clemensk on 09.04.17. */ -public interface CellPaintProvider { +public interface CellPaintProvider { @NonNull - Paint getPaint(Cell cell); + Paint getPaint(C cell); } diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/CellPaintProviderBackground.java b/app/src/main/java/org/agp8x/android/games/fillgrid/CellPaintProviderBackground.java index eadb8a2..9359a0d 100644 --- a/app/src/main/java/org/agp8x/android/games/fillgrid/CellPaintProviderBackground.java +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/CellPaintProviderBackground.java @@ -9,10 +9,10 @@ import org.agp8x.android.games.fillgrid.data.Cell; * Created by clemensk on 09.04.17. */ -public class CellPaintProviderBackground implements CellPaintProvider { +public class CellPaintProviderBackground implements CellPaintProvider { @NonNull @Override - public Paint getPaint(Cell cell) { + public Paint getPaint(C cell) { Paint paint = new Paint(); paint.setAlpha(128); return paint; diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/CellPaintProviderDefault.java b/app/src/main/java/org/agp8x/android/games/fillgrid/CellPaintProviderDefault.java index 0eb446f..19c9ed7 100644 --- a/app/src/main/java/org/agp8x/android/games/fillgrid/CellPaintProviderDefault.java +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/CellPaintProviderDefault.java @@ -11,11 +11,11 @@ import org.agp8x.android.games.fillgrid.data.GroupCell; * Created by clemensk on 09.04.17. */ -public class CellPaintProviderDefault implements CellPaintProvider { +public class CellPaintProviderDefault implements CellPaintProvider { @NonNull @Override - public Paint getPaint(Cell cell) { + public Paint getPaint(C cell) { Paint paint = new Paint(); if (cell instanceof GroupCell) { GroupCell groupCell = (GroupCell) cell; diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/FillGridView.java b/app/src/main/java/org/agp8x/android/games/fillgrid/FillGridView.java index 80fe5c0..8885d07 100644 --- a/app/src/main/java/org/agp8x/android/games/fillgrid/FillGridView.java +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/FillGridView.java @@ -5,11 +5,11 @@ import android.graphics.Canvas; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.util.Pair; +import android.view.MotionEvent; import android.view.View; import org.agp8x.android.games.fillgrid.data.GridBlock; import org.agp8x.android.games.fillgrid.data.GridBoard; -import org.agp8x.android.games.fillgrid.data.GridObject; import org.agp8x.android.games.fillgrid.data.GroupCell; import org.agp8x.android.games.fillgrid.data.Offset; @@ -25,15 +25,16 @@ import java.util.Map; public class FillGridView extends View { protected Pair contentSize = null; protected Pair spawnSize = null; + protected Area spawnBoundaries; protected GridBoard, GroupCell> board; protected List> blocks; protected Map background; - protected GroupGridPainter painter; - protected GroupGridPainter bgPainter; + protected Map> spawnGrid; + protected GroupGridPainter painter; + protected GroupGridPainter bgPainter; private float divison; - private ArrayList> spawn; private int spawnCount; - private SpawnPainterGroup spawnPainter; + private SpawnPainterGroup, GroupCell> spawnPainter; public FillGridView(Context context) { super(context); @@ -68,18 +69,18 @@ public class FillGridView extends View { background.put(new Offset(i, j), bgCell); } } + spawnGrid = new HashMap<>(); CellPaintProvider bgCpp = new CellPaintProviderBackground(); - bgPainter = new GroupGridPainter(dimensions, bgCpp); + bgPainter = new GroupGridPainter<>(dimensions, bgCpp); CellPaintProvider cpp = new CellPaintProviderDefault(); - painter = new GroupGridPainter(dimensions, cpp); + painter = new GroupGridPainter<>(dimensions, cpp); + spawnPainter = new SpawnPainterGroup<>(new CellPaintProviderBackground()); // TODO: create configuration spawnCount = 3; - spawnPainter = new SpawnPainterGroup<>(spawnCount); - spawn = new ArrayList<>(spawnCount); divison = 0.5625f; // divides *HD-resolutions in a square and a non-square @@ -98,8 +99,10 @@ public class FillGridView extends View { board.drop(new Offset(4, 4), makeSquare()); board.drop(new Offset(4, 4), makeAngle()); + //end TODO populateSpawnArea(); + setOnTouchListener(new FillGridTouchListener()); } private GridBlock makeSquare() { @@ -134,9 +137,7 @@ public class FillGridView extends View { bgPainter.draw(canvas, background, contentSize); painter.draw(canvas, board.getGrid(), contentSize); - for (int i = 0; i < spawnCount; i++) { - spawnPainter.draw(canvas,i,spawn.get(i),spawnSize); - } + spawnPainter.draw(canvas, spawnGrid, spawnBoundaries); } private void calculateAreaSizes() { @@ -159,6 +160,7 @@ public class FillGridView extends View { } contentSize = new Pair<>(contentHeight, contentWidth); spawnSize = new Pair<>(spawnHeight, spawnWidth); + spawnBoundaries = new Area(contentHeight, paddingLeft, spawnHeight, spawnWidth); } private int divideSide(int sideLength) { @@ -167,8 +169,29 @@ public class FillGridView extends View { private void populateSpawnArea() { for (int i = 0; i < spawnCount; i++) { - GridObject obj = blocks.get((int) (blocks.size() * Math.random())); - spawn.add(i, obj); + spawnGrid.put(new Offset(i, 0), getRandomGroupCellGridBlock()); + } + } + + private GridBlock getRandomGroupCellGridBlock() { + return blocks.get((int) (blocks.size() * Math.random())); + } + + private class FillGridTouchListener implements OnTouchListener { + @Override + public boolean onTouch(View v, MotionEvent event) { + Pair position = Util.event2pair(event); + boolean updated = false; + if (Util.in(position, spawnBoundaries)) { + updated = handleStart(event); + } + return updated; + } + + private boolean handleStart(MotionEvent event) { + boolean updated = false; + + return updated; } } } diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/GridPainter.java b/app/src/main/java/org/agp8x/android/games/fillgrid/GridPainter.java index 82547fc..97303cb 100644 --- a/app/src/main/java/org/agp8x/android/games/fillgrid/GridPainter.java +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/GridPainter.java @@ -3,7 +3,7 @@ package org.agp8x.android.games.fillgrid; import android.graphics.Canvas; import android.util.Pair; -import org.agp8x.android.games.fillgrid.data.GroupCell; +import org.agp8x.android.games.fillgrid.data.Cell; import org.agp8x.android.games.fillgrid.data.Offset; import java.util.Map; @@ -12,7 +12,7 @@ import java.util.Map; * Created by clemensk on 07.04.17. */ -public interface GridPainter { +public interface GridPainter { - void draw(Canvas canvas, Map cells, Pair realDimensions); + void draw(Canvas canvas, Map cells, Pair realDimensions); } diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/GroupGridPainter.java b/app/src/main/java/org/agp8x/android/games/fillgrid/GroupGridPainter.java index 4038c21..f4c8d12 100644 --- a/app/src/main/java/org/agp8x/android/games/fillgrid/GroupGridPainter.java +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/GroupGridPainter.java @@ -3,7 +3,6 @@ package org.agp8x.android.games.fillgrid; import android.graphics.Canvas; import android.util.Pair; -import org.agp8x.android.games.fillgrid.data.GridObject; import org.agp8x.android.games.fillgrid.data.GroupCell; import org.agp8x.android.games.fillgrid.data.Offset; @@ -13,7 +12,7 @@ import java.util.Map; * Created by clemensk on 07.04.17. */ -public class GroupGridPainter implements GridPainter { +public class GroupGridPainter implements GridPainter { private Offset dimensions; private CellPaintProvider styleInfo; private int margin; @@ -27,7 +26,7 @@ public class GroupGridPainter implements GridPainter { } @Override - public void draw(Canvas canvas, Map cells, Pair realDimensions) { + public void draw(Canvas canvas, Map cells, Pair realDimensions) { cells.forEach((offset, groupCell) -> drawCell(canvas, offset, groupCell, realDimensions)); } diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/SpawnPainter.java b/app/src/main/java/org/agp8x/android/games/fillgrid/SpawnPainter.java index 5ba776b..0ae7400 100644 --- a/app/src/main/java/org/agp8x/android/games/fillgrid/SpawnPainter.java +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/SpawnPainter.java @@ -5,11 +5,14 @@ import android.util.Pair; import org.agp8x.android.games.fillgrid.data.Cell; import org.agp8x.android.games.fillgrid.data.GridObject; +import org.agp8x.android.games.fillgrid.data.Offset; + +import java.util.Map; /** * Created by clemensk on 09.04.17. */ -public interface SpawnPainter { - void draw(Canvas canvas, int index, GridObject gridObject, Pair dimensions); +public interface SpawnPainter, C extends Cell> { + void draw(Canvas canvas, Map spawnGrid, Area spawnSize); } diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/SpawnPainterGroup.java b/app/src/main/java/org/agp8x/android/games/fillgrid/SpawnPainterGroup.java index 718c151..b720b91 100644 --- a/app/src/main/java/org/agp8x/android/games/fillgrid/SpawnPainterGroup.java +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/SpawnPainterGroup.java @@ -1,43 +1,53 @@ package org.agp8x.android.games.fillgrid; import android.graphics.Canvas; -import android.graphics.Paint; import android.util.Pair; import org.agp8x.android.games.fillgrid.data.GridObject; import org.agp8x.android.games.fillgrid.data.GroupCell; import org.agp8x.android.games.fillgrid.data.Offset; +import java.util.Map; + /** * Created by clemensk on 09.04.17. */ -public class SpawnPainterGroup implements SpawnPainter { - private int objCount; +public class SpawnPainterGroup, C extends GroupCell> implements SpawnPainter { private int radius; private int margin; private CellPaintProvider styleInfo; + private int diameter; - public SpawnPainterGroup(int objCount) { - this.objCount = objCount; + public SpawnPainterGroup(CellPaintProvider styleInfo) { + this.styleInfo = styleInfo; radius = 30;//TODO dynamic radius to fill area - margin = radius + radius / 4; - this.styleInfo = new CellPaintProviderBackground(); + margin = radius *3 + radius / 4; + diameter = radius * 2; } @Override - public void draw(Canvas canvas, int index, GridObject gridObject, Pair dimensions) { - System.out.println(dimensions); - int widthS = Math.max(dimensions.first, dimensions.second); - int height = (int) (Math.min(dimensions.first, dimensions.second) * 0.25f) + widthS; - float widthPerObject = widthS / (1f * objCount); - int width = (int) (index * widthPerObject); - - gridObject.getObjects().forEach((offset, groupCell) -> drawCell(canvas, height, width, offset, groupCell)); - //drawCell(canvas, new Pair<>(height, width), null); + public void draw(Canvas canvas, Map spawnGrid, Area spawnSize) { + int count = spawnGrid.size(); + spawnGrid.forEach((offset, groupCellGridBlock) -> drawBlock(canvas, offset, groupCellGridBlock, count, spawnSize)); } - private void drawCell(Canvas canvas, int height, int width, Offset offset, C cell) { - canvas.drawCircle(width + margin+ (offset.x*radius*2), height + margin + (offset.y*radius*2), radius, styleInfo.getPaint(cell)); + private void drawBlock(Canvas canvas, Offset offset, G groupCellGridBlock, int count, Area spawnSize) { + groupCellGridBlock.getObjects().forEach((offset1, groupCell) -> drawCell(canvas, offset, offset1, groupCell, count, spawnSize)); + } + + private void drawCell(Canvas canvas, Offset offset, Offset offset1, C cell, int count, Area spawnSize) { + canvas.drawCircle( + getCx(offset, offset1, count, spawnSize), + getCy(offset, offset1, count, spawnSize), + radius, styleInfo.getPaint(cell)); + } + + private float getCx(Offset offset, Offset offset1, float count, Area spawnSize) { + return ((offset.x / count) * spawnSize.right) + margin + offset1.x * diameter; + } + + private float getCy(Offset offset, Offset offset1, float count, Area spawnSize) { + return ((offset.y / count) * spawnSize.bottom) + margin + offset1.y * diameter + spawnSize.top; } } diff --git a/app/src/main/java/org/agp8x/android/games/fillgrid/Util.java b/app/src/main/java/org/agp8x/android/games/fillgrid/Util.java new file mode 100644 index 0000000..2eae051 --- /dev/null +++ b/app/src/main/java/org/agp8x/android/games/fillgrid/Util.java @@ -0,0 +1,21 @@ +package org.agp8x.android.games.fillgrid; + +import android.util.Pair; +import android.view.MotionEvent; + +/** + * Created by clemensk on 09.04.17. + */ + +public class Util { + public static final String TAG = "FillGrid"; + + public static Pair event2pair(MotionEvent event) { + return new Pair<>(event.getX(), event.getY()); + } + + public static boolean in(Pair probe, Area area) { + boolean contained = (area.top < probe.second && probe.second < area.bottom) && (area.left < probe.first && probe.first < area.right); + return contained; + } +}