Napisałem sobie taki prosty programik, w którym sterujemy kulką. Tzn klikamy w dowolny punkt na ekranie i w to miejsce "wędruje" kulka. W trakcie jej przemieszczania możliwe jest wskazanie nowego miejsca docelowego i wówczas kulka od razu zmienia kierunek na aktualny. Cała operacja trasowania i odświeżania pozycji jest zawarta w osobnym wątku.
Problem jest następujący: Gdy w trakcie wykonywania wątku poruszającego kulką podamy nowe współrzędne docelowe (klikniemy w jakieś miejsce) kulka przyspiesza. Kiedy znowu szybko klikniemy - przyspiesza jeszcze bardziej. Zmienia kierunek/trasę we właściwy sposób ale porusza się z większą szybkością - nie mam pojęcia dlaczego :/
Kluczowy fragment MouseListenera:
public void mouseReleased (MouseEvent e)
{
dMovThrd.setXY(e.getX(), e.getY());
if(! thrd1.isAlive())
{
Thread thrd1 = new Thread(dMovThrd);
thrd1.start();
}
}
Wątek poruszający kulką:
public class DiscMovingThread implements Runnable
{
Thread thrd;
MyPanel jpnl;
int x=0, y=0; // współrzędne docelowe
int discX, discY; // aktualne wpsółrzędne
public DiscMovingThread (String name, MyPanel panel)
{
thrd = new Thread(this, name);
jpnl = panel;
discX = jpnl.returnDiscX();
discY = jpnl.returnDiscY();
}
public void setXY(int x, int y)
{
this.x = x;
this.y = y;
}
public void run ()
{
while (discX != x || discY != y)
{
if(discX != x)
{
if(x-discX > 0)
{
jpnl.setDiscXY(discX+1, discY);
discX ++;
}
else
{
jpnl.setDiscXY(discX-1, discY);
discX --;
}
}
if(discY != y)
{
if(y-discY > 0)
{
jpnl.setDiscXY(discX, discY+1);
discY ++;
}
else
{
jpnl.setDiscXY(discX, discY-1);
discY --;
}
}
try
{
Thread.sleep(5);
jpnl.repaint();
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
Jakby ktoś chciał to tutaj jest cały (nieduży) kod: http://wklej.org/id/992964/