ArrayList

时间:2017-08-31 17:23:10

标签: java arrays

我对编码仍然很陌生,所以我只是尝试制作一些像Snake这样的简单游戏。现在我正试图在吃苹果时跟踪头部,但我遇到了问题。

我目前拥有它,以便尾部碎片在正确的时间产生在正确的位置,但它们不会移动。它们产卵并变得静止。我的尾部存储在ArrayList中,我无法弄清楚如何更新每个tick的矩形坐标值。如何更改每个刻度的每个矩形的坐标值?

这是我到目前为止所拥有的。这是我的Snake类的一部分,它产生尾部碎片并绘制它们

public static ArrayList<Integer> xValues = new ArrayList(1);
public static ArrayList<Integer> yValues = new ArrayList(1);
public static ArrayList<Rectangle> tails = new ArrayList(1);
public static int tail = 1;

public static void paint(Graphics g) {
    g.setColor(Color.green);
    g.fillRect(sx, sy, sWidth, sHeight);

    if(Apple.collision) {
        tails.add(new Rectangle(xValues.get(xValues.size() - tail), 
        yValues.get(yValues.size() - tail), sWidth, sHeight));
        System.out.println(tails.size());
        Apple.collision = false;
    }

    for(int i = 0; i < tails.size(); i++) {
        g.setColor(Color.green);
        g.fillRect(tails.get(i).x, tails.get(i).y, tails.get(i).width, tails.get(i).height);
    }
}

public static void update() {
    sx += svx;
    sy += svy;

    xValues.add(sx);
    yValues.add(sy);
}

我想要做的是每个游戏滴答我想要将变量'tail'递增1.所以只需要尾部++。当Snake吃苹果时,我在Apple课堂上这样做。

    public static void update() {
    if(Snake.sx == ax && Snake.sy == ay) {
        ax = (int) ((20 - 0) * random()) * 20;
        ay = (int) ((20 - 0) * random()) * 20;
        Snake.tail++;

        collision = true;
    }

但是这个矩形不是动态的,所以它们不会在每个刻度上增加尾部。

我知道我可以通过设置for循环找到每个矩形的x值,并且喜欢

tail.get(i).getBounds().getX;

但我无法弄清楚如何在程序运行时更改坐标值。

提前致谢!

1 个答案:

答案 0 :(得分:0)

要保持tails矩形更新,您要么必须在每个刻度线中查看列表,并将每个尾段的坐标设置为前面的坐标,否则您必须添加一个新的矩形,并在每个滴答中删除最旧的矩形(如FIFO队列)。

但是,由于您已经存储了所有过去的x / y值,因此tails列表仅包含冗余信息。您可以将其完全删除,只需读取最后tail个x / y值即可获得每个尾部坐标。

public static void paint(Graphics g) {
    g.setColor(Color.green);
    g.fillRect(sx, sy, sWidth, sHeight);

    if (Apple.collision) {
//      tail++; // could do this here instead of in Apple.update
        System.out.println(tail);
        Apple.collision = false;
    }

    for (int i = 0; i < tail; i++) {
        g.setColor(Color.green);
        g.fillRect(xValues.get(xValues.size() - 1 - i), yValues.get(yValues.size() - 1 - i), sWidth, sHeight);
    }
}