Animation läuft nicht mehr flüssig

Epitaph

Mitglied
Heyho,

Bin gerade dabei Quaxli's Tutorial zum Thema Spieleprogrammierung durchzugehen. Jedoch bin ich da ein wenig anders vorgegangen. Da ich schon meine eigenen Ideen von Anfang an einbringen wollte hab ich erst einmal mit einer Klasse gearbeitet in der ich die Bewegung eines Bildes mit Hilfe der Pfeiltasten programmiert habe. Hat alles super geklappt aber es war halt noch alles in der Klasse die das JPanel darstellte. Also hab ich eine Klasse Sprite erstellt und PlayerSprite die von Sprite erbt und hab die Berechnung der Bewegung in die PlayerSprite Klasse geschrieben. Seitdem laggt die Berechnung jedoch total. Alles läuft in einem Thread der die Berechnungen durchlaufen lässt. Im Fenster gebe ich verschiedene Daten wie delta, Winkel, Geschwindigkeit usw. Delta wird "normalschnell" im Fenster gezeichnet. bei den anderen Daten sieht man jedoch schon, dass das Zeichnen dieser Daten ruckelt (Was mich wundert da ja alles nacheinander gezeichnet wird). Der Unterschied liegt jedoch darin, dass die anderen Daten aus Objekten gelesen werden. Auch in der Berechnung übergebe ich nicht mit hilfe von Methodenparametern Werte sondern lasse die anderen auf die Daten zugreifen. Und da liegt auch glaub ich der Fehler. Eben dass irgendwelche Zugriffe zu lange dauern und dadurch die Berechnung langsam wird. Bin mir aber nicht sicher. Wäre also nett wenn ihr mal über meinen Code schaun würdet und ein paar Tipps geben könntet damit sich die Performance des Programms verbessert.

Win.java
Java:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.imageio.*;
import java.net.URL;
import java.io.IOException;

public class Win extends JPanel implements Runnable, KeyListener
{

  boolean up, down, left, right;
  long last, delta;
  BufferedImage[] img;
  JFrame f;
  PlayerSprite player;
  
  /*
   *
   *   Konstruktor
   *
   *****************************************************/
  Win()
  {
    f = new JFrame("Frame");
    f.setSize(800, 600);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.addKeyListener(this);
    f.add(this);

    
    // Init
    img = loadPics("pics/Ship1.gif", 3);
    last = System.nanoTime();
    player = new PlayerSprite(img, 200, 200, 100, this);
    Thread start_game = new Thread(this);
    f.setVisible(true);
    start_game.start();
  }

  /*
   *
   *   Load Pictures
   *
   *****************************************************/
  private BufferedImage[] loadPics(String path, int pics)
  {
    BufferedImage[] anim = new BufferedImage[pics];
    BufferedImage source = null;

    URL pic_url = getClass().getClassLoader().getResource(path);

    try
    {
      source = ImageIO.read(pic_url);
    }
    catch(IOException e)
    {

    }

    for(int i=0; i<pics; i++)
    {
      anim[i] = source.getSubimage(i*source.getWidth()/pics, 0,
              source.getWidth()/pics, source.getHeight());
    }

    return anim;
  }
  
  /*
   *
   *   Main
   *
   *****************************************************/
  public static void main(String args[])
  {
    new Win();
  }
  
  /*
   *
   *   Paint
   *
   *****************************************************/
  public void paint(Graphics g)
  {
    Graphics2D g2d = (Graphics2D)g;
    super.paint(g2d);

    g2d.drawString("Delta: "+delta, 50, 500);
    g2d.drawString("Winkel: "+player.theta, 50, 510);
    g2d.drawString("x: "+player.x+"   y: "+player.y, 50, 520);
    g2d.drawString("Speed: "+player.speed, 50, 530);
    g2d.drawString("Rotation Speed: "+player.theta_speed, 50, 540);
    
    player.drawObject(g2d);
  }
  
  /*
   *
   *   Do Logic
   *
   *****************************************************/
  public void doLogic()
  {
    delta = System.nanoTime()-last;
    last = System.nanoTime();

    player.doLogic(delta);
  }
   
  /*
   *
   *   Thread
   *
   *****************************************************/
  public void run()
  {
    while(true)
    {
      doLogic();
      repaint();
      try
      {
        Thread.sleep(16);
      }
      catch(Exception e)
      {

      }
    }
  }
  
  /*
   *
   *   KeyListener
   *
   *****************************************************/
  public void keyPressed(KeyEvent e)
  {
    if(e.getKeyCode()==KeyEvent.VK_UP)
    {
      up = true;
    }
    if(e.getKeyCode()==KeyEvent.VK_DOWN)
    {
      down = true;
    }
    if(e.getKeyCode()==KeyEvent.VK_LEFT)
    {
      left = true;
    }
    if(e.getKeyCode()==KeyEvent.VK_RIGHT)
    {
      right = true;
    }
  }
  public void keyReleased(KeyEvent e)
  {
    if(e.getKeyCode()==KeyEvent.VK_UP)
    {
      up = false;
    }
    if(e.getKeyCode()==KeyEvent.VK_DOWN)
    {
      down = false;
    }
    if(e.getKeyCode()==KeyEvent.VK_LEFT)
    {
      left = false;
    }
    if(e.getKeyCode()==KeyEvent.VK_RIGHT)
    {
      right = false;
    }
  }
  public void keyTyped(KeyEvent e)
  {

  }
}

Sprite.java
Java:
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;


public class Sprite extends Rectangle2D.Double
{
  long delay;
  long animation = 0;
  Win parent;
  BufferedImage[] pics;
  int currentpic = 0;
  double x, y;

  /*
   *
   *   Konstruktor
   *
   *****************************************************/
  public Sprite(BufferedImage[] i, double x, double y, long delay, Win p)
  {
    pics = i;
    this.x = x;
    this.y = y;
    this.delay = delay;
    this.width = pics[0].getWidth();
    this.height = pics[0].getHeight();
    parent = p;
  }


  /*
   *
   *   Draw Object
   *
   *****************************************************/
  public void drawObject(Graphics2D g)
  {

  }
   
  /*
   *
   *   Do Logic
   *
   *****************************************************/
  public void doLogic(long delta)
  {
    animation += (delta/1e6);
    if(animation > delay)
    {
      animation = 0;
      computeAnimation();
      move(delta);
    }
  }
  
  /*
   *
   *   Do Logic
   *
   *****************************************************/
   public void move(long delta)
   {

   }

  /*
   *
   *   Compute Animation
   *
   *****************************************************/
  private void computeAnimation()
  {
    if(currentpic < pics.length-1) currentpic++;
    else currentpic = 0;
  }

}

PlayerSprite.java
Java:
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;


public class PlayerSprite extends Sprite
{
  double theta;
  double speed=0, theta_speed=0;

  /*
   *
   *   Konstruktor
   *
   *****************************************************/
  public PlayerSprite(BufferedImage[] i, double x, double y, long delay, Win p)
  {
    super(i, x, y, delay, p);
  }
  
  /*
   *
   *   Draw Object
   *
   *****************************************************/
  public void drawObject(Graphics2D g)
  {
    g.rotate(Math.PI/180*theta,(int)x+width/2, (int)y+height/2);
    g.drawImage(pics[currentpic], (int)x, (int)y, parent);
  }
  
  /*
   *
   *   Move
   *
   *****************************************************/
  public void move(long delta)
  {
    if(parent.left && !parent.right)
    {
      if(theta_speed>-250) theta_speed -= 10;
      theta+=theta_speed*delta*1e-9;
      if(theta<=0) theta += 360;
      else if(theta>=360) theta -=360;
    }
    if(parent.right && !parent.left)
    {
      if(theta_speed<250) theta_speed += 10;
      theta+=theta_speed*delta*1e-9;
      if(theta<=0) theta += 360;
      else if(theta>=360) theta -=360;
    }
    if(!parent.left && !parent.right || parent.left && parent.right)
    {
      if(theta_speed>0) theta_speed -= 5;
      else if(theta_speed<0) theta_speed += 5;
      if(theta_speed!=0)
      {
        theta+=theta_speed*delta*1e-9;
        if(theta<=0) theta += 360;
        else if(theta>=360) theta -=360;
      }
    }
    if(parent.up && !parent.down)
    {
      if(speed<300)
      {
        speed += 5;
      }
      x = x+Math.sin(Math.abs(Math.toRadians(theta)))*speed*delta*1e-9;
      y = y-Math.cos(Math.abs(Math.toRadians(theta)))*speed*delta*1e-9;
    }
    if(parent.down && !parent.up)
    {
      if(speed>-300)
      {
        speed -= 5;
      }
      x = x+Math.sin(Math.abs(Math.toRadians(theta)))*speed*delta*1e-9;
      y = y-Math.cos(Math.abs(Math.toRadians(theta)))*speed*delta*1e-9;
    }
    if(!parent.up && !parent.down || parent.up && parent.down)
    {
      if(speed>0)
      {
        speed -= 2.5;
        x = x+Math.sin(Math.abs(Math.toRadians(theta)))*speed*delta*1e-9;
        y = y-Math.cos(Math.abs(Math.toRadians(theta)))*speed*delta*1e-9;
      }
      else if(speed<0)
      {
        speed += 2.5;
        x = x+Math.sin(Math.abs(Math.toRadians(theta)))*speed*delta*1e-9;
        y = y-Math.cos(Math.abs(Math.toRadians(theta)))*speed*delta*1e-9;
      }
    }
  }
}
 
V

vanny

Gast
Ich hab mir jetzt nicht den ganzen Code durchgelesen und auch nicht den Bezug zu Quaxlis Tutorial gesucht, dennoch emfinde ich
Java:
public class Win extends JPanel implements Runnable, KeyListener
schonmal als wiedersprüchlichen Ansatz.

Du erbst von JPanel (EDT ist hier wohl der richtige/zuständige Thread) und implementierst gleichzeitig das Runnable-Interface um die Gameloopberechnungen als extra Thread zu starten(als JPanel?:autsch:).
[EDIT]Ok hab mir nochmal Quaxlis Beispiel angeschaut und du hast es so übernommen, dennoch würde ich es bevorzugen, die Spiellogik und den Gameloop nicht im ZeichenPanel zu verwalten.[/EDIT]

Dazu überschreibst noch du die paint()-Methode und nicht die paintComponent(), was man aber bei SWING tun sollte.

Alles in allem genügt ein flüchtiger Blick, um Gründe für die nicht flüssige Animation zu finden.
Wenn´s nicht dabei war, sag bitte bescheid ^^

Gruß Vanny
 
Zuletzt bearbeitet von einem Moderator:

Epitaph

Mitglied
Danke für die Antwort ;)

Hab die paint() Methode zu paintComponent() geändert, aber daran lags schonma net.
Hab mich bisher noch net damit beschäftigt wo der Unterschied zwischen paint() und paintComponent() ist :/

Hm wie sollt ich das z.B. aufbauen?
Eine Klasse für Jframe, eine den JPanel, eine für den KeyListener und dann eine die die Gameloop enthält?
Wird dann schön mit den ganzen Parametern die ich dann übergeben muss^^
 
V

vanny

Gast
Also eine für den JFrame is schon mal pfui.
Java:
extends JFrame
ist fast nie nötig.
Du hast einen frame und der wird einmal instanziert und dann verwendet.

die Schlüsselwörter extends und implements deuten auf eine Spezialisierung/Erweiterung der(s) Ursprünglichen(Interfaces) hin um dann die spezialisierten Instanzen dieses neuen Objekttyps zu benutzen.
Ein JFrame ist so gut wie immer ein JFrame wozu also vererben.
Das erben von JPanel in deiner Win-Klasse ist ja ok, damit du die paintComponent() überschreiben und selbst zeichen kannst.
Das zeichnen sollte jedoch vom EDT vorgenommen werden (Per SwingWorker oder SwingUtilities) am besten aus mind. einem seperaten Thread heraus, welcher dann die Spiellogik berechnet.
Zum zeichnen auf deinem Win-Panel benötigst du eigentlich nur 1 Bild.

Gruß Vanny
 

Epitaph

Mitglied
Es ist ein einziges Bild mit 30x84 Pixel das in drei Teile geteilt und dann in nem BufferedImage Array gespeichert wird. Wenn das Java überansprucht dann würd ich keinem Java empfehlen wollen^^. Ne aber daran kanns nicht liegen, da, wie schon erwähnt, ja alles in einer Klasse perfekt geklappt hat... nur seitdem ichs zerpflückt habe läufts nimmer flüssig :(
 
V

vanny

Gast
Dann sei so nett, und verrate uns den doofen Fehler, damit die Leute, die per Sufu hier landen nicht nochmal diesen doofen Fehler mitschleppen.
 

Epitaph

Mitglied
Es würd glaub ich keinem was bringen aber hier der doofe Fehler:
Die Methode zur Berechnung der Bewegung wurde in einer if-Anweisung aufgerufen, die nur jede Sekunde auftritt. Also hatte es nichts mit dem Programmierstil oder ähnlichem zu tun... War einfach nurn blöder Fehler den ich zum Glück durch Zufall gefunden habe ;)

Kann man das Thema irgendwie zum Löschen flaggen oder so?
Ist ja eigentlich nur Müll in der Sammlung hier ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Animation läuft nicht korrekt AWT, Swing, JavaFX & SWT 8
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
H Simple Animation mit Swing AWT, Swing, JavaFX & SWT 2
DeBoiJoshua 2D-Grafik Gif Animation will nicht laden AWT, Swing, JavaFX & SWT 1
S JavaFX WebView zeigt keine Animation AWT, Swing, JavaFX & SWT 5
E showAndWait is not allowed during animation or layout processing Memory FX AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Ruckelfreie Animation AWT, Swing, JavaFX & SWT 20
L JavaFX Animation, erst zeichnen dann anzeigen AWT, Swing, JavaFX & SWT 4
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
J Java FX Koordinaten NACH Animation setzen, wie? AWT, Swing, JavaFX & SWT 9
Pr0m3theus Animation nach Event AWT, Swing, JavaFX & SWT 6
F JavaFX Timeline Animation soll X- und Y-Position während Animation ändern AWT, Swing, JavaFX & SWT 2
javampir 2D-Grafik Effizienz bei animation AWT, Swing, JavaFX & SWT 0
C Pixel-Rendering/Animation Performance in BufferedImage AWT, Swing, JavaFX & SWT 1
wolfgang63 JavaFX Animation, Kreise im vorgegebem Takt durchs Fenster laufen lassen AWT, Swing, JavaFX & SWT 3
P Ansatz für 2D Animation gesucht AWT, Swing, JavaFX & SWT 2
Thallius HHübsche Kopier Animation? AWT, Swing, JavaFX & SWT 5
L JPanel kleine "Animation" AWT, Swing, JavaFX & SWT 7
E Warum macht die einfache Animation einen kleinen Fehler? AWT, Swing, JavaFX & SWT 14
B 2D-Grafik Dynamisches Erstellen von Images und deren Animation AWT, Swing, JavaFX & SWT 4
R Swing Komponenten bleiben bei Animation unsichtbar AWT, Swing, JavaFX & SWT 7
J GIF Animation AWT, Swing, JavaFX & SWT 2
B Swing Thread+Animation AWT, Swing, JavaFX & SWT 7
R Swing Animation mit JLayeredPane? AWT, Swing, JavaFX & SWT 8
K 3D-Grafik Animation AWT, Swing, JavaFX & SWT 4
U Gif Animation mit JLabel AWT, Swing, JavaFX & SWT 3
P KeyListener + Animation AWT, Swing, JavaFX & SWT 2
D 2D-Grafik Animation flackert AWT, Swing, JavaFX & SWT 8
R Polygon-Animation mit Darstellungsfehlern AWT, Swing, JavaFX & SWT 5
StupidAttack Animation, JComponent AWT, Swing, JavaFX & SWT 3
S SWT Rudimentäre Bild Animation AWT, Swing, JavaFX & SWT 3
C Animation auf einem JPanel AWT, Swing, JavaFX & SWT 3
A paintComponent() - Animation AWT, Swing, JavaFX & SWT 2
S Ich brauche eine Idee: Animation mit teil eines Bildes AWT, Swing, JavaFX & SWT 16
H "Animation" AWT, Swing, JavaFX & SWT 2
S Animation korrekt darstellen AWT, Swing, JavaFX & SWT 8
Developer_X Nach Animation Button adden AWT, Swing, JavaFX & SWT 3
Developer_X Swing JPanel-THE ANIMATION AWT, Swing, JavaFX & SWT 3
T JFrame und Scale-Animation AWT, Swing, JavaFX & SWT 8
M Animation berechnen AWT, Swing, JavaFX & SWT 4
M Animation auf JPanel per Knopfdruck AWT, Swing, JavaFX & SWT 12
P Problem bei Animation AWT, Swing, JavaFX & SWT 2
K Animation auf GUI AWT, Swing, JavaFX & SWT 3
R ruckelfreie animation AWT, Swing, JavaFX & SWT 8
T Animation will nicht trotz Thread. AWT, Swing, JavaFX & SWT 14
S animation Flackern trotz doppelpufferung wieso? AWT, Swing, JavaFX & SWT 2
S Animation geht nicht AWT, Swing, JavaFX & SWT 3
m@nu Animation in GlassPane: Performanceeinbruch JFrame maximiert AWT, Swing, JavaFX & SWT 17
rudi.schraml Animation von Robotern auf FactoryFloor - repaint()? AWT, Swing, JavaFX & SWT 7
J Animation - Runnable AWT, Swing, JavaFX & SWT 3
O Animation in einem JPanel AWT, Swing, JavaFX & SWT 2
H Animation startet nicht/ Thread AWT, Swing, JavaFX & SWT 6
N Animation nach einem bestimmten Ereignis starten lassen? AWT, Swing, JavaFX & SWT 4
A Problem mit Animation AWT, Swing, JavaFX & SWT 4
M Animation mit Keylistener AWT, Swing, JavaFX & SWT 2
CodingBerlin JavaFX Programm läuft nur unter Eclipse AWT, Swing, JavaFX & SWT 1
N Programm Läuft nicht auf anderen Pcs AWT, Swing, JavaFX & SWT 9
MiMa Java und JavaFX 13 läuft endlich AWT, Swing, JavaFX & SWT 4
L JavaFX TreeView aufstellen läuft irgendwie auf Endlosschleife AWT, Swing, JavaFX & SWT 3
O LayoutManager pagelayout - Example läuft einfach nicht ! AWT, Swing, JavaFX & SWT 6
Blender3D Meine Swing Anwendung läuft unter Windows 10 und Ubuntu aber nicht auf Windows 7 AWT, Swing, JavaFX & SWT 16
R Swing Programm läuft nur beim Debuggen korrekt ab AWT, Swing, JavaFX & SWT 4
T swing läuft nur beding flüssig AWT, Swing, JavaFX & SWT 1
J JavaFX Anwendung läuft in eclipse, nicht aber exportiert AWT, Swing, JavaFX & SWT 2
N Programm läuft perfekt in Eclipse aber nicht in .JAR AWT, Swing, JavaFX & SWT 3
P Swing GUI noch nicht gezeichnet - Logik läuft - blockiert AWT, Swing, JavaFX & SWT 3
S Swing JProgressBar läuft nicht mit AWT, Swing, JavaFX & SWT 12
P Einfaches GUI läuft nicht AWT, Swing, JavaFX & SWT 6
A AWT Beim (mehrmaligen) Screenshot machen läuft der Speicher voll AWT, Swing, JavaFX & SWT 2
R GUI hängt während Programm läuft AWT, Swing, JavaFX & SWT 7
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
G SWT-App läuft nicht unter OSX, unter Win aber problemlos AWT, Swing, JavaFX & SWT 3
G Programm läuft nur auf manchen Rechnern AWT, Swing, JavaFX & SWT 10
O Swing es können keine neuen Labels hinzufügt werden während der Timer läuft AWT, Swing, JavaFX & SWT 14
S Swing Hyperlink mit Hyperlinklistener läuft Amok AWT, Swing, JavaFX & SWT 3
P Swing [gelöst/erledigt] Gleicher Code läuft unterschiedlich unter Linux und Windows AWT, Swing, JavaFX & SWT 5
M Button funktioniert nicht mehr wenn Schleife läuft AWT, Swing, JavaFX & SWT 3
K Mein Informatikprojekt läuft aus dem Ruder Hilfe. F1 ^^ AWT, Swing, JavaFX & SWT 5
D Programm läuft unter XP aber nicht unter Knoppix AWT, Swing, JavaFX & SWT 6
A GtkLookAndFeel - läuft nicht . AWT, Swing, JavaFX & SWT 13
G Wie läuft ein GUI AWT, Swing, JavaFX & SWT 4
P WM 2006 - The Memory Game :P läuft nicht. AWT, Swing, JavaFX & SWT 15
M sicherstellen, dass nur eine Instanz läuft. AWT, Swing, JavaFX & SWT 6
S JCellRenderer läuft nur einmal in bestimmte Bedingung AWT, Swing, JavaFX & SWT 5
richis-fragen Spaltenbreite bei drag nicht änderbar AWT, Swing, JavaFX & SWT 4
Juelin if Abfrage funktioniert nicht richtig AWT, Swing, JavaFX & SWT 10
MiMa Darstellung von FXML ateien nicht korrekt (SceneBuilder) AWT, Swing, JavaFX & SWT 2
P Methode wird nicht überprüft AWT, Swing, JavaFX & SWT 4
C Button ActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
H JavaFX PixelWriter.setColor setzt Farbe nicht AWT, Swing, JavaFX & SWT 2
M JavaFX Diagonale Linie nicht ausgegeben/angezeigt AWT, Swing, JavaFX & SWT 1
M JavaFX Mandelbrot-bild noch nicht optimiert AWT, Swing, JavaFX & SWT 7
Hatsi09 Javafx MediaPlayer spielt nicht immer AWT, Swing, JavaFX & SWT 3
P thread nimmt veränderte boolean nicht AWT, Swing, JavaFX & SWT 7
P AWT Programm funktioniert nicht richtig AWT, Swing, JavaFX & SWT 35
P JTextField wird nur sehr klein angezeigt und verändert die Größe nicht AWT, Swing, JavaFX & SWT 3
Telisti Javafx Image wird nicht richtig integiert AWT, Swing, JavaFX & SWT 8
J Netbeans die JavaFX-Anwendung wird nicht ausgeführt AWT, Swing, JavaFX & SWT 16
thor_norsk Icons laden nicht in GUI AWT, Swing, JavaFX & SWT 15

Ähnliche Java Themen

Neue Themen


Oben