Animation/links-rechts

Diskutiere Animation/links-rechts im Java Basics - Anfänger-Themen Bereich.
S

spider4319

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_Sike

Kirby_Sike

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

    }
 
S

spider4319

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!?
 
M

Meniskusschaden

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.
 
mihe7

mihe7

@spider4319 statische Variablen, Timer, ... Youtube-Tutorial?

Noch ein Tipp: Du musst Dir natürlich merken, in welche Richtung das Rechteck gerade läuft.
 
S

spider4319

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!!!
 
S

spider4319

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

Blender3D

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

spider4319

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!
 
Blender3D

Blender3D

Was ist denn da der Vorteil von float? Vermutlich ist es bei der Positionierung präziser?
Wenn Du einen Bewegungsvektor von z.B.15° realisieren möchtest wäre bei ganzen Zahlen dx = 96 und dy = 26. --> bei jeder Änderung wächst x um 96 Punkte. Besser dx =.96 --> x wächst nicht ganz um einen Punkt.
 
Thema: 

Animation/links-rechts

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben