Objekte bewegen in Java



  • Hallo,

    ich habe eine Grfaik an der Position (x,y) z.b (5,10) nun möchte ich das die Grfaik zu einem anderne Punkt wandert z.b (10,20) also sozusagen eine Animation wie kann man das machen das ? Muss man da mit Vekotren arbeiten ?

    mfg
    TCM



  • Was ist eine Grfaik?
    Man kann mit Vektoren arbeiten, wenn man will.



  • Hi,

    du machst es so, dass der nach ner bestimmten zeit, das Bild nochmal neu auf den Bildschirm zeichent, aber dann eben an einer anderen position. machst z.b.

    public class BewegeBild extends Applet
    {
      private int x=0;
      private int y=0;
    
      /* ... */
    
      public void paint(Graphics g)
      {
        g.clearArea(0, 0, this.getWidth(), this.getHeight());
        g.drawImage(meinBild, x, y, this); // Bild malen
        x+=10; // x-koordinate verändern
        y+=5; /* y verändern. Beim nächsten zeichnen ist dann das Bildchen an ner
              anderen Position */
      }
    }
    

    Jetzt bastelst du dir noch nen Thread, der dir nach ner bestimmten Zeit wieder dein Bild neu zeichnet.

    Ich denk mal, du möchtest das in nem Applet machen?!

    Beste Grüße
    Jan



  • Genau im Applet. Nur im Momenet versteh ich das Prinzip noch nicht genau wie die Grafik wandern soll. Wenn der Startpunkt und der Endpunkt dieselbe y-Koordinate haben wandert die Grafik sozusagen auf der selben Ebene das ist ja nicht schwer. Aber wenn z.B die Grafik von der linken oberen Ecke nach rechts unten wanderen soll. Da muss man ja beide Koordianten verändern.



  • TCM schrieb:

    Da muss man ja beide Koordianten verändern.

    Stimmt 100 Punkte!!!



  • genau das musst du machen. du musst halt solange die koordinaten beim aufruf verändern, bis die koordinaten mit den zielkoordinaten übereinstimmen.



  • Ich würde dafür "Threads" nehmen. So entsteht eine Art Animation. Die Klasse "Thread" liegt in java.lang bzw. man könnte das Runnable-Interface verwenden.



  • Ein Thread für alle animierten Objekte oder jedes animierte Objekt in einen Thread?



  • Nicht für jedes einen Fred, das ist zu viel.



  • Ich würde dafür "Threads" nehmen.

    Hatte ich ja schon vorgeschlagen.

    Bastel die nen Thread, der dir die paint()-Methode aufruft.

    Sowas ungefähr:

    import java.applet.Applet;
    
    public class Animieren extends Thread
    {
      private Applet a;
      private long   sleep;
    
      public Animieren(Applet a, long s)
      {
        this.a=a;
        sleep =s; // Angabe der Pause zwischen dem Zeichnen in millisekunden
      }
    
      public void run()
      {
        try
        {
          while(true)
          {
            a.repaint(); // Zeichnet neu
            Thread.sleep(sleep); // Wartet, bis die Zeit sleep abgelaufen ist
          }
        }
        catch(Exception e)
        {
        }
      }
    }
    

    Dafür muss die andere Klasse ungefähr so aussehen:

    import java.applet.Applet;
    import java.awt.*;
    
    public class BewegeBild extends Applet
    {
      private int x=0;
      private int y=0;
    
      public void init()
      {
        Thread t=new Animation(this, 40);
        t.start();
        /* ... */
      }
    
      public void update(Graphics g)
      {
        paint(g);
      }
    
      public void paint(Graphics g)
      {
        g.clearArea(0, 0, this.getWidth(), this.getHeight());
        g.drawImage(meinBild, x, y, this); // Bild malen
        x+=10; // x-koordinate verändern
        y+=5; /* y verändern. Beim nächsten zeichnen ist dann das Bildchen an ner
              anderen Position */
      }
    }
    


  • public void paint(Graphics g) { 
        g.clearArea(0, 0, this.getWidth(), this.getHeight()); 
        g.drawImage(meinBild, x, y, this); // Bild malen 
        x+=10; // x-koordinate verändern 
        y+=5; /* y verändern. Beim nächsten zeichnen ist dann das Bildchen an ner 
              anderen Position */ 
      }
    

    Die Koordinaten in der paint-Methode zu verändern ist ungesund.
    Dies sollte außerhalb geschehen. Z.B. durch eine Methode
    advance(), die dann vor dem repaint()-Aufruf in der
    Thread-Klasse aufgerufen wird.

    Hierzu darf dann die Variable a naturlich nicht mehr
    von Typ Applet sein, sondern vom Typ BewegeBild.

    Noch besser ist es allerdings hierfür ein Interface zu
    definieren, das diese Methode enthält.


Anmelden zum Antworten