我对编码仍然很陌生,所以我只是尝试制作一些像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;
但我无法弄清楚如何在程序运行时更改坐标值。
提前致谢!
答案 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);
}
}