在ArrayList

时间:2015-08-17 08:29:56

标签: java arraylist 2d-games

我目前正在开发基于2d平铺的游戏,我已经到了需要优化我的代码退出的地步。 我在javas列表中添加了许多不同的元素,如树木,岩石等。元素不是静态图块的原因是因为我希望玩家能够与元素进行交互。因此,所有元素必须是它自己的对象并存储在列表中。

问题在于,每当我想要与java中内置List中的特定元素进行交互时,我必须创建一个for循环并遍历列表中的每个元素以在正确的坐标处找到正确的元素。 (如碰撞等。)

我这样做是这样的:

List<Element> elements = new ArrayList<Element>();


public Element getElementOnPixel(int x, int y){`

        for(int i = 0; i < elements.size(); i++){

            int xx = elements.get(i).getX() * Game.TILE_SIZE;
            int yy = elements.get(i).getY() * Game.TILE_SIZE;
            int w = xx + elements.get(i).width;
            int h = yy + elements.get(i).height;

            if(x >= xx && x < w && y >= yy && y < h) {
                return elements.get(i);
            }

        }
        return null;
    }

正如你在上面所看到的,我必须考虑整个列表,直到找到正确坐标的正确元素。因为我在游戏中有很多元素,所以问题出现了。我的问题如下:

有没有其他方法可以在列表中构建的javas中的特定坐标处找到特定元素?

4 个答案:

答案 0 :(得分:0)

你可以想象出你的游戏的某种网格:

喜欢这里 8个Col,4行// 8个X位,4个Y位

[E][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][E][ ][ ]
[ ][ ][E][ ][E][ ][ ][ ]
[E][ ][ ][ ][ ][ ][ ][ ]

并将其对齐成一行(列表) - &gt;

[E][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][E][ ][ ][ ][ ][E][ ][E][ ][ ][ ][E][ ][ ][ ][ ][ ][ ][ ]

如果你想在(x,y)上得到元素。 然后你拿这个元素:

(x,y) -> List.get(y-1 * "overall row-length" + x)

示例:

If you want to  get the element in position x = 5, y = 3
(5,3) -> List.get(3-1 * 8 + 5) = List.get(21)

答案 1 :(得分:0)

您应该考虑空间分区数据结构,如BSP树(参见Apache Commons Math),KD树,QuadTree ......

答案 2 :(得分:0)

我认为最简单的方法是将所有元素存储在二维矩阵中:

Element[][] allElements=new Element[maxHeight][maxWidth];

...其中maxHeightmaxWith以像素表示。

存储和删除的程序:

private void addElement(Element element)
{
    // Calculate the range X and Y occupied by the new element:
    int posXLeft=getXPosition(element);
    int posYTop=getYPosition(element);
    int posXRigth=posXLeft+element.width;
    int posYBottom=posYTop+element.height;

    // Iterate the range X and Y in the allElements in search for old elements:
    for (int y=posYTop;y<posYBottom;y++)
    {
        for (int y=posYTop;y<posYBottom;y++)
        {
            if (allElements[y][x]!=null)
            {
                // Collision detected: There was already an element in that pixel.
            }
        }
    }

    // No collision detected:
    allElements[getXPosition(element)][getYPosition(element)]=element;
}

private void removeElement(Element element)
{
    // This is a safe operation: There is no need to search for collisions.
    int posXLeft=getXPosition(element);
    int posYTop=getYPosition(element);
    allElements[posYTop][posXLeft]=null;
}


private int getXPosition(Element element)
{
    return element.getX() * Game.TILE_SIZE;
}

private int getYPosition(Element element)
{
    return element.getY() * Game.TILE_SIZE;
}

答案 3 :(得分:0)

您可以将X / Y坐标转换为哈希键,并将元素存储在Map而不是List中。执行查找时,您将执行相同的转换以查找元素。例如,

private static String findHashKey(int x, int y) {
  return "" + x + "_" + y;
}

Map<String, Element> elements = new HashMap<>();

public Element getElementOnPixel(int x, int y) {
  return elements.get(findHashKey(x, y));
}