Swing 2 Thread.sleep parallel laufen lassen

Takar110

Mitglied
Hi Leute,

ich habe leider ein Problem bei dem Spiel "Space Invaders".
Ich habe das Spiel eigentlich fertig, nur ist bei mir alles gleich "schnell" dadurch das ich einen Thread.sleep verwende. Ich möchte aber das sich mein Schiff schneller bewegen lässt, da ich sonst nicht hinterher komme die entgegenkommenden Invaders zu töten.
Meine Frage: Wie verwende ich parallel zwei Thread.sleeps? Ein Thread für die Invader und ein Thread für mein Schiff.

Java:
package spaceInvaders;

import java.io.IOException;
import javax.swing.JOptionPane;

public class SpaceSpiel /* implements KeyListener */ {

  boolean spielfeldErstellt = false;
  static boolean schuss = false;
  static int rightLeft = 0;
  static int punkteZaehler = 0;
  static int durchlaufGeschwindigkeit = 400;
  int y = 25;
  int x = 25;
  int ausgangspunktX = 15;
  int ausgangspunktY = 24;
  int position = 0;
  int alteposition = 0;
  String[][] spaceShuttle;

  public String[][] spaceShuttle() throws NumberFormatException, IOException,
    InterruptedException {

    if (!spielfeldErstellt) {
      spaceShuttle = new String[y][x];
      for (int b = 0; b < x; b++) {
        for (int h = 0; h < y; h++) {
          spaceShuttle[h][b] = " ";
        }
      }
      spielfeldErstellt = true;
    }

    for (int b = 0; b < x; b++) {
      for (int h = 0; h < y; h++) {
        if (spaceShuttle[b][h].equals("∇")) {
          if (h >= x - 2 || spaceShuttle[b][h + 1].equals("▲")) {
            JOptionPane.showMessageDialog(null, "Game Over!\nDeine Punktzahl: " + punkteZaehler);
            System.exit(0);
          }
          if (!spaceShuttle[b][h + 1].equals("*")) {
            spaceShuttle[b][h] = " ";
            h++;
            spaceShuttle[b][h] = "∇";
          }

          if (spaceShuttle[b][h + 1].equals("*") || spaceShuttle[b][h].equals("*")) {
            spaceShuttle[b][h] = " ";
            spaceShuttle[b][h + 1] = " ";
            punkteZaehler += 10;
          }
        }
      }
    }

    // Bewegung Schiff
    alteposition = position;
    position += rightLeft;
    if ((x / 2) + position >= x) {
      position = -12;
    }
    if ((x / 2) + position < 0) {
      position = 11;
    }
    int invaders = 1;
    int xKoordinateInvaders = 0;

    spaceShuttle[(x / 2) + position][ausgangspunktY] = "▲";
    if (alteposition != position) {
      spaceShuttle[(x / 2) + alteposition][ausgangspunktY] = " ";
    }

    // Schießen
    if (schuss == true) {
      spaceShuttle[(x / 2) + position][ausgangspunktY - 1] = "*";
    }

    // Geschoss
    for (int h = 0; h < y; h++) {
      for (int b = 0; b < x; b++) {
        if (h == 0) {
          spaceShuttle[b][h] = " ";
        }
        if (spaceShuttle[b][h].equals("*") && !spaceShuttle[b][h - 1].equals("∇") && h != 0) {
          spaceShuttle[b][h - 1] = "*";
          spaceShuttle[b][h] = " ";
        }
      }
    }

    // invaders koordinaten bestimmen
    for (int i = 0; i <= invaders; i++) {
      xKoordinateInvaders = (int) (Math.random() * x - 1);
    }

    // invaders spawnen
    for (int i = 0; i <= invaders; i++) {
      spaceShuttle[xKoordinateInvaders][0] = "∇";
    }

    // Schwierigkeitsgrad
    if (punkteZaehler >= 150) {
      invaders += 2;
    }
    if (punkteZaehler >= 300) {
      invaders += 2;
    }
    if (punkteZaehler >= 550) {
      durchlaufGeschwindigkeit = 300;
    }
    return spaceShuttle;
  }
}

Java:
package spaceInvaders;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;

public class Logic implements Runnable {

  String[][] logicSpielfeld = null;
  SpaceSpiel game = new SpaceSpiel();

  private BufferedImage img = new BufferedImage(400, 400, BufferedImage.TYPE_INT_ARGB);

  @Override
  public void run() {

    while (true) {
      try {
        logicSpielfeld = game.spaceShuttle();
      } catch (NumberFormatException | IOException | InterruptedException e2) {
        e2.printStackTrace();
      }
      Graphics g = img.getGraphics();
      g.setColor(Color.blue);
      g.fillRect(0, 0, 400, 400);
      try {
        for (int b = 0; b < game.x; b++) {
          for (int h = 0; h < game.y; h++) {
            if (logicSpielfeld[b][h].equals("∇")) {
              g.setColor(Color.green);
              g.drawOval(b * 16, h * 16, 11, 11);
            }
            if (logicSpielfeld[b][h].equals("▲")) {
              g.setColor(Color.black);
              g.fillOval(b * 16, h * 16, 15, 15);
            }
            if (logicSpielfeld[b][h].equals("*")) {
              g.setColor(Color.red);
              g.fillOval(b * 16, h * 17, 4, 4);
            }
            String punkteAusgabe = "Punkte: " + SpaceSpiel.punkteZaehler;
            g.setColor(Color.white);
            g.drawString(punkteAusgabe, 10, 390);
          }
        }

      } catch (NumberFormatException e1) {
        e1.printStackTrace();
      }
      View.getInstance().setImg(img);

      try {
        Thread.sleep(SpaceSpiel.durchlaufGeschwindigkeit);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

Java:
package spaceInvaders;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class View extends JFrame {

  private static final long serialVersionUID = 1L;

  public static View instance = null;
  private JPanel gamePanel = new JPanel();
  private BufferedImage img;

  public BufferedImage getImg() {
    return img;
  }

  public void setImg(BufferedImage img) {
    this.img = img;
    repaint();
  }

  public static View getInstance() {
    if (instance == null)
      instance = new View();
    return instance;
  }

  private View() {
    super("Space Invaders");

    instance = this;
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setContentPane(gamePanel);
    setSize(428, 469);
    setLocation(400, 300);
    setVisible(true);

    addKeyListener(new KeyListener() {
      @Override

      public void keyTyped(KeyEvent e) {
      }

      public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        if (key == KeyEvent.VK_LEFT) {
          SpaceSpiel.rightLeft = -1;
        }
        if (key == KeyEvent.VK_RIGHT) {
          SpaceSpiel.rightLeft = 1;
        }
        if (key == KeyEvent.VK_UP) {
          SpaceSpiel.schuss = true;
        }
      }

      public void keyReleased(KeyEvent e) {
        int key = e.getKeyCode();
        if (key == KeyEvent.VK_LEFT) {
          SpaceSpiel.rightLeft = 0;
        }
        if (key == KeyEvent.VK_RIGHT) {
          SpaceSpiel.rightLeft = 0;
        }
        if (key == KeyEvent.VK_UP) {
          SpaceSpiel.schuss = false;
        }
      }
    });

    Thread t = new Thread(new Logic());
    t.start();
  }

  public void paint(Graphics g) {
    g.drawImage(img, 5, 22, 417, 441, new ImageObserver() {

      @Override
      public boolean imageUpdate(Image arg0, int arg1, int arg2,
        int arg3, int arg4, int arg5) {
        return true;
      }
    });

  }

  public static void main(String[] args) {
    View.getInstance();
  }
}
 

Joose

Top Contributor
Das Problem ist du dein 2d Array 1:1 als Spielfeld anzeigst.
Dadurch kannst du deine Objekte alle immer nur um x Felder in eine Richtung bewegen.

Richtiger wäre es den Spieler um a Pixel zu bewegen und die Gegner um b Pixel.
Dadurch ergeben sich dann gefühlt unterschiedliche Geschwindigkeiten.
Mit deiner aktuellen Version wäre es unter anderem nicht möglich zwischen zwei (benachbarten) Gegner durchzuschießen.

Mögliche Lösung:
Sprich anstatt deine Objekte (Gegner, Spieler und Geschoss) in einem 2d Array zu verwalten solltest du eine einfache Liste verwenden.
Für die Objekte am Spielfeld werden Klassen erstellt und diese haben jeweils eine x und y Position. Dadurch kannst du sie an der richtigen Position zeichnen und unterschiedlich verschieben.
 

Takar110

Mitglied
Mh.. sowas in der Art hatte ich mir schon gedacht :/
Dann werde ich mich mal an die arbeit machen und meinen Code komplett überarbeiten!

Danke für die schnelle Antwort! :)
 

Joose

Top Contributor
Dein Code scheint ja zu funktionieren, das ist schon mal super! (Daher auf jedenfall mal sichern)
Aber wie du eben siehst sind deiner Implementierung Grenzen gesetzt, das kommt immer wieder vor.
Das ist nur eine Übungs- und Erfahrungssache, sowas schon im vorhinein zu bedenken :)

Viel Glück und Spaß bei der Überarbeitung :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Problem Thread.sleep() und JProgressBar AWT, Swing, JavaFX & SWT 7
A Thread und sleep(1000); AWT, Swing, JavaFX & SWT 7
S Timer oder Thread.sleep AWT, Swing, JavaFX & SWT 3
K Thread.sleep in GUI AWT, Swing, JavaFX & SWT 4
S Thread.sleep() in einer methode fürs zeichen AWT, Swing, JavaFX & SWT 3
X Problem bei JTextArea und Thread.sleep() AWT, Swing, JavaFX & SWT 8
B Swing Swing und Thread.sleep() AWT, Swing, JavaFX & SWT 6
T thread.sleep Sprung Problem AWT, Swing, JavaFX & SWT 24
A Sleep Funktion / Thread-Problem ! AWT, Swing, JavaFX & SWT 11
S Problem mit 2 Thread.sleep AWT, Swing, JavaFX & SWT 3
M JTextArea in JScrollPane, Problem mit Thread.sleep() AWT, Swing, JavaFX & SWT 5
S Thread.sleep() beim Zeichnen auf Swing Komponenten? AWT, Swing, JavaFX & SWT 6
Y GBO friet bei Thread.sleep ein AWT, Swing, JavaFX & SWT 3
P thread nimmt veränderte boolean nicht AWT, Swing, JavaFX & SWT 7
N JFrame loescht alles, sobald der Thread zuende ist AWT, Swing, JavaFX & SWT 22
M Server/Client thread von GUI Trennen AWT, Swing, JavaFX & SWT 2
K JavaFx, Sound Aufnahme und Thread AWT, Swing, JavaFX & SWT 0
T Exception in thread "main" java.lang.NoClassDefFoundError AWT, Swing, JavaFX & SWT 4
G Exception javafx Thread -> caused by removing children while in EventHandler AWT, Swing, JavaFX & SWT 28
H Event Handling Thread - Abruf der get-Methode AWT, Swing, JavaFX & SWT 5
J "Exception in thread "AWT-EventQueue-0"" Fehler AWT, Swing, JavaFX & SWT 3
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
C Thread verwalten AWT, Swing, JavaFX & SWT 2
A Swing Exception in thread "AWT-EventQueue-0" AWT, Swing, JavaFX & SWT 1
S JavaFX Exception in thread "JavaFX Application Thread" AWT, Swing, JavaFX & SWT 3
L Label im JavaFX Thread Updaten AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Alert Confirmation Dialog aus einem Service Thread AWT, Swing, JavaFX & SWT 8
ralfb1105 JavaFX MVC: Thread in Model Class mit Ausgabe in TextArea AWT, Swing, JavaFX & SWT 10
D Swing SwingUtils / Thread Problem AWT, Swing, JavaFX & SWT 3
J Thread per Button starten AWT, Swing, JavaFX & SWT 10
J Thread kennt JButton nicht. AWT, Swing, JavaFX & SWT 11
T JavaFX Task / Thread / FXThread Komplikationen AWT, Swing, JavaFX & SWT 5
O Swing Event Dispatch Thread AWT, Swing, JavaFX & SWT 1
L JavaFX UI Thread block AWT, Swing, JavaFX & SWT 13
X Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 AWT, Swing, JavaFX & SWT 6
sandaime Swing Thread für CMD auslesen AWT, Swing, JavaFX & SWT 16
E JavaFX JavaFX Application in Thread ausführen AWT, Swing, JavaFX & SWT 1
D JavaFX UI-Thread und DB-Thread trennen um z.B. Ladebalken anzuzeigen AWT, Swing, JavaFX & SWT 15
T JavaFX Controller im extra Thread AWT, Swing, JavaFX & SWT 0
L Zweites Fenster mit Thread AWT, Swing, JavaFX & SWT 0
E JavaFX Stage.show() in ursprünglichem Thread starten AWT, Swing, JavaFX & SWT 7
L Swing Frame in Thread wird nicht gezeichnet AWT, Swing, JavaFX & SWT 2
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
C Thread-/ Simulations- Problem AWT, Swing, JavaFX & SWT 18
T Swing Button bleibt grau [=> UI hat sich aufgehängt, Aufgabe in Thread auslagern] AWT, Swing, JavaFX & SWT 3
M Thread-Frage in SWT AWT, Swing, JavaFX & SWT 1
Q GUI außerhalb GUI-Thread updaten - GUI friert ein AWT, Swing, JavaFX & SWT 18
C Thread in Klassen starten AWT, Swing, JavaFX & SWT 4
L exception in thread awt-eventqueue-0 java.lang.nullpointerexception AWT, Swing, JavaFX & SWT 2
S Swing Exception in thread "AWT-EventQueue-0" bei Jlabel AWT, Swing, JavaFX & SWT 4
D SWT SWT Elemente aus anderen Klassen aufrufen - Invalid thread access AWT, Swing, JavaFX & SWT 6
K JavaFX Tableview mit fxml ohne Aktualiserung trotz Thread AWT, Swing, JavaFX & SWT 13
K Event Handling 2 Buttons und Thread stop AWT, Swing, JavaFX & SWT 3
C Swing Update von swing-TableModels per Thread. Eins geht, das andere nicht, warum? AWT, Swing, JavaFX & SWT 12
V JLabel bzw. GUI aus externen Thread ansteuern AWT, Swing, JavaFX & SWT 3
J Applet Paralleles Thread Handling AWT, Swing, JavaFX & SWT 3
H Swing JfreeChart aktualisieren - mit daten aus thread AWT, Swing, JavaFX & SWT 3
T Java Swing Main GUI Thread AWT, Swing, JavaFX & SWT 3
C Event Handling Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException AWT, Swing, JavaFX & SWT 43
T Table-Zeilen mit Thread einfärben AWT, Swing, JavaFX & SWT 15
F Swing GUI-Thread für automatisches Update nutzen AWT, Swing, JavaFX & SWT 10
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
V Nullpointerexception (etwas mit thread und jframe) AWT, Swing, JavaFX & SWT 3
S SWT GUI-Thread AWT, Swing, JavaFX & SWT 11
B Swing Thread+Animation AWT, Swing, JavaFX & SWT 7
M Exception in thread "Thread-3" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 18
B Über SWT Button Thread beenden AWT, Swing, JavaFX & SWT 2
C SWT Gui Thread hängt sich auf AWT, Swing, JavaFX & SWT 3
lumo SWT Exception in thread "main" org.eclipse.swt.SWTError: No more handles AWT, Swing, JavaFX & SWT 3
Luk10 Swing Problem mit Zeichen-Thread AWT, Swing, JavaFX & SWT 8
G 2D-Grafik Von Thread aus Zeichnen AWT, Swing, JavaFX & SWT 5
U Swing JLabel bewegen mittels Thread AWT, Swing, JavaFX & SWT 3
M JProgressBar für einen Thread AWT, Swing, JavaFX & SWT 14
R JTable und Thread AWT, Swing, JavaFX & SWT 4
J Thread funktioniert nicht AWT, Swing, JavaFX & SWT 10
D JPanel mit Thread in JPanel AWT, Swing, JavaFX & SWT 4
F Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: null AWT, Swing, JavaFX & SWT 5
P Teil einer Swing GUI in eigenem Thread AWT, Swing, JavaFX & SWT 4
O JTree/TreeModel/DefaultMutableTreeNodes thread safe machen AWT, Swing, JavaFX & SWT 3
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
F SWT table refresh per Thread AWT, Swing, JavaFX & SWT 2
V Swing remove(Component) blockiert Thread sehr lange. AWT, Swing, JavaFX & SWT 6
J AWT Artefakte bei AWT-Rendering durch parallelen Thread AWT, Swing, JavaFX & SWT 4
H Thread-Problem mit der Darstellung beim Sperren des Fensters AWT, Swing, JavaFX & SWT 2
T Event Dispatch Thread und noch ein Thread AWT, Swing, JavaFX & SWT 7
Burny91 Swing Thread mit wait() und notify() steuern AWT, Swing, JavaFX & SWT 22
N SWT - über Thread Composite erstellen und Anhängen AWT, Swing, JavaFX & SWT 6
K Vom Gui aus auf einen Thread warten AWT, Swing, JavaFX & SWT 4
F Merkwürdiges Verhalten zeichnen sperater Thread AWT, Swing, JavaFX & SWT 13
N Exception Behandlung mit setDefaultUncaughtExceptionHandler, insbesondere im EventDispatcher Thread AWT, Swing, JavaFX & SWT 4
Q Neuer Thread zum Öffnen AWT, Swing, JavaFX & SWT 2
P Swing GUI im Thread? AWT, Swing, JavaFX & SWT 5
T GUI JFrame - neuer Thread AWT, Swing, JavaFX & SWT 2
data89 Was mache ich mit "Dispatched Event Thread"/Substance falsch? AWT, Swing, JavaFX & SWT 4
0x7F800000 Allg. Frage zum ev. dispatch thread, wie korrekt auf reaktion der Listener warten? AWT, Swing, JavaFX & SWT 4
S Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 7
N Server mit Thread und Statusbox AWT, Swing, JavaFX & SWT 3
S Objektverhalten in einen Thread legen AWT, Swing, JavaFX & SWT 4
G JProgressBar actionPerformedMethode und SwingUI thread AWT, Swing, JavaFX & SWT 36

Ähnliche Java Themen

Neue Themen


Oben