Gra Arkanoid, niezrozumiały błąd

0

Już prawie wszystko działa, tylko w pewnym momencie program wiesz się i wywala błąd. Treść błędu:

 Exception in thread "Thread-2" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
	at java.util.ArrayList.RangeCheck(Unknown Source)
	at java.util.ArrayList.get(Unknown Source)
	at Kulka.nextKrok(Gra.java:54)
	at SilnikKulki.run(Gra.java:79)

No i właśnie nie rozumiem o co chodzi. Jako, że nie wiem jak ponumerować linie więc za kodem z linii 54 i 79 będzie //!!! ;)
Obecnie kod wygląda tak:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.geom.*;
import java.util.ArrayList;


class Kulka extends Ellipse2D.Float
{
   Pole plansza;
   int dx,dy;
   Belka b;
   
   ArrayList<Cegielka> lista= new ArrayList<Cegielka>(8);
    

   
   Kulka(Pole plansza,int x,int y,int dx,int dy,Belka b, ArrayList<Cegielka> l) 
   {                                             
      this.x=x;                                  
      this.y=y;                                  
      this.width=10;                             
      this.height=10;                            
                                                 
      this.plansza=plansza;                      
      this.dx=dx;                                
      this.dy=dy;
      
      this.b=b;
      for(int i=0; i<8;i++){
    	  this.lista=l;
      }
   }                                             
   
   void nextKrok()                                              
   {                                                           
      x+=dx;                                                   
      y+=dy;                                                   
                                                               
      if(getMinX()<0 || getMaxX()>plansza.getWidth())  dx=-dx; 
      if(getMinY()<0 || getMaxY()>plansza.getHeight()) dy=-dy; 
      if(getY()==245 && getX()>b.getXx()&& getX()<(b.getXx()+60)) dy=-dy;
      if(getY()==255 && getX()>b.getXx()&& getX()<(b.getXx()+60)) dy=-dy;
      for(int i=0;i<lista.size();i++){
	if(getY()==lista.get(i).getYy()-10  && getX()>lista.get(i).getXx() && getX()<lista.get(i).getXx()+40){
                       dy=-dy;
                        lista.remove(i);}
	if(getY()==lista.get(i).getYy()+10 && getX()>lista.get(i).getXx() && getX()<lista.get(i).getXx()+40) { 
                         dy=-dy;
                          lista.remove(i);}
        if(getX()==lista.get(i).getXx()  && getY()>lista.get(i).getYy() && getY()<lista.get(i).getYy()+20) {
                          dx=-dx;
                           lista.remove(i);}
	if(getX()==lista.get(i).getXx()+40 && getY()>lista.get(i).getYy() && getY()<lista.get(i).getYy()+20){     //!!!
                          dx=-dx;
                          lista.remove(i);}
      }
                                                               
      plansza.repaint();                                       
   }                                                           
}

class SilnikKulki extends Thread
{
   Kulka a;
   
   SilnikKulki(Kulka a) 
   {                    
      this.a=a;         
      start();          
   }                    
   
   public void run()                   
   {                                  
      try                             
      {                               
         while(true)                  
         {                            
            a.nextKrok();       //!!!     
            sleep(15);                
         }                            
      }                               
      catch(InterruptedException e){} 
   }                                  
}


class Cegielka extends Rectangle2D.Float
{ 
	Cegielka(int x, int y)       
	   {                  
	      this.x=x;
	      this.y=y;     
	      this.width=40;  
	      this.height=20; 
	   }
	 float getXx(){
		   float polozenie=0;
		   polozenie=this.x;
		   return polozenie;
	   }
	 float getYy(){
		   float polozenie=0;
		   polozenie=this.y;
		   return polozenie;
	   }
}

class Belka extends Rectangle2D.Float
{
   Belka(int x)       
   {                  
      this.x=x;
      this.y=250;     
      this.width=60;  
      this.height=10; 
   }                  
   
   void setX(int x) 
   {                
      this.x=x;     
   }  
   float getXx(){
	   float polozenie=0;
	   polozenie=this.x;
	   return polozenie;
   }
}

class Pole extends JPanel implements MouseMotionListener
{
   Belka b=new Belka(100);  
  Cegielka[] c={new Cegielka(100,50),new Cegielka(145,50),new Cegielka(190,50),new Cegielka(235,50),new Cegielka(100,75),new Cegielka(145,75),new Cegielka(190,75),new Cegielka(235,75)};
  ArrayList<Cegielka> l=new ArrayList<Cegielka>();{ 
  for(int i=0; i<8;i++){
	  l.add(c[i]);
  }}
  Kulka a=new Kulka(this,100,100,1,1,b,l);
   
   Pole()                           
   {                                
      super();   
      setPreferredSize(new Dimension(400,300));
      addMouseMotionListener(this); 
      new SilnikKulki(a);           
   }                                
   
   public void paintComponent(Graphics g)                                                       
   {                                                                                           
      super.paintComponent(g);                                                                 
      Graphics2D g2d=(Graphics2D)g;                                                            
                                                                                               
      g2d.fill(a);    //kulka                                                                         
      g2d.fill(b);		//belka
      for(int i=0; i<l.size();i++){
    	  g2d.fill(l.get(i));
      }
      
      
   }                                                                                           
   
   public void mouseMoved(MouseEvent e) 
   {                                    
      b.setX(e.getX()-30);   //-30 zeby za srodek belki trzymac           
      repaint();                        
   }                                    
   
   public void mouseDragged(MouseEvent e) 
   {                                      
                                          
   }                                      
}
public class Gra extends JFrame
{
   public static void main(String[] args)
   {
        new Gra();
   }
   public Gra()              
   {                              
        setContentPane(new Pole());
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);   
   }                              
}
1
      for(int i=0;i<lista.size();i++){
        if(getY()==lista.get(i).getYy()-10  && getX()>lista.get(i).getXx() && getX()<lista.get(i).getXx()+40){
                       dy=-dy;
                        lista.remove(i);}
        if(getY()==lista.get(i).getYy()+10 && getX()>lista.get(i).getXx() && getX()<lista.get(i).getXx()+40) { 
                         dy=-dy;
                          lista.remove(i);}
        if(getX()==lista.get(i).getXx()  && getY()>lista.get(i).getYy() && getY()<lista.get(i).getYy()+20) {
                          dx=-dx;
                           lista.remove(i);}
        if(getX()==lista.get(i).getXx()+40 && getY()>lista.get(i).getYy() && getY()<lista.get(i).getYy()+20){     //!!!
                          dx=-dx;
                          lista.remove(i);}
      }

Jeżeli i jest równe np. lista.size()-1 i jeden z warunków jest spełniony, to po wykonaniu lista.remove(i) i jest za duże, przekracza zakres listy.
Dodaj else, albo dopisz repaint i remove:

        if(getY()==lista.get(i).getYy()-10  && getX()>lista.get(i).getXx() && getX()<lista.get(i).getXx()+40){
                       dy=-dy;
                       lista.remove(i);
                       repaint();
                       return;}
        ...

1 użytkowników online, w tym zalogowanych: 0, gości: 1