在 2D 数组中创建"Pixel"文字形状



我是一名初级程序员,目前正在制作一款基于网格的战略游戏,其中角色可以创建不同形状的目标,在范围内移动这些目标,并"射击"目标,将目标正方形(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)

这样做的两个缺点是:

  1. 数组是可变的,所以如果你不每次重新分配它,你可能会意外地踩踏数组中的数据。
  2. 看形状有点棘手。你可以斜视和转头,但这有点抽象。

第一点的解决方案是使用一些不可变结构。例如,您可以使用一个字符串,如:

String shape = "X Xn"
             + "   n"
             + "X Xn";

,然后将其分成几行,并在找到X的地方添加一个点。但还是有点难以看清形状。

第二点的解决方案是将图像存储为位图图像。您可以使用ImageIO从文件中加载图像,从而获得buffereimage。您可以使用BufferedImage.getRGB()查询像素颜色。所以,只要浏览图像中的所有x和y,并检查像素是白色(添加点)还是黑色(不添加点)。

相关内容

  • 没有找到相关文章

最新更新