java - 在 2D 数组中创建 "Pixel"类型形状

标签 java arrays multidimensional-array arraylist

我是一名初级程序员,目前正在制作一款基于网格的策略游戏,其中角色可以创建不同形状的目标,在范围内移动这些目标,然后“发射”目标以向其传递目标方 block (单元格)中的敌人列表二维数组)。

我计划有很多这样的形状,并且它们有不同的尺寸,例如:加号、x、圆锥体、v、手、眼睛、微笑、正方形、圆形等。复杂性增加了一些目标会随着玩家的朝向而改变。目前,我通过填充点的 ArrayList 来做到这一点:

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 等)作为 private static final ArrayList,要么在方法中创建它们。

我认为从文本文件中解析形状可能是更好的方法,但作为一名新程序员,我可能会错过一些轻松完成此任务的明显方法。

所以,重点是:

向二维数组添加网格形状的最佳方法是什么?

最佳答案

您有几个选择。

首先,您可以在源代码中声明您的形状,例如使用字节数组:

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 X\n"
             + "   \n"
             + "X X\n";

然后将其分成几行,并在找到 X 的位置添加一个点。不过,看清形状还是有点困难。

第二点的解决方案是将图像存储为位图图像。您可以使用 ImageIO 从文件加载图像,从而为您提供 BufferedImage。您可以使用 BufferedImage.getRGB() 查询像素颜色。因此,只需遍历图像中的所有 x 和 y,然后检查像素是白色(添加点)还是黑色(不添加点)。

关于java - 在 2D 数组中创建 "Pixel"类型形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32082146/

相关文章:

c - 如何将 char * 转换为 2d char 数组

c - 分配给二维数组的段错误

java - SFTP 服务器在 Apache Mina SSHD 中设置用户/密码

java - 奇怪的错误java.lang.reflect.Method.invokeNative(Native Method) Android Studio 请解答

arrays - 数组返回第一个元素 char 而不是整个元素

java - 构造大小为 N 的 1 和 -1 的数组 A,使得所有 A[i]*A[j] 的总和为最小且为正。 1 <= 我 < j <= N

c++ - 如何用用户输入变量制作二维数组?

java - 如何随机播放和播放阵列中的音频文件

Java完美数嵌套for循环

javascript - 如何删除包含所有空值的数组列?