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