Laufanimation mit Thread.sleep();

Hallo,
ich habe eine provisorische Laufanimation programmiert, die ich erst vollständig zum laufen bringen will, bevor ich sie woanders einbaue.Momentan stehe ich auf dem Schlauch, denn:
1.Ich bekomme im Compiler folgende seltsame Fehlermeldungen:

LaufAnimation.java:70:9: error: unreachable statement
Thread.sleep(500);
^
LaufAnimation.java:70:9: error: unreachable statement
try {
^

     ^

2 errors

2.Bei früheren tests mit dieser Methode ergab es sich, dass das Programm erst alle sleeps() zusammen gerechnet, und anschliessend gewartet und erst dann, das letzte Bild der Animation angezeigt hat.

import javax.swing.*;
import javax.imageio.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class LaufAnimation{
  //VARIABLEN
  public static Image background;
  public static Image spieler;
  public static int spXposakt = 600;
  public static int spYposakt = 100;
  public static JFrame f;
  public static Container panel;
  public static MS_LA ml_animation = new MS_LA();
  public static Image la[] = new Image[5];
  public static LaufAnimation l = new LaufAnimation();
  //FENSTER START
  public LaufAnimation(){};
  public static void erstelleFenster(){
    f = new JFrame("Lauf-Animation");
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    panel = new Animation();
    f.setSize(1000, 300);
    f.getContentPane().add(panel, BorderLayout.CENTER);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setVisible(true);
    l.laden();
    f.addMouseListener(ml_animation);
  }
  
  public static void main(final String[] args){
    Runnable gui = new Runnable(){;
      @Override
      public void run(){
        erstelleFenster();
      }  
    };
    SwingUtilities.invokeLater(gui);  
  }
  public static void laden(){
    int i = 1;
    try {
      while(i<5) {
        la** = ImageIO.read(LaufAnimation.class.getResource("LA"+i+".png"));
        i++;
      }
    } catch(IOException e) {
      System.err.println(e);
    }
  }
  static class MS_LA implements MouseListener{
    public void mouseClicked(MouseEvent e){
      int c = 1;
      int klickPosX = e.getX();
      int klickPosY = e.getY();
      //Laufen
      while (spXposakt < klickPosX && spYposakt < klickPosY) { 
        spXposakt = spXposakt +50;
        spYposakt = spYposakt +50;
        while (true) { 
          spieler = la```;
          c++;
          if (c > 4) {
            c = 1;
          }
        }
                try { 
          Thread.sleep(500);
        } catch(Exception ie) {
          return;
        }
        f.repaint();
      }
    }  
    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e){}
    public void mousePressed(MouseEvent e){}
    public void mouseReleased(MouseEvent e){} 
  }
  
  private static class Animation extends JPanel{
    Animation(){
      super(); 
    }
    @Override
    protected void paintComponent(final Graphics g){
      super.paintComponent(g);      
      g.drawImage(background, 0, 0, 1600, 855, this);
      g.drawImage(spieler, spXposakt, spYposakt, this);
    }  
  }
} 

Ich hoffe jemand kann mir einen Denkanstoß in die richtige Richtung geben.

Mit while(true) hast du dir da eine Endlosschleife gebaut. Alle Anweisungen nach der Schleife sind damit nicht mehr ausführbar/erreichbar. Genau das will dir diese Fehlermeldung sagen.
Es wird nur das letzte Bild gezeichnet, weil du den EDT (Event Dispatching Thread) blockierst.

Ich habs jetzt so, aber es hängt sich auf und macht gar nichts mehr.

import javax.swing.*;
import javax.imageio.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class LaufAnimation{
  //VARIABLEN
  public static Image background;
  public static Image spieler;
  public static int spXposakt = 600;
  public static int spYposakt = 100;
  public static JFrame f;
  public static Container panel;
  public static MS_LA ml_animation = new MS_LA();
  public static Image la[] = new Image[5];
  public static LaufAnimation l = new LaufAnimation();
  public static Thread t = new Thread();
  //FENSTER START
  public LaufAnimation(){};
  public static void erstelleFenster(){
    f = new JFrame("Lauf-Animation");
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    panel = new Animation();
    f.setSize(1000, 300);
    f.getContentPane().add(panel, BorderLayout.CENTER);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setVisible(true);
    l.laden();
    f.addMouseListener(ml_animation);
  }
  
  public static void main(final String[] args){
    Runnable gui = new Runnable(){;
      @Override
      public void run(){
        erstelleFenster();
      }  
    };
    SwingUtilities.invokeLater(gui);  
  }
  public static void laden(){
    int i = 1;
    try {
      while(i<5) {
        la** = ImageIO.read(LaufAnimation.class.getResource("LA"+i+".png"));
        i++;
      }
    } catch(IOException e) {
      System.err.println(e);
    }
    background = la[1];
    spieler = la[2];
    t.start();
  }
  static class MS_LA implements MouseListener{
    public void mouseClicked(MouseEvent e){
      int c = 2;
      int klickPosX = e.getX();
      int klickPosY = e.getY();
      //Laufen
      while (spXposakt < klickPosX && spYposakt < klickPosY) { 
        spXposakt = spXposakt +50;
        spYposakt = spYposakt +50;
        while (c<5) { 
          spieler = la```;
          c++;
          if (c > 4) {
            c = 2;
          }
        }
        try { 
          t.sleep(500);
        } catch(Exception ie) {
          return;
        }
        
        f.repaint();
      }
    }  
    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e){}
    public void mousePressed(MouseEvent e){}
    public void mouseReleased(MouseEvent e){} 
  }
  
  private static class Animation extends JPanel{
    Animation(){
      super(); 
    }
    @Override
    protected void paintComponent(final Graphics g){
      super.paintComponent(g);      
      g.drawImage(background, 0, 0, 1600, 855, this);
      g.drawImage(spieler, spXposakt, spYposakt, this);
    }  
  }
}

