Animation/links-rechts

spider4319

Mitglied
Hallo, liebe Leute,

ich sitz jetzt schon eine gefühlte Ewigkeit an meiner Animation und komm nicht weiter. Es ist ja eigentlich wirklich simpel. Ich möchte mein animiertes Rechteck von links, also 0, nach recht verschieben, was ja auch gelingt. Mein Fenster ist 500 px breit und das Rechteck 30 pixel und bei 470 pixel bleibt es stehen. Nun will ich, dass sich die Animation wieder in die entgegengestzte Richtung bewegt. Ich krieg´s nicht hin!

Ich hab zwar hier im Forum vom Jahr 2009 was gefunden, aber wenn ich das so mach, dann funktioniert überhaupt nix.
Vielleicht hat jemen einen tipp!

Gruß und Danke im Voraus
Java:
public class Bewegung {
    Timer move;

    static int x = 0, y = 130;
   


    public Bewegung() {

        move = new Timer();
        move.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
           

                if (x  < 470) {
                   x +=1;
                   
                }
                else if(x > 470) {
                     x -=1;
                }
           

            }

        }, 0, 6);

    }

}
 

Kirby.exe

Top Contributor
Naja weil du den fall das x == 470 ist nicht abfängst ;)

So sollte es funktionieren:
Java:
public Bewegung() {

        move = new Timer();
        move.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
         

                if (x  < 470) {
                   x +=1;
                 
                }
                else if(x >= 470) {
                     x -=1;
                }
         

            }

        }, 0, 6);

    }
 

spider4319

Mitglied
Hallo Kirby_Sike! Danke für deine Antwort, aber was heisst der return nun? Dass das Rechteck sooft hin und her geschoben wird? Leider funktioniert es aber trotzdem nicht. Es bleibt einfach am rechte Rand bebend und zitternd hängen. Im paintComponent hab ich das Rechteck mit den x und y Koordinaten angegeben. Da müsste eigentlich alles richtig sein. Vielleicht hast du ja noch einen Tipp für mich!?
 

Meniskusschaden

Top Contributor
Du musst den Richtungswechsel so lange beibehalten, bis du wieder am linken Rand angekommen bist. Du gehst aber schon wieder nach rechts, wenn x kleiner als 470 wird. Dann wieder nach links bei x>=470, dann nach rechts ... So erklärt sich auch das Zittern.
 

spider4319

Mitglied
Hallo Leute, ich habs jetzt!! Ich hab gleich zwei Lösungsvorschläge. Mir ist es ja fast schon unangenehm wegen so einer banalen Sache das Forum zu bemühen, aber wenigstens versperrt mir jetzt das Brett vorm Hirn nicht mehr die Sicht!
😀
Code:
public class Bewegung {
    Timer move;

    static int x = 0, y = 130;
    static int vx = 1;

    public Bewegung() {

        move = new Timer();
        move.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {

                x = x + vx;

                if (x < 0 || x > 470) {
                    vx = -vx;

                }

            }

        }, 0, 6);

    }

}

die zweiter Variante ist etwas Aufwendiger, funktioniert aber auch:
Code:
public class Bewegung {
    Timer move;

    static int x = 0, y = 130;
    static int delay = 0;

    public Bewegung() {

        move = new Timer();
        move.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
                delay++;

                if (delay <= 470) {
                    x += 1;
                }
                if ((delay >= 480) && (delay < 950)){
                    x -= 1;
                }
                if((delay >= 960) && (delay < 1430)) {
                    x += 1;
                }
                if((delay >=1440)&& (delay <1910)) {
                    x -= 1;
                }
                if(delay > 1920){
                    
                    
                    
                {x=0; delay = 0;}
                }

            }
    

        }, 0, 6);

    }



}
Danke nochmals für die Hinweise!!!
 

spider4319

Mitglied
Und falls es noch jemandem Interessiert, hier noch die if else/if Variante:
Code:
 @Override
            public void run() {
            
            x = x + vx;
                
                 if (x  < 0) {
                     vx = -vx;
                 }
                 else if(x >= 470) {
                     vx = -vx;
                    
                    }
Jetzt weiss ich auch warum ich´s nicht verstanden hab. Ich brauch nicht nur zusätzlich einen Counter, ich muss sozusagen von 0 bis 470 und zurück, also wieder 0 alles in eine Richtung (in disem Fall -) angeben!! Danke Meniskusschaden!!
 

Blender3D

Top Contributor
Hallo Leute, ich habs jetzt!! Ich hab gleich zwei Lösungsvorschläge.
Die Lösung hat einige Schwachstellen.
Du möchtest mit der Klasse Bewegung ein Objekt innerhalb von Grenzen bewegen. So weit so gut.
Die Klasse verwaltet die Koordinaten des Objektes. Bisher nur die x Koordinate. Solltest Du aber Dein Objekt in beliebigen Winkeln bewegen wollen. Benötigst Du außerdem die y Koordinate. Um beliebige Winkel zu ermöglichen, sollest Du float statt int Variablen verwenden.
Außerdem sollten die Koordinaten nicht static sein.
Hier eine Variante Deiner Lösung die mehrere Objekte in beliebigen Winkeln ermöglicht.

blocks.PNG
Java:
import javax.swing.JFrame;

public class start {
    public static void main(String[] args) {
        JFrame frame = new JFrame("boxes");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new TestAnimation(500, 500));
        frame.pack();
        frame.setVisible(true);
    }
}
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.JComponent;

@SuppressWarnings("serial")
public class TestAnimation extends JComponent {
    private Rectangle bounds;
    private Animation[] box = new Animation[2];

    public TestAnimation(int width, int height) {
        setPreferredSize(new Dimension(width, height));
        int border = width / 20;
        bounds = new Rectangle(border, border, width - 2 * border, height - 2 * border);
        box[0] = new Animation(this, bounds, 0, 10);
        box[1] = new Animation(this, bounds, 0, 6);
        box[0].setBoundingBox(new Rectangle(80, 80, 50, 30));
        box[1].setBoundingBox(new Rectangle(80, 180, 30, 40));
        box[1].setSpeedByAngle(35, 1);
    }

    private void drawBox(Graphics g, Rectangle rect, Color color) {
        g.setColor(color);
        g.fillRect(rect.x, rect.y, rect.width, rect.height);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.DARK_GRAY);
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(Color.WHITE);
        g.drawRect(bounds.x, bounds.y, bounds.width, bounds.height);
        drawBox(g, box[0].getBoundingBox(), Color.RED);
        drawBox(g, box[1].getBoundingBox(), Color.BLUE);
    }
}
Java:
import java.awt.Rectangle;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JComponent;

public class Animation extends TimerTask {
    private float x; // position x
    private float y; // position y
    private float dx = 1; // speed x
    private float dy = 1; // speed y
    private Timer animate;
    private Rectangle bounds; // defines environment' s bounds
    private Rectangle boundingBox = new Rectangle(0, 0, 10, 10); // object bounding box
    private JComponent parent;

    public Animation(JComponent parent, Rectangle bounds, long delay, long period) {
        this.bounds = bounds;
        this.parent = parent;
        animate = new Timer();
        animate.scheduleAtFixedRate(this, delay, period);
    }

    public Rectangle getBoundingBox() {
        boundingBox.x = (int) this.x;
        boundingBox.y = (int) this.y;
        return boundingBox;
    }

    @Override
    public void run() {
        int xMax = bounds.x + bounds.width - boundingBox.width;
        int xMin = bounds.x;
        int yMax = bounds.y + bounds.height - boundingBox.height;
        int yMin = bounds.y;
        x += dx;
        y += dy;
        if (x >= xMax) {
            dx = -dx;
            x = xMax;
        }
        if (x < xMin) {
            dx = -dx;
            x = xMin;
        }
        if (y >= yMax) {
            dy = -dy;
            y = yMax;
        }
        if (y < yMin) {
            dy = -dy;
            y = yMin;
        }
        if ((int) x != boundingBox.x || (int) y != boundingBox.y)
            parent.repaint();

    }

    public void setBoundingBox(Rectangle boundingBox) {
        this.boundingBox = boundingBox;
        this.x = boundingBox.x;
        this.y = boundingBox.y;
    }

    public void setPosition(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public void setSpeedByAngle(float angle, float size) {
        angle = (float) Math.toRadians(angle);
        dx = (float) Math.cos(angle) * size;
        dy = (float) Math.sin(angle) * size;
    }

    public void setSpeed(float dx, float dy) {
        this.dx = dx;
        this.dy = dy;
    }
}
 

spider4319

Mitglied
Blender3D
Die Klasse verwaltet die Koordinaten des Objektes. Bisher nur die x Koordinate. Solltest Du aber Dein Objekt in beliebigen Winkeln bewegen wollen. Benötigst Du außerdem die y Koordinate.
Ja ich weiß, damit hatte ich auch kein Problem, sondern dass ich schlicht die links-rechts-Animation (oder up-down) und die damit verbundenen Richtungsanweisungen erst jetzt gerafft hab. Wenn ich sowas nicht auf die Reihe krieg, kann ich gleich aufhören!
Außerdem sollten die Koordinaten nicht static sein.
Danke für den Tipp! Bei so einer einfachen Animation ist es ja glaube ich auch egal, aber bei komplexeren Sachen würde ich natürlich die OOP-Vorteile von Java bevorzugen.
Um beliebige Winkel zu ermöglichen, sollest Du float statt int Variablen verwenden.
Was ist denn da der Vorteil von float? Vermutlich ist es bei der Positionierung präziser?

Mich würde aber noch interessieren, was ein setPreferredSize(new Dimension()); ist und was das kann? Wenn ich mich nicht verschaut hab, dann hast du kein JPanel oder JLabel!? Ich hab jetzt auf die schnelle bei Google auch nix brauchbares gefunden!

Coole Animation, ich hab´s mir ins Eclipse kopiert, Danke!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Animation Timer Nano Time Java Basics - Anfänger-Themen 2
J Animation eines Körpers auf der schiefen Ebene Java Basics - Anfänger-Themen 11
Anica Processing Animation Bild-Position ändern Java Basics - Anfänger-Themen 9
D Animation JPanel Java Basics - Anfänger-Themen 1
WetWer Animation JLabel Java Basics - Anfänger-Themen 2
A Animation einer Zahnradpumpe Java Basics - Anfänger-Themen 6
B Animation mit Thread(s) Java Basics - Anfänger-Themen 23
K Möglichkeiten um eine einfache Animation darzustellen Java Basics - Anfänger-Themen 7
C Animation nur einmal durchführen Java Basics - Anfänger-Themen 3
N Bilderarray als animation ablaufen lassen?? Java Basics - Anfänger-Themen 6
G Threads SuM Class Animation Java Basics - Anfänger-Themen 13
J .gif Animation Java Basics - Anfänger-Themen 4
J Animation Java Basics - Anfänger-Themen 5
M Animation in einem Multiplayerspiel Java Basics - Anfänger-Themen 3
S Animation nach bestimmter Zeit ausführen Java Basics - Anfänger-Themen 3
T Animation Java Basics - Anfänger-Themen 2
M Animation von Kreisen Java Basics - Anfänger-Themen 15
U Y-Animation Java Basics - Anfänger-Themen 3
K Animation: Ball fällt herunter Java Basics - Anfänger-Themen 2
G Zufalls Animation Java Basics - Anfänger-Themen 9
Luk10 einfach animation Java Basics - Anfänger-Themen 2
H Animation malen! Java Basics - Anfänger-Themen 2
S JTable mit Animation??? Java Basics - Anfänger-Themen 7
B Flash Animation SWF in Java absielen Java Basics - Anfänger-Themen 18
R Probleme mit Animation und der erstellung einer jar Datei. Java Basics - Anfänger-Themen 11
U Animation bleibt leer (weiß) Java Basics - Anfänger-Themen 5
T Animation übermalt panels Java Basics - Anfänger-Themen 6
M Simple Animation funktioniert nicht (JFrame, Canvas, Thread) Java Basics - Anfänger-Themen 6
S Desktop Animation Java Basics - Anfänger-Themen 15
T Abspeichern einer Animation in *.bmp Java Basics - Anfänger-Themen 12
K animation in applet, thread problem (?) Java Basics - Anfänger-Themen 3
K Animation warten lassen Java Basics - Anfänger-Themen 9
F Animation Java Basics - Anfänger-Themen 3
J Animation Java Basics - Anfänger-Themen 2
richis-fragen Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
N Hey Leute und zwar versuche ich gerade ein 2D Spiel zu Programmieren aber die Figur will sich nicht nach links oder rechts bewegen :( Java Basics - Anfänger-Themen 12
izoards Sortier Algorithmus für Bounding Box Elememte Links nach Rechts und von Oben nach Unten Java Basics - Anfänger-Themen 33
K Ein Objekt Auto kennt den Inhalt seines links und rechtsstehenden Autos, wie soll man das ermöglichen Java Basics - Anfänger-Themen 2
B Alle Links in einem Text suchen und ersetzen mit einem neuen Link Java Basics - Anfänger-Themen 18
H Links/Rechtsverschiebung oder was stellt das dar? Java Basics - Anfänger-Themen 2
O Naives links rechts einfügen in ADT Baum Java Basics - Anfänger-Themen 8
R HTTP-Links in Java Class finden Java Basics - Anfänger-Themen 3
M Erste Schritte Links öffnen Java Basics - Anfänger-Themen 6
C eine diagonale von rechts nach links im 2d-array Java Basics - Anfänger-Themen 1
U Best Practice Nicht-permanente Links auf Dateien Java Basics - Anfänger-Themen 5
M suche/brauche Links über rein GUI Beispielprogramme Java Basics - Anfänger-Themen 4
B Links & Zusatzinformationen aus PDFs zusammentragen Java Basics - Anfänger-Themen 2
Haubitze_Broese Pattern für Links in RSS-Reader Java Basics - Anfänger-Themen 6
S Links ausführen und Ausführzeiten festlegen Java Basics - Anfänger-Themen 4
0din Applet und Links Java Basics - Anfänger-Themen 4
S HEX oder String rotieren lassen (rechts raus, links rein) Java Basics - Anfänger-Themen 3
M Links anpassen Java Basics - Anfänger-Themen 2
M HTML in JOptionPane-Dialog aber keine Links Java Basics - Anfänger-Themen 6
B DL Links aus Textdatei in BB Code einbetten Java Basics - Anfänger-Themen 5
H Icon links oben im JFrame deaktivieren? Java Basics - Anfänger-Themen 2
S jpanel links oben ausrichten Java Basics - Anfänger-Themen 7
M quelltext html-seite speichern + links speichern Java Basics - Anfänger-Themen 2
K Grafik beim JFrame oben Links ändern nur wie ? Java Basics - Anfänger-Themen 8
J Links zum jdk 6 Java Basics - Anfänger-Themen 25
M Strings links, rechts und centriert ausrichten Java Basics - Anfänger-Themen 12
B Links verfolgen -- Bibliothek nicht gefunden? Java Basics - Anfänger-Themen 6
Z Applet text der sich von links nsch rechts bewegt Java Basics - Anfänger-Themen 3
G JPanel (Abstand von links) Java Basics - Anfänger-Themen 1
M Formulare ausfüllen / Links aktivieren [erledigt] Java Basics - Anfänger-Themen 3
A Links aus Firefox an Java Programm weiterleiten Java Basics - Anfänger-Themen 6
C Links fuer Tuts und so. Java Basics - Anfänger-Themen 2
D HTML Code einlesen und nach Links parsen Java Basics - Anfänger-Themen 10
L JavaFx ListView rechts abgeschnitten Java Basics - Anfänger-Themen 0
C Input/Output Magisches Quadrat Rechts Formatieren Java Basics - Anfänger-Themen 4
M rechts shift (>>>) einer negativen Zahl Java Basics - Anfänger-Themen 10
T JScrollPane soll rechts gescrollt gezeichnet werden Java Basics - Anfänger-Themen 5
P JFrame rechts am Bildschirmrand anzeigen Java Basics - Anfänger-Themen 3
N In einer JToolbar das Icon ganz rechts anordnen Java Basics - Anfänger-Themen 5
C mouseDown (Event e, int x, int y) rechts oder linksklick ? Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben