added spawn area

noStream
agp8x 2017-04-09 19:07:15 +02:00
parent fd02dcffd1
commit 08b192a6a5
6 changed files with 142 additions and 83 deletions

View File

@ -2,6 +2,7 @@ package org.agp8x.android.games.fillgrid;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Pair;
import android.widget.RelativeLayout;
import org.agp8x.android.games.fillgrid.data.GridBlock;
@ -18,10 +19,14 @@ public class FillGrid extends AppCompatActivity {
//GridObject<Asdf> ago = new GridBlock<>(Asdf.A);
RelativeLayout layout = (RelativeLayout) findViewById(R.id.mainLayout);
/* Pair<Float, Float> fp = new Pair<>(1.0f, 2.0f);
Pair<Integer, Integer> ip = new Pair<>(1, 2);
ip = new Pair<>(fp.first.intValue(), fp.second.intValue());*/
FillGridView gridview = new FillGridView(this);
layout.addView(gridview);
}
private enum Asdf{
A,B,C;
}
/* private enum Asdf {
A, B, C;
}*/
}

View File

@ -9,6 +9,7 @@ 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;
@ -23,11 +24,16 @@ import java.util.Map;
public class FillGridView extends View {
protected Pair<Integer, Integer> contentSize = null;
protected Pair<Integer, Integer> spawnSize = null;
protected GridBoard<GridBlock<GroupCell>, GroupCell> board;
protected List<GridBlock<GroupCell>> blocks;
protected Map<Offset, GroupCell> background;
protected GroupGridPainter painter;
protected GroupGridPainter bgPainter;
private float divison;
private ArrayList<GridObject<GroupCell>> spawn;
private int spawnCount;
private SpawnPainterGroup<GroupCell> spawnPainter;
public FillGridView(Context context) {
super(context);
@ -54,6 +60,29 @@ public class FillGridView extends View {
board = new GridBoard<>(dimensions);
blocks = new ArrayList<>();
background = new HashMap<>();
GroupCell bgCell = new GroupCell(-1);
for (int i = 0; i < dimensions.x; i++) {
for (int j = 0; j < dimensions.y; j++) {
background.put(new Offset(i, j), bgCell);
}
}
CellPaintProvider bgCpp = new CellPaintProviderBackground();
bgPainter = new GroupGridPainter(dimensions, bgCpp);
CellPaintProvider cpp = new CellPaintProviderDefault();
painter = new GroupGridPainter(dimensions, cpp);
// 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
GridBlock<GroupCell> block0 = new GridBlock<>();
block0.getObjects().put(new Offset(0, 0), new GroupCell(0));
blocks.add(block0);
@ -67,21 +96,10 @@ public class FillGridView extends View {
block0.getObjects().put(new Offset(0, 2), new GroupCell(2));
blocks.add(block0);
background = new HashMap<>();
GroupCell bgCell = new GroupCell(-1);
for (int i = 0; i < dimensions.x; i++) {
for (int j = 0; j < dimensions.y; j++) {
background.put(new Offset(i, j), bgCell);
}
}
CellPaintProvider bgCpp = new CellPaintProviderBackground();
bgPainter = new GroupGridPainter(dimensions,bgCpp);
CellPaintProvider cpp = new CellPaintProviderDefault();
painter = new GroupGridPainter(dimensions, cpp);
board.drop(new Offset(4, 4), makeSquare());
board.drop(new Offset(4,4), makeAngle());
board.drop(new Offset(4, 4), makeAngle());
populateSpawnArea();
}
private GridBlock<GroupCell> makeSquare() {
@ -90,6 +108,7 @@ public class FillGridView extends View {
grid.getObjects().put(new Offset(0, 1), new GroupCell(0));
grid.getObjects().put(new Offset(1, 0), new GroupCell(0));
grid.getObjects().put(new Offset(1, 1), new GroupCell(0));
blocks.add(grid);
return grid;
}
@ -100,6 +119,7 @@ public class FillGridView extends View {
grid.getObjects().put(new Offset(2, 2), new GroupCell(1));
grid.getObjects().put(new Offset(2, 1), new GroupCell(1));
grid.getObjects().put(new Offset(2, 0), new GroupCell(1));
blocks.add(grid);
return grid;
}
@ -107,16 +127,48 @@ public class FillGridView extends View {
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (contentSize == null) {
//TODO: maybe fix for square? optional?
int paddingTop = getPaddingTop();
int paddingBottom = getPaddingBottom();
int paddingLeft = getPaddingLeft();
int paddingRight = getPaddingRight();
contentSize = new Pair<>(getHeight() - paddingTop - paddingBottom, getWidth() - paddingLeft - paddingRight);
if (contentSize == null || spawnSize == null) {
calculateAreaSizes();
System.out.println(contentSize + " :: " + spawnSize);
}
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);
}
}
private void calculateAreaSizes() {
int paddingTop = getPaddingTop();
int paddingBottom = getPaddingBottom();
int paddingLeft = getPaddingLeft();
int paddingRight = getPaddingRight();
int height = getHeight();
int width = getWidth();
int contentHeight = height - paddingTop - paddingBottom;
int contentWidth = width - paddingLeft - paddingRight;
int spawnHeight = contentHeight;
int spawnWidth = contentWidth;
if (contentHeight > contentWidth) {
spawnHeight = contentHeight - contentWidth;
contentHeight = contentWidth;
} else {
spawnWidth = contentWidth - contentHeight;
contentWidth = contentHeight;
}
contentSize = new Pair<>(contentHeight, contentWidth);
spawnSize = new Pair<>(spawnHeight, spawnWidth);
}
private int divideSide(int sideLength) {
return (int) (sideLength * divison);
}
private void populateSpawnArea() {
for (int i = 0; i < spawnCount; i++) {
GridObject<GroupCell> obj = blocks.get((int) (blocks.size() * Math.random()));
spawn.add(i, obj);
}
}
}

View File

@ -3,6 +3,7 @@ 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;
@ -21,7 +22,7 @@ public class GroupGridPainter implements GridPainter {
public GroupGridPainter(Offset dimensions, CellPaintProvider styleInfo) {
this.dimensions = dimensions;
this.styleInfo = styleInfo;
radius = 30;
radius = 30;//TODO dynamic radius to fill area
margin = radius + radius / 4;
}
@ -32,6 +33,6 @@ public class GroupGridPainter implements GridPainter {
private void drawCell(Canvas canvas, Offset offset, GroupCell cell, Pair<Integer, Integer> realDimensions) {
Pair<Float, Float> origin = new Pair<>((offset.x / (float) dimensions.x) * realDimensions.first, (offset.y / (float) dimensions.y) * realDimensions.second);
canvas.drawCircle(origin.second + margin, origin.first + margin, 30, styleInfo.getPaint(cell));
canvas.drawCircle(origin.second + margin, origin.first + margin, radius, styleInfo.getPaint(cell));
}
}

View File

@ -0,0 +1,15 @@
package org.agp8x.android.games.fillgrid;
import android.graphics.Canvas;
import android.util.Pair;
import org.agp8x.android.games.fillgrid.data.Cell;
import org.agp8x.android.games.fillgrid.data.GridObject;
/**
* Created by clemensk on 09.04.17.
*/
public interface SpawnPainter<C extends Cell> {
void draw(Canvas canvas, int index, GridObject<C> gridObject, Pair<Integer,Integer> dimensions);
}

View File

@ -0,0 +1,43 @@
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;
/**
* Created by clemensk on 09.04.17.
*/
public class SpawnPainterGroup<C extends GroupCell> implements SpawnPainter<C> {
private int objCount;
private int radius;
private int margin;
private CellPaintProvider styleInfo;
public SpawnPainterGroup(int objCount) {
this.objCount = objCount;
radius = 30;//TODO dynamic radius to fill area
margin = radius + radius / 4;
this.styleInfo = new CellPaintProviderBackground();
}
@Override
public void draw(Canvas canvas, int index, GridObject<C> gridObject, Pair<Integer, Integer> 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);
}
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));
}
}

View File

@ -1,57 +0,0 @@
package org.agp8x.android.games.fillgrid.data;
/**
* Created by clemensk on 29.03.17.
*/
public class Coordinate {
private double x;
private double y;
public Coordinate() {
}
public Coordinate(double x, double y) {
this.x = x;
this.y = y;
}
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Coordinate that = (Coordinate) o;
if (Double.compare(that.x, x) != 0) return false;
return Double.compare(that.y, y) == 0;
}
@Override
public int hashCode() {
int result;
long temp;
temp = Double.doubleToLongBits(x);
result = (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(y);
result = 31 * result + (int) (temp ^ (temp >>> 32));
return result;
}
}