-
Notifications
You must be signed in to change notification settings - Fork 1
/
Cell.java
116 lines (100 loc) · 2.72 KB
/
Cell.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import java.util.ArrayList;
import java.util.List;
import greenfoot.Actor;
import greenfoot.Color;
import greenfoot.GreenfootImage;
/**
* Divides the World in chunk-like sectors.<br>
* These sectors define where for example the path is and where towers can be
* placed.
*/
public abstract class Cell extends Actor {
private static final String BACKGROUND_IMAGE_NAME = "cell-bg.png";
private int gridX;
private int gridY;
public Cell(int gridX, int gridY) {
this.gridX = gridX;
this.gridY = gridY;
setImage(getBgImageName());
}
/**
* Produces an img that only has one color
*
* @param sizeX - img size x
* @param sizeY - img size y
* @param color - A Greenfoot.Color
* @return A GreenfootImage
*/
GreenfootImage paintMonochromeImage(int sizeX, int sizeY, Color color) {
GreenfootImage img = new GreenfootImage(sizeX, sizeY);
for (int x = 0; x < img.getWidth(); x++) {
for (int y = 0; y < img.getHeight(); y++) {
img.setColorAt(x, y, color);
}
}
return img;
}
/**
* Replaces the current Cell with another and changes the Grid respectively.
*
* @param otherCell - The new Cell. What you enter as gridX + gridY value is
* irrelevant. They will get replaced.
*/
public void replaceWith(Cell otherCell) {
otherCell.setGridX(this.gridX);
otherCell.setGridY(this.gridY);
GameWorld world = getWorld();
world.replaceCellInGrid(otherCell);
world.addObject(otherCell, this.getX(), this.getY());
world.removeObject(this);
world.computePathSectionTypes();
}
/**
* get a list of the direct or all neighbours
*
* @param withCorners all neighbours? Or only the direct ones
* @return the list of neighbours
*/
public List<Cell> getNeighbourCells(boolean withCorners) {
List<Cell> neighbours = new ArrayList<>();
Cell[][] grid = getWorld().getGrid();
for (int x = -1; x <= 1; x++) {
for (int y = -1; y <= 1; y++) {
if((x == 0 && y == 0) || (withCorners || isInCornerCheck(x, y))) {
continue;
}
int checkX = this.getGridX() + x;
int checkY = this.getGridY() + y;
if(checkX >= 0 && checkX < GameWorld.GRID_SIZE_X && checkY >= 0 && checkY < GameWorld.GRID_SIZE_Y) {
neighbours.add(grid[checkX][checkY]);
}
}
}
return neighbours;
}
private boolean isInCornerCheck(int x, int z) {
if(Math.abs(x) == 1 && Math.abs(z) == 1) {
return true;
}
return false;
}
public int getGridX() {
return gridX;
}
public int getGridY() {
return gridY;
}
public void setGridX(int gridX) {
this.gridX = gridX;
}
public void setGridY(int gridY) {
this.gridY = gridY;
}
@Override
public GameWorld getWorld() {
return (GameWorld) super.getWorld();
}
public String getBgImageName() {
return BACKGROUND_IMAGE_NAME;
}
}