Ich versuche, ein Kachel-basiertes Spiel zu machen. Ich machte eine Tile
Klasse und gab jedem seinen eigenen Rectangle
für die Kollision. Sobald ich sie rendere und aktualisiere, speichere ich alle in einem ArrayList
. Dieser Teil funktioniert gut, aber wenn ich versuche, von einer anderen Klasse durch einen Getter auf denselben ArrayList
zuzugreifen, bekomme ich keines der Elemente. Ich überprüfen Sie die Größe mit meiner Konsole, und es gibt mir die richtige Nummer, aber wenn ich versuche, um tatsächlich dh rect.get(0)
ein Element zu erhalten, bekomme ich diese Fehler:Hilfe benötigt Mit ArrayList Synchronisieren
Exception in thread "Thread-3" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
Ich denke, es ist ein Thread Sicherheitsproblem, aber Ich habe alles versucht, was ich von der Verwendung des Schlüsselwortes synchronize
bis Collections
denken konnte, aber kein Glück. Jede Hilfe würde wirklich geschätzt werden.
Mit Code bearbeitet. Traurig über Entsendung es nicht früher
public class Launcher extends JFrame implements Runnable {
private static final long serialVersionUID = 1L;
private static final int WIDTH = 1500;
private static final int HEIGHT = 900;
private static final String title = ("Game Alpha");
volatile boolean running;
Thread CT;
Canvas canvas = new Canvas();
Dimension size = new Dimension(WIDTH, HEIGHT);
Camera camera;
Controls controls;
PlayerTest pt;
BufferStrategy BS;
Graphics graphics;
//I'm declaring the arrayList here
public ArrayList<Rectangle> bounded = new ArrayList<Rectangle>();
public Launcher() {
Sprites.resources();
controls = new Controls();
GUI();
//The camera class is the one in which I'm trying to access the list
//It's there right now just to test, I plan on changing it later
camera = new Camera(this, controls, 0, 0);
pt = new PlayerTest(this, canvas.getWidth()/2, canvas.getHeight()/2);
Tiles.tileSets();
CT = new Thread(this);
START();
}
public void GUI() {
setTitle(title);
setPreferredSize(size);
setResizable(false);
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
addKeyListener(controls);
canvas.setPreferredSize(size);
canvas.setMaximumSize(size);
canvas.setMinimumSize(size);
canvas.setFocusable(false);
add(canvas);
setVisible(true);
}
public void render() {
BS = canvas.getBufferStrategy();
if(BS == null) {
canvas.createBufferStrategy(3);
return;
}
graphics = BS.getDrawGraphics();
graphics.setColor(Color.ORANGE);
graphics.fillRect(0, 0, WIDTH, HEIGHT);
Rectangle cam = new Rectangle((int)camera.getX(),
(int)camera.getY(),
camera.getWidth(),
camera.getHeight());
//Here I'm looping to get my tiles
for(int x = 0; x < 64; x++) {
for(int y = 0; y < 64; y++) {
Tiles.getTile(LevelCode.code[y][x]).setBounds(x * 50 - (int)camera.getXof(), y * 50 - (int)camera.getYof());
//Here I'm adding the rectangles from each tile into the array
bounded.add(new Rectangle(Tiles.getTile(code[y][x]).getBounds()));
}
}
pt.render(graphics);
BS.show();
graphics.dispose();
//Here after I render the tiles I clear the list, for my updates, then //repopulate
bounded.clear();
}
public ArrayList<Rectangle> getList() {
return bounded;
}
}
Wir können nicht Code debuggen, den wir nicht sehen. Bitte erstellen Sie ein testbares minimales Beispiel. Http://stackoverflow.com/help/mcve –
Ich denke, das ist eher ein Design-Problem als ein Multi-Threading-Problem. Sie können Methoden zum Thread-Speichern verwenden, indem Sie das Schlüsselwort "synchronized" verwenden. Bitte fügen Sie ein Codebeispiel ein. – Petterson
Ich wette 100 SO Punkte, dass er 2 Listen hat, und die, die er liest, ist leer. – Kayaman