Problem:
chce mieć na ekranie obiekt który sie będzie poruszał do przodu oraz OBRACAŁ (nie poruszał) w lewo lub w prawo w zaleznoćci od wcisniętej strzałki na klawiaturze
Wyczytałem że są różnego rodzaju przekształcenia afiniczne i z tego korzystam przy obrocie. Obiekt obraca sie bez problemów i porusza do przodu, ale do czasu. Po wykonaniu dwóch ruchów zaczyna sie dziwnie poruszać i przeskakiwać z miejsca na miejsce gdy chce sie wykonać jakis ruch, potem znowu działa normalnie ale tylko samo obracanie.

oto kod:
obsluge klawiszy i to ze działa to w osobnym wątku pomijam

class Statek
{
    private static final int XSIZE =20;
    private static final int YSIZE =20;
    private static final int STEP=2;
    private double x=40;
    private double y=40;
    private double kat=0.0;
    private double katdx=2;
    private double dx=5;
    Rectangle2D r2d=new Rectangle2D.Double(x,y,XSIZE,YSIZE);
    
    private AffineTransform t=new AffineTransform();    
    Statek()
    {}

    public void move(Rectangle2D bounds) 
    {
        
        x=x+STEP;
        y=r2d.getY();
        
        if(x+XSIZE<bounds.getMinX()) //lewa ścianka pola gry (okna)
        {
                x=bounds.getMaxX();
          
        }
        if(x-XSIZE>=bounds.getMaxX()) //prawa scianka
        {
            x=bounds.getMinX()-XSIZE;
          
        }
        if(y+XSIZE<bounds.getMinY()) //gorna scianka
        {
            y=bounds.getMaxY();//XSIZE;
          
        }
        if(y-YSIZE>=bounds.getMaxY())
        {
            y=bounds.getMinY()-YSIZE;
          
        }
    }
    
    public void angle(double katdx)
    {
          kat=kat+katdx;
          t.setToRotation(Math.toRadians(kat),r2d.getCenterX(),r2d.getCenterY());
      
    }
    
    public Shape getShape() 
    {
        r2d=new Rectangle2D.Double(x,y,XSIZE,YSIZE);
        return r2d;
    }
    
    public AffineTransform getTransform()
    {
        return t;
    }
}

a to klasa rysujaca (niektore obiekty sa nadmiarowe w deklaracji ale to przecież nie oto chodzi)

class AsteroidsPanel extends JPanel
{
    private ArrayList<ObiektGry> ObiektyNaPlanszy = new ArrayList<ObiektGry>();
    private double x=10;
    private double y=10;
    private static final double XSIZE =20;
    private static final double YSIZE =20;
    Rectangle2D r2d=new Rectangle2D.Double(x,y,XSIZE,YSIZE);
    Graphics2D MainGraphState,LastGRaph;
    AffineTransform TransformTmp=new AffineTransform();

    Statek StatekKosmiczny=new Statek();

    
    AsteroidsPanel(boolean logicvalue) // ustawienie podwójnego buforowania - true
    {
        super.setDoubleBuffered(logicvalue);
    }
    /**
     * Dodawanie obiektu do panelu reprezentującego okno główne
     * @param a Obiekt który dodajemy
     */
    public void add(ObiektGry a)
    {
        ObiektyNaPlanszy.add(a);
    }
    
    public void addStatek(Statek S)
    {
        StatekKosmiczny=S;
    }
    
    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2=(Graphics2D) g;
        
        for(ObiektGry a:ObiektyNaPlanszy)
        {
            g2.fill(a.getShape());
        }
        MainGraphState=g2;

        TransformTmp=StatekKosmiczny.getTransform();

        g2.transform(TransformTmp);
        
        g2.setColor(Color.RED);
        g2.fill(StatekKosmiczny.getShape());
        g2.setColor(Color.BLACK);
        
        g2=MainGraphState;
    }
    
    
    @Override
    public boolean isFocusTraversable() 
    {
        return true; //zezwala na aktywacje panelu i w wyniku mamy obsluge klawiszy
    }
}

a może ktoś ma pomysł jak inaczej zrobić taki obiekt żeby można sie było poruszać nim do przodu oraz obracać w lewo i prawo i poruszać w tym kierunku w którym jest obrócony.

próbowałem stosować rotate(kat, x,y) zamiast AffineTransform ale nie mam pomysłu jak potem utrzymywać kontekst graficzny tego co sie wcześniej narysowało

bo konstrukcja typu poniższego nie działa choć sie kompiluje:

flag=1;
   if(flag==1){
            LastGRaph=g2;
            flag=0;
        }
        else
        {
              g2=LastGRaph;
        }
        
        g2.setColor(Color.RED);
        g2.rotate(StatekKosmiczny.kat(), StatekKosmiczny.getCenterX(), StatekKosmiczny.getCenterY());
        g2.fill(StatekKosmiczny.getShape());
        LastGRaph=g2;
        g2.setColor(Color.BLACK);
        
        g2=MainGraphState;