我正在尝试更新我的数组,因此如果您向第一个数组 tail[0] 添加一些内容,整个数组都会更新并将 1 移动到下一个,最后最后一个 tail[49] 将被删除。
因此,如果我向 tail[0] 添加一个值,我希望 tail[1] 获得旧的 tail[0] 值,tail[2] 获得旧的 tail[1] 值,tail[3] 获得旧的 tail[2] 值。旧 tail[3] 的值将被删除。这就像每次删除最后一个值的数组推送。
到目前为止我已经试过了,但我无法让它工作。
创建数组:
Tail[] tail = new Tail[50];
给整个数组一个值:
for(int i = 0; i < tail.length; i++){
tail[i] = new Tail(0,0);
}
更新数组,使其添加一个新值并删除最后一个值。
public void tail(){
tail[0] = new Tail(ball.getX(),ball.getY());
for(int i = 1; i < tail.length; i++){
tail[i] = new Tail(tail[i-1].x,tail[i-1].x);
}
}
尾部类:
public class Tail {
public float x;
public float y;
ShapeRenderer shapeRenderer;
SpriteBatch batch;
public boolean active = false;
public Tail(float x, float y){
shapeRenderer = new ShapeRenderer();
batch = new SpriteBatch();
this.x = x;
this.y = y;
batch.begin();
shapeRenderer.begin(ShapeType.Filled);
shapeRenderer.circle(x, y, 16);
shapeRenderer.setColor(Color.BLACK);
shapeRenderer.end();
batch.end();
Gdx.app.log("TailX"+x, "TailY"+y);
}
}
tail void 最终导致我的游戏崩溃什么是解决这个问题的最佳方法?
最佳答案
首先,当您尝试移动尾部时,您似乎正在创建一个新的尾部
。有什么理由吗?您应该能够通过移动引用来重复使用相同的实例。
此外,在您的代码中,您试图在位置 0 插入新元素,在移动所有其他元素之前。您需要以相反的方式进行操作,以确保只删除最后一项。应该可以用这样的东西:
for(int i = tail.length - 2; i >= 0; i--){
tail[i + 1] = tail[i];
}
tail[0] = new Tail(ball.getX(),ball.getY());
这样你只是移动 Tail
实例,而不是创建新实例。除非我误解了什么,否则这应该有效。
听起来您确实可以从使用队列中获益。队列旨在在一端插入元素并从另一端检索项目。
如果您使用的是 LinkedList
(它实现了 Deque
接口(interface))而不是数组,您应该可以这样做:
tail.addFirst(new Tail(ball.getX(), ball.getY()));
tail.removeLast();
关于Java数组向第一个添加新值并删除最后一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28212228/