当前位置: 首页 > 知识库问答 >
问题:

ArrayList中的动态矩形

金嘉言
2023-03-14

我对编码还是很陌生,所以我只是在尝试制作一些简单的游戏,比如Snake。现在,我正试图让苹果被吃掉时的轨迹沿着头部,但我遇到了一个问题。

我现在有它,这样尾巴在正确的时间在正确的地方产卵,但它们不会移动。它们产卵并静止。我的尾部片段存储在ArrayList中,我不知道如何在每个滴答声中更新矩形的坐标值。如何更改每个矩形的坐标值?

这就是我目前所拥有的。这是我的蛇类的一部分,它会产生尾巴并绘制它们

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。那就跟着我。在我的苹果课上,当蛇吃苹果时,我会这样做。

    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个答案

赫连心思
2023-03-14

要保持尾部矩形的更新,您要么必须在每个勾号中查看列表,并将每个尾部段的坐标设置为其前面的一个的坐标,要么必须在每个勾号中添加一个新矩形并删除最旧的矩形(如FIFO队列)。

但是,由于您已经存储了所有过去的x/y值,tails列表只包含冗余信息。你可以完全放下它,只需读取x/y值的最后一个tailnumber,就可以得到每个tail坐标。

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);
    }
}
 类似资料:
  • 问题内容: 我在中创建两个对象,然后执行以下操作。 运行代码时,我可以看到两个矩形(一个在Aqua中,一个在黑色中),当我单击按钮时,我必须等待2秒钟才能查看两个矩形的颜色变化。 我先更改一个矩形的颜色,然后再更改下一个矩形的颜色。 我的问题是为什么我应该等待2秒?有没有一种方法可以动态更新矩形的颜色? 问题答案: 您正在UI线程上睡眠,该线程会阻止任何进一步的处理(包括刷新屏幕)。 如果需要延迟

  • 我正在开发一个C应用程序,可以计算一些值。我需要把这些值放在一个x×x的字符串数组中。如果我知道“x”是一个例子,我知道我可以做: 不幸的是,我不知道“x”将是什么。有没有一种方法可以在C#中动态增长矩阵?如果是,如何?

  • 问题内容: 我需要实现一个2D动态数组。行数是固定的,例如n。但是每一行的列数不是固定的,并且是等效的。例如,第一行包含3个元素,第二行包含5个元素。如何使用Arraylist在Java中执行此操作。谢谢。 问题答案: 怎么样 例如:

  • 我正在学习C。我有一个程序,可以动态创建和填充两个矩阵X和Y,使用随机数使用rand(),如下所示 当我运行这个程序并给出2作为我的矩阵的大小时,我看到“分离故障”是错误。请注意,我们的想法是用双精度类型的随机元素填充两个矩阵。如果上面的代码是正确的,请告诉我。 更正:编辑1 以上功能现在正常工作。需要解释x=(double**)malloc(m*sizeof(double*));并且x[i]=(

  • 我使用Spring Boot和百里香叶,并尝试使用表单设置列表元素(即对象)。更准确地说,我有两个实体:聚合答案列表的问题,我将问题对象传递给模型,并尝试在迭代中设置每个答案对象。当按下保存(提交表格)时,我得到异常: 字段“答案”上对象“问题”中的字段错误:拒绝值[[答案(id=0,答案编号=1,文本=,正确=假),答案(id=0,答案编号=2,文本=,正确=假),答案(id=0,答案编号=3,

  • 问题内容: 我是Groovy的新手,尽管阅读了许多有关此的文章和问题,但我仍然不清楚发生了什么。到目前为止,据我了解,当您在Groovy中创建新数组时,底层类型是Java ArrayList。这意味着它应该可调整大小,您应该能够将其初始化为空,然后通过add方法动态添加元素,如下所示: 编译,但是在运行时失败:方法的无签名:[LMyType; .add()适用于参数类型:(MyType)值:[My