# Problem: Mein Spiel lastet den PC voll aus



## Izibaar (20. Mai 2005)

und das hat zur Folge das man währenddessen keine Musik hören oder irgendetwas anderes machen kann. Hier mal mein Code:

```
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.StringTokenizer;
import javax.swing.*;
import java.lang.Math;
import java.io.*;


public class Start extends JFrame {
  // Anfang Variablen
  private static Image dbImage;
  private Graphics dbGraphics;
  private Grafik grafiken = new Grafik();

  private static boolean spielEnde = false;
  private int ende;
  
  private long letzteZeit, letzteAktion1;
  private double deltaT;

    //Hier werden alle Schüsse abgelegt
  private ArrayList entities = new ArrayList();
    //Hier werden alle Gegner abgelegt
  private ArrayList arrayGegner = new ArrayList();

  private Raumschiff spieler1 = new Raumschiff("Raumschiff.gif");
  private boolean aktion1 = false;
  private double strecke = 0;

  // Ende Variablen


  public Start() {
    super("Der RzClon");
    int frameWidth = 10;
    int frameHeight = 10;
  
    // Einstellungen aus Datei lesen
    try {
      BufferedReader in = new BufferedReader(new FileReader("Einstellungen.txt"));
      StringTokenizer tokenizer;
      String zeile, daten[] = new String[2];
    
      for(int k=0; k<2; k++) {
        zeile=in.readLine();
        tokenizer = new StringTokenizer(zeile);
        for(int i=0; i<2; i++) {
          daten[i] = tokenizer.nextToken();
        }

        switch(k) {
          case 0: frameWidth = Integer.parseInt(daten[1]); break;
          case 1: frameHeight = Integer.parseInt(daten[1]); break;
        }
      }
    }
    catch(FileNotFoundException exc) {
      //Fehlermeldung
    }
    catch(IOException exc) {
      //Fehlermeldung
    }
    
    // Frame-Initialisierung
    addWindowListener(new WindowAdapter() {
      public void windowClosing(final WindowEvent evt)
      { System.exit(0); }
    });

    this.setUndecorated(true); //Ränder entfernen

    GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); //Default-GraphicsDevice
    gd.setFullScreenWindow(this); //Vollbild
    DisplayMode dm_old = gd.getDisplayMode(); //Bildwiederholungsrate und Farbtiefe herausfinden
    DisplayMode dm_new = new DisplayMode (frameWidth, frameHeight, dm_old.getBitDepth(), dm_old.getRefreshRate()); //width, height, bitdepth, refreshrate
    gd.setDisplayMode(dm_new);

    // Anfang Komponenten
    addKeyListener(new KeyInputHandler());
    // Ende Komponenten

    //Mauszeiger ausblenden
    this.setCursor(Toolkit.getDefaultToolkit().createCustomCursor(Toolkit.getDefaultToolkit().getImage(""), new Point(0,0), "invisible"));
    

    setVisible(true);
    this.spielSchleife();
  }

  // Anfang Ereignisprozeduren
  private class KeyInputHandler extends KeyAdapter {
    public void keyPressed(KeyEvent e) {
      switch(e.getKeyCode()) {
        case KeyEvent.VK_LEFT:  spieler1.setLinks(true);  break;
        case KeyEvent.VK_RIGHT: spieler1.setRechts(true); break;
        case KeyEvent.VK_UP:    spieler1.setVor(true);    break;
        case KeyEvent.VK_DOWN:  spieler1.setZuruck(true); break;
        case KeyEvent.VK_SPACE: aktion1 = true;           break;
        default: break;
      }
    }

    public void keyReleased(KeyEvent e) {
      switch(e.getKeyCode()) {
        case KeyEvent.VK_LEFT:  spieler1.setLinks(false);  break;
        case KeyEvent.VK_RIGHT: spieler1.setRechts(false); break;
        case KeyEvent.VK_UP:    spieler1.setVor(false);    break;
        case KeyEvent.VK_DOWN:  spieler1.setZuruck(false); break;
        case KeyEvent.VK_SPACE: aktion1 = false;           break;
        default: break;
      }
    }
  }
  // Ende Ereignisprozeduren

  public void spielSchleife()
  {
    letzteAktion1 = 0;

    //Sounds laden
    StrippedSound schussSound = new StrippedSound(new File("Sounds/schuss1.wav")),
                  explosionSound = new StrippedSound(new File("Sounds/explosion1.wav")),
                  trefferSound = new StrippedSound(new File("Sounds/treffer1.wav"));

    schussSound.play();      schussSound.stop();
    explosionSound.play();   explosionSound.stop();
    trefferSound.play();     trefferSound.stop();
    
    grafiken.getSprite("Grafiken/Leiste_Energie.gif");
    grafiken.getSprite("Grafiken/Leiste.jpg");
    grafiken.getSprite("Grafiken/Gegner1.gif");
    grafiken.getSprite("Grafiken/Boden.jpg");
    grafiken.getSprite("Grafiken/Raumschiff.gif");
    grafiken.getSprite("Grafiken/Schuss1.gif");
    //grafiken.getSprite("Grafiken/Explosion.gif");
    
    repaint();
    while(!aktion1) {
      //Warten auf Leertaste
    }
    aktion1 = false;
    
    letzteZeit = System.currentTimeMillis();
    
    while(!spielEnde) {
      //Zeit stoppen
      deltaT = System.currentTimeMillis() - letzteZeit;
      letzteZeit = System.currentTimeMillis();

      strecke += deltaT/5;  //*2/10 = /5   -> Sollen 200m/s bzw 720Km/h entsprechen
      
      //Neue Gegner       /Immer 2 ??
      if(letzteZeit%2500 < 19) {
        Gegner gegner = new Gegner("Gegner1.gif", (int)(50+((letzteZeit%19)*50)));
        arrayGegner.add(gegner);
      }

      double zwischen1[] = new double[2],
             zwischen2[] = new double[2],
             abstand;

      //Raumschiffe bewegen
      spieler1.bewegen(deltaT);
      zwischen1 = spieler1.getPos();
      
      //Gegner bewegen (zwischen1 = spieler1)
      if(arrayGegner.size() >= 0)
        for (int i=0; i<arrayGegner.size(); i++) {
          Gegner gegner = (Gegner)arrayGegner.get(i);
          if(gegner.bewegen(deltaT)) arrayGegner.remove(i);
          
          zwischen2 = gegner.getPos();

          abstand = Math.pow( Math.pow(zwischen2[1]-zwischen1[1], 2) + Math.pow(zwischen2[0]-zwischen1[0], 2), 0.5);
          if(abstand < 35) {
            trefferSound.play();
            arrayGegner.remove(i);
            if(spieler1.treffer())
              spielEnde = true;
          }
        }

      //Schüsse erstellen (zwischen1 = spieler1)
      if(aktion1) {
        if(System.currentTimeMillis() - letzteAktion1 > 500) {
          Kugel schuss = new Kugel(zwischen1[0]-5, zwischen1[1], "Schuss1.gif");
          entities.add(schuss);
          letzteAktion1 = System.currentTimeMillis();
          
          schussSound.play();
        }
      }
      //Schüsse bewegen
      if(entities.size() >= 0)
        for (int i=0; i<entities.size(); i++) {
          Kugel schuss = (Kugel)entities.get(i);
          if(schuss.bewegen(deltaT)) entities.remove(i);
          
          zwischen1 = schuss.getPos();

          //Abfrage Gegner getroffen
          if(arrayGegner.size() >= 0)
          for (int k=0; k<arrayGegner.size(); k++) {
            Gegner gegner = (Gegner)arrayGegner.get(k);
            
            zwischen2 = gegner.getPos();

            abstand = Math.pow( Math.pow(zwischen2[1]-zwischen1[1], 2) + Math.pow(zwischen2[0]-zwischen1[0], 2), 0.5);
            if(abstand < 20) {
              explosionSound.play();
              arrayGegner.remove(k);
              entities.remove(i);
              spieler1.setPunkte();
            }
          }//Abfrage Gegner getroffen
        }

      //Neues Bild zeichnen
      repaint();

      //Nur wenn 1 Millisekunde vergangen ist weiter machen
      while(System.currentTimeMillis()-(letzteZeit) < 1) {
        //warten
      }
    }
    
    //Ende
    for(ende=0; ende<150; ende+=30) {

      repaint();
      
      while(System.currentTimeMillis()-(letzteZeit) < 150) {
        //150 Millisekunden warten
      }
      letzteZeit = System.currentTimeMillis();
    }
    repaint();
    while(System.currentTimeMillis()-(letzteZeit) < 2000) {
      //2 Sekunden warten
    }

    System.exit(0);
  }

  //-----Bild überzeichnen-----
  public void update(Graphics g)
  {
    //Double-Buffer initialisieren
    if (dbImage == null) {
      dbImage = createImage(this.getSize().width, this.getSize().height);
      dbGraphics = dbImage.getGraphics();
    }

    //Hintergrund löschen
    dbGraphics.setColor(getBackground());
    dbGraphics.fillRect( 0, 0, this.getSize().width, this.getSize().height);

    //Vordergrund zeichnen
    dbGraphics.setColor(getForeground());
    paint(dbGraphics);

    //Offscreen anzeigen
    g.drawImage(dbImage,0,0,this);
  }


//-----Bild erstellen zum überzeichnen-----
  public void paint(Graphics g)
  {
   //** Hier werden alle noch mehr Bilder gezeichnet **
    g.drawImage(grafiken.getSprite("Grafiken/Boden.jpg"), 0, -300+(int)(b), this);
   
  }
  
  public static void main(String[] args) {
    Start fenster = new Start();
  }
}
```

Habe die paint Methode gekürzt und mal nur ein Beispiel drinne gelassen wie ich alle Bilder zeichne.
Bin leider Anfänger auf dem Gebiet der Spieleprogrammierung. Kann mir jemand sagen warum der PC (nicht nur meiner) vollkommen ausgelastet wird?


----------



## Wildcard (20. Mai 2005)

1. In Swing überschreibt man die update methode nicht (JFrame ist sowieso doppelt gepuffert)
2. In Swing überschreibt man nicht paint(), sonder paintComponent()
3. Mach das weg und ersetze es durch Thread.sleep();

```
for(ende=0; ende<150; ende+=30) { 

      repaint(); 
      
      while(System.currentTimeMillis()-(letzteZeit) < 150) { 
        //150 Millisekunden warten 
      } 
      letzteZeit = System.currentTimeMillis(); 
    } 
    repaint(); 
    while(System.currentTimeMillis()-(letzteZeit) < 2000) { 
      //2 Sekunden warten 
    }
```


----------



## Illuvatar (20. Mai 2005)

2. In JFrames überschreibt man paint und nicht paintComponent


----------



## Wildcard (20. Mai 2005)

Illuvatar hat gesagt.:
			
		

> 2. In JFrames überschreibt man paint und nicht paintComponent


ups, hast recht! Izzibar zeichnet ja direkt auf dem Frame...


----------



## Reality (20. Mai 2005)

4. Man sollte BufferStrategy verwenden was perfomanter ist und das Tearing vermeidet.


----------



## Guest (20. Mai 2005)

zu 1./4. Wenn ich die update Methide nicht überschreibe dann flimmert es. Außer ich verwende BufferStrategy. Nur dann ruckelt es und es dauert teilweise etwas bis die Tastatur reagiert. Desweiteren funktioniert die Kollisionsabfrage nicht mehr zu 100%.

Danke für die Tipps, aber entweder hab ich schon zuviel Müll geschrieben oder ich verstehe die Verwendung nicht richtig. Jedenfalls wird das bei mir nur langsamer.


----------



## Izibaar (20. Mai 2005)

Der Gast da oben war natürlich ich.
Und dann noch was: Seit heute läuft es besser. Scheinbar habe ich irgendwas gemacht damit es funktioniert. Bin mir zwar nicht bewusst, dass ich etwas gemacht habe das es besser laufen sollte... aber immerhin.
Könnte aber auch seien das es nur heute ist  :roll: also für Tipps bin ich immer dankbar.


----------



## Wildcard (22. Mai 2005)

Anonymous hat gesagt.:
			
		

> zu 1./4. Wenn ich die update Methide nicht überschreibe dann flimmert es.


Nicht wenn du es richtig gemacht hast  :wink:


----------