Ohne Fehlermeldung?
Nimm mal das return; aud der Zeile 77 und setze da mal ein ie.printStackTrace();
oder ein System.err.println(ie); ein. Dann bekommst du möglicherweise eine Fehlermeldung, die uns/dir weiterhilft.

Hab ich gemacht kommt nix, und ich hab rausgefunden, wenn man länger wartet, und nicht gleich über den Taskmanager beendet, wird das Fenster schwarz, hilft das was?

Das

        while (c<5) {
          spieler = la```;
          c++;
          if (c > 4) {
            c = 2;
          }
        }

ist eine Endlosschleife.

Abgesehen davon wird durch das
t.sleep(500);
in der mouseClicked wieder der Event-Dispatch-Thread blockiert.

Ansonsten… ja, wo soll man anfangen. Vielleicht damit, dass die ganzen Variablen nicht static sein sollten…

Nochmal ein Vorschlag, auch nur schnell runtergeschrieben, aber … naja…

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

class Animation
{
    private final Image background;

    private final Image animationImages[];
    private int currentImageIndex = 0;

    private final Point currentPosition = new Point(300, 300);
    private final Point targetPosition = new Point(300, 300);

    Animation()
    {
        // TODO Use ImageIO.read(LaufAnimation.class.getResource(name)); here!
        background = createDummyImage("Background", Color.WHITE);
        animationImages = new Image[5];
        for (int i = 0; i < 5; i++)
        {
            animationImages** = createDummyImage("Image " + i, Color.RED);
        }
    }

    Image getBackground()
    {
        return background;
    }

    Image getCurrentImage()
    {
        return animationImages[currentImageIndex];
    }

    Point getCurrentPosition()
    {
        return new Point(currentPosition);
    }

    void setTargetPositon(Point target)
    {
        targetPosition.setLocation(target);
    }

    void doStep()
    {
        int stepSize = 20;
        int dx = targetPosition.x - currentPosition.x;
        int dy = targetPosition.y - currentPosition.y;
        if (Math.abs(dx) < stepSize)
        {
            currentPosition.x = targetPosition.x;
        }
        else if (dx > 0)
        {
            currentPosition.x += stepSize;
        }
        else if (dx < 0)
        {
            currentPosition.x -= stepSize;
        }

        if (Math.abs(dy) < stepSize)
        {
            currentPosition.y = targetPosition.y;
        }
        else if (dy > 0)
        {
            currentPosition.y += stepSize;
        }
        else if (dy < 0)
        {
            currentPosition.y -= stepSize;
        }
        currentImageIndex = (currentImageIndex + 1) % animationImages.length;
    }

    boolean animationFinished()
    {
        return currentPosition.equals(targetPosition);
    }

    private static BufferedImage createDummyImage(String s, Color c)
    {
        BufferedImage image =
            new BufferedImage(200, 200, BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();
        g.setColor(c);
        g.fillRect(0, 0, 200, 200);
        g.setColor(Color.BLACK);
        g.drawString(s, 20, 20);
        g.dispose();
        return image;
    }
}

class AnimationPanel extends JPanel
{
    private Animation animation;

    AnimationPanel(Animation animation)
    {
        this.animation = animation;
    }

    @Override
    protected void paintComponent(final Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(animation.getBackground(), 0, 0, 1600, 855, this);

        Point position = animation.getCurrentPosition();
        g.drawImage(animation.getCurrentImage(), position.x, position.y, this);
    }
}

class AnimationRunner
{
    private final int STEP_DELAY_MS = 50;
    private volatile boolean running = true;
    private final Animation animation;
    private final AnimationPanel animationPanel;
    private final Object monitor = new Object();
    private final Thread animationThread;

    AnimationRunner(Animation animation, AnimationPanel animationPanel)
    {
        this.animation = animation;
        this.animationPanel = animationPanel;

        animationThread = new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                doRun();
            }
        });
        animationThread.start();
    }

    private void doRun()
    {
        while (running)
        {
            while (animation.animationFinished())
            {
                try
                {
                    synchronized (monitor)
                    {
                        monitor.wait();
                    }
                }
                catch (InterruptedException e)
                {
                    Thread.currentThread().interrupt();
                    return;
                }
            }
            animation.doStep();
            animationPanel.repaint();
            try
            {
                Thread.sleep(STEP_DELAY_MS);
            }
            catch (InterruptedException e)
            {
                Thread.currentThread().interrupt();
                return;
            }
        }
    }

    public void runTo(Point targetPosition)
    {
        animation.setTargetPositon(targetPosition);
        synchronized (monitor)
        {
            monitor.notifyAll();
        }
    }
}

public class LaufAnimation
{
    public static void main(final String[] args)
    {
        Runnable gui = new Runnable()
        {
            @Override
            public void run()
            {
                erstelleFenster();
            }
        };
        SwingUtilities.invokeLater(gui);
    }

    public static void erstelleFenster()
    {
        JFrame f = new JFrame("Lauf-Animation");
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        Animation animation = new Animation();
        AnimationPanel animationPanel = new AnimationPanel(animation);
        final AnimationRunner animationRunner =
            new AnimationRunner(animation, animationPanel);

        animationPanel.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                animationRunner.runTo(e.getPoint());
            }
        });

        f.setSize(1000, 800);
        f.getContentPane().add(animationPanel, BorderLayout.CENTER);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

}

Tut mir leid, aber ich steig bei deinem Code nicht durch, gibt es denn keine einfachere Methode?
:confused:

Mir ist nicht klar, was das Ziel ist.

Wenn du ein Spiel schreiben willst, mit den „einfachen“ Mitteln wie sie in dem Code vorkommen, den du bisher gepostet hast, wird das nicht sehr weit führen. Ich glaube ja, dass Java einem da eine unangemessene Einfachheit suggeriert. Mit 10 Zeilen hat man ein Fenster offen, noch 5 Zeilen mehr und man sieht ein Bild, und nochmal 5 Zeilen und man kann auf Mausklicks und Tastendrücke reagieren - von der vermeintlichen Einfachkeit von Threads mal ganz abgesehen. Aber wenn man aus diesen 20 Zeilen dann ein Spiel machen will, indem man nochmal ein paar hundert „ähnliche“ Zeilen dazuschreibt, kommt eben das raus, was du gepostet hast: Alles static, alles in einer Klasse, und funktionieren tut es auch nicht richtig.

Wenn es dein Ziel ist, „Java Programmieren zu lernen“, dann stellt sich die Frage, was notwendig ist, damit du bei dem Code „durchsteigst“. Üblicherweise helfen da die Tutorials, die überall verlinkt sind, einschließlich der Ground Truth - Referenzen
http://docs.oracle.com/javase/tutorial/uiswing/index.html
und darin speziell
http://docs.oracle.com/javase/tutorial/uiswing/components/index.html
http://docs.oracle.com/javase/tutorial/uiswing/events/index.html
http://docs.oracle.com/javase/tutorial/uiswing/painting/index.html

Die kann man mit unterschiedlich viel Einsatz und Nachdruck systematisch durcharbeiten, oder (was vermutlich sinnvoll ist!) wie einen „Steinbruch“ sehen, wo man sich das rauspickt, was man gerade machen will. Aber das alles braucht viel Zeit und Engagement, und darüber, wie man ein Programm (das mehr als 100 Zeilen hat) einigermaßen vernünftig strukturiert, lernt man darin NICHTS. Die Grundlagen dafür stehen in
http://docs.oracle.com/javase/tutorial/java/index.html
und für alles weitere gibt es ganze Bibliotheken voller Bücher über Objektorientierte Programmierung und Softwaredesign.

Wie auch immer… vielleicht ist das hier was für dich:
http://www.java-forum.org/spiele-multimedia-programmierung/54795-quaxli-2d-spiele-tutorial.html
Ein Tutorial, auf Deutsch, mit Codebeispielen, ausführlich erklärt, wo ganz konkret ein Spiel mit Bildern und Interaktion und allem drum und dran entwickelt wird.

(Und immernoch frage ich mich, woher die verbreitete Illusion zu kommen scheint, Programmieren sei einfach. Programmieren ist schwer. IMMER. Und prinzipbedingt: Wenn es einfach wäre, würde man so sehr versuchen, es besser zu machen, dass es DOCH wieder schwer wäre).

Danke, vieeeeelen Dank für den Tipp, dieses Spiele-Tutorial war genau das was ich gebraucht habe.

Und? Klappts inzwischen?