2017-02-07 2 views
-1

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; 
    } 

} 
+4

Wir können nicht Code debuggen, den wir nicht sehen. Bitte erstellen Sie ein testbares minimales Beispiel. Http://stackoverflow.com/help/mcve –

+0

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

+3

Ich wette 100 SO Punkte, dass er 2 Listen hat, und die, die er liest, ist leer. – Kayaman

Antwort

-1

synchronisieren (wenn es richtig gemacht) bedeutet dies, keinen Faden Sicherheitsproblem ist, obwohl Sie den eigentlichen Code nicht gebucht haben, so ist es möglich, dass Sie es falsch machen.

Der wahrscheinlichste Fall hier ist, dass es tatsächlich mehrere ArrayList s gibt und Sie auf die falschen zugreifen. Versuchen Sie, die ID (die Nummer nach der # wenn Sie toString) überprüfen und stellen Sie sicher, dass es für beide Orte gleich ist.