gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:26:28 25 4
gpt4 key购买 nike

我是一名初级程序员,目前正在制作一款基于网格的策略游戏,其中角色可以创建不同形状的目标,在范围内移动这些目标,然后“发射”目标以向其传递目标方 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com