我是一名初级程序员,目前正在制作一款基于网格的战略游戏,其中角色可以创建不同形状的目标,在范围内移动这些目标,并"射击"目标,将目标正方形(2d数组的单元格)中的敌人列表传递给他们。
我打算有很多这样的形状,并且有不同的大小,比如:+,x,锥形,v,手,眼睛,微笑,方形,圆形等。一些目标会随着玩家的变化而变化,从而增加复杂性。目前,我通过填充点的数组列表来实现这一点:
public ArrayList<Point> getTargetArea (int facing, Target tCenter){
ArrayList<Point> targetArea = new ArrayList<>();
int x = tCenter.getX();
int y = tCenter.getY();
switch (shape){
case "Dot":
break;
case "Small X":
targetArea.add(new Point(x-1,y-1));
targetArea.add(new Point(x+1,y+1));
targetArea.add(new Point(x+1,y-1));
targetArea.add(new Point(x-1,y+1));
break;
case "Small Cone":
if (facing==GC.FACING_UP){
targetArea.add(new Point(x-1,y-1));
targetArea.add(new Point(x,y-1));
targetArea.add(new Point(x+1,y-1));
}
else if (facing==GC.FACING_RIGHT){
targetArea.add(new Point(x+1,y+1));
targetArea.add(new Point(x+1,y));
targetArea.add(new Point(x+1,y-1));
}
and so on...
当我第一次设置它时,我承认这是一个临时措施,现在我要返回添加更复杂的形状(较大的有40+点),我认为是时候重新审视这是如何完成的。如果我坚持这种设计,我要么将每种不同类型的targetArea (cone, x等)预先创建为私有静态final ArrayList,要么在方法中创建它们。
我想从文本文件中解析形状可能是更好的方法,但是作为一名新程序员,我可能错过了一些容易完成这项任务的明显方法。
所以,焦点:
将网格形状添加到2D数组的最佳方法是什么?
您有几个选择。
首先,你可以在源代码中声明你的形状,例如使用字节数组:byte[][] shape = { // e.g. for small x
{ 1, 0, 1 },
{ 0, 0, 0 }, // Is there a 1 missing from the middle?
{ 1, 0, 1 },
};
然后你可以像这样渲染到你的目标区域:
for (int r = 0; r < shape.length; ++r) {
for (int c = 0; c < shape[r].length; ++c) {
if (shape[r][c] != 0) {
targetArea.add(new Point(x + c, y + r));
}
}
}
您可能还想引入一个偏移参数,在本例中将其移动(-1,-1),以便中心位于(x, y)
。
这样做的两个缺点是:
- 数组是可变的,所以如果你不每次重新分配它,你可能会意外地踩踏数组中的数据。
- 看形状有点棘手。你可以斜视和转头,但这有点抽象。
第一点的解决方案是使用一些不可变结构。例如,您可以使用一个字符串,如:
String shape = "X Xn"
+ " n"
+ "X Xn";
,然后将其分成几行,并在找到X
的地方添加一个点。但还是有点难以看清形状。
第二点的解决方案是将图像存储为位图图像。您可以使用ImageIO从文件中加载图像,从而获得buffereimage。您可以使用BufferedImage.getRGB()查询像素颜色。所以,只要浏览图像中的所有x和y,并检查像素是白色(添加点)还是黑色(不添加点)。