Spielmenü

Underpay0299

Mitglied
Hallo, ich habe ein kleines java spiel programmiert und will dazu jetzt ein Menü machen. Wenn ich aber das Spiel mit: Haupt Haupt = new Haupt(); Haupt.GUI(); aufrufe funzt das Spiel nicht mehr.

Ich würde mich über baltige antwort freuen
PaZi
 

dayaftereh

Top Contributor
Hey, du hast uns leider einwenig / kaum Informationen über deine Implementierung von deine Klasse Haupt () und deinem Spiel da gelassen. Vielleicht könntest du einwenig Code posten. Würde uns allen Helfen ;)

Zum Beispiel ist deine Klasse Haupt ein Dialog, Panel oder Frame. Was macht die Methode Haupt.GUI()?

Ich schätze das du deine GUI blockiert und so das Spiel nicht weiterlaufen kann...
 

Underpay0299

Mitglied
Oh sorry hier:

Java:
package Game;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferStrategy;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Haupt{
  

   int player_x = Variablen.player_x;
   int player_y = Variablen.player_y;
  
  
   public static void main(String[] args){
    
     Haupt h = new Haupt();
     h.GUI();
   }
  
  
   public void GUI(){
    
     Punkte Punkte = new Punkte();
     Berechnen Berechnen = new Berechnen();
    
     Punkte.read();
    
     Frame frame = new Frame();
     frame.makestrat();
     
     while(true)
     {
      
      
       frame.repaint();
      
       Berechnen.player();
       Berechnen.holes();
       Berechnen.game();
    
      
       try {
         Thread.sleep(10);
       } catch (InterruptedException e) {e.printStackTrace();}
      
     }
   }
  
}
 
Zuletzt bearbeitet von einem Moderator:

dayaftereh

Top Contributor
Mmh, also das sieht soweit gut aus :)

Jetzt ist die Frage was folgendes macht :
Java:
Berechnen.player();
Berechnen.holes();
Berechnen.game();

Hast du mal dein Programm Debugged ? Ich denke das wenn du ein Breakpoint in Main.GUI() und schaust bei welcher Methode der Debugger nicht zurück kehrt, dann kannst du das Problem einwenig eingrenzen.

Bzw. Du kannst in die Methode Springen und schauen warum der Debugger nicht zurück kommt...

PS: Bitte nutz nächstes Mal für Code Formatierungsfunktion...
 

dayaftereh

Top Contributor
Ok, also das Problem ist, dass dein Spiel nicht weiter Läuft? Also einf hängt ? Was bedeutet das deine while True keine Fortschritte mehr macht.Kannst du einfach mal ein systemout in deine while und schau ob sie konstant läuft?
 

Underpay0299

Mitglied
Ich habs ausprobiert und festgestellt das der KeyListener wenn ich das Game übers menü öffne nicht funzt.:(

Listener:
Java:
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Listener implements ActionListener, KeyListener {
   int key;
   
 
     public void keyPressed(KeyEvent e){
       key = e.getKeyCode();
     
       if(key == KeyEvent.VK_UP ){Variablen.w = true;}
       if(key == KeyEvent.VK_DOWN ){Variablen.s = true;}
       if(key == KeyEvent.VK_LEFT){Variablen.a = true;}
       if(key == KeyEvent.VK_RIGHT){Variablen.d = true;}
     
       if(key == KeyEvent.VK_W ){Variablen.w = true;}
       if(key == KeyEvent.VK_S ){Variablen.s = true;}
       if(key == KeyEvent.VK_A){Variablen.a = true;}
       if(key == KeyEvent.VK_D){Variablen.d = true;}
     
     }
   
     public void keyTyped(KeyEvent e) {}
     public void keyReleased(KeyEvent e) {
       key = e.getKeyCode();
     
       if(key == KeyEvent.VK_UP ){Variablen.w = false;}
       if(key == KeyEvent.VK_DOWN ){Variablen.s = false;}
       if(key == KeyEvent.VK_LEFT){Variablen.a = false;}
       if(key == KeyEvent.VK_RIGHT){Variablen.d = false;}
     
       if(key == KeyEvent.VK_W ){Variablen.w = false;}
       if(key == KeyEvent.VK_S ){Variablen.s = false;}
       if(key == KeyEvent.VK_A){Variablen.a = false;}
       if(key == KeyEvent.VK_D){Variablen.d = false;}
     
   
     }
     
     
 
     public void actionPerformed(ActionEvent e) {}
   
   
   }

Frame:
Java:
package Game;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.image.BufferStrategy;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Frame implements WindowListener{

   JFrame frame = new JFrame("Colblx");
   JLabel Punkte = new JLabel("Punkte: " + Variablen.dots);
 
   private BufferStrategy strat;
 
   public Frame()
   {
     frame.setVisible(true);
     frame.setSize(800, 600);
     frame.setResizable(false);
     frame.setDefaultCloseOperation(frame.HIDE_ON_CLOSE);
     frame.add(Punkte , BorderLayout.NORTH);
     frame.addKeyListener(new Listener());
     frame.addWindowListener(this);
   }
 
   public void makestrat(){
     frame.createBufferStrategy(2);
     strat = frame.getBufferStrategy();
   }
   public void repaint(){
     Graphics g = strat.getDrawGraphics();
     draw(g);
     g.dispose();
     strat.show();
   }
   public void draw(Graphics g){
   
   
   
   
     g.setColor(Variablen.bcolor);
     g.fillRect(0, 0, 800, 600);
     g.setColor(Color.BLUE);
     g.fillRect(Variablen.player_x, Variablen.player_y, 20, 20);
     g.setColor(Color.BLACK);
     g.fillRect(Variablen.hx, Variablen.hy, 20, 20);
     g.setColor(Color.RED);
     g.drawString("Punkte: " + Variablen.dots, 10,40);
   
   }
   public void update(){
 
   }

   @Override
   public void windowActivated(WindowEvent e) {}
   public void windowClosed(WindowEvent e) {   }
   public void windowClosing(WindowEvent e) {
 
     Punkte Punkte = new Punkte();
     Punkte.print();
     try {
       Thread.sleep(500);
       } catch (InterruptedException e1) {}
     System.exit(0);
     }
   public void windowDeactivated(WindowEvent e) {}
   public void windowDeiconified(WindowEvent e) {}
   public void windowIconified(WindowEvent e){}
   public void windowOpened(WindowEvent e) {}
 
 
}
 

dayaftereh

Top Contributor
Hey...

Wie hast du geprüft ob der Key Listener nicht geht ? Mach mal in eine System out vom KeyEvent in keyReleased(). Prüfe mal ob du überhaupt Consolen Ausgaben bekommst..

Denk dran;), du musst in deiner Update Methode prüfen welche Taste gedrückt wurde und dann deine Spieler Position verändern...

Aktuell ist deine Update leer, was bedeutet Variablen.player_* verändert sich nicht :(
 

Underpay0299

Mitglied
Hab jetzt auch noch ne Fehlermeldung:

Code:
at java.security.AccessController.doPrivileged(Native Method)
   at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
   at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
   at java.awt.EventQueue$4.run(Unknown Source)
   at java.awt.EventQueue$4.run(Unknown Source)
 

Underpay0299

Mitglied
Also ich hab das Spiel ohne menü gemacht. Wenn ich es über eclipse öffne klapts. Aber wenn ich das über das Menü öffne klappts nicht

Menü:
Java:
package Game;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class Start extends JFrame{

  public static void main(String[] args){
  new Start();
  }

  //Konstruktor
  public Start(){
  super("Name");
  setDefaultCloseOperation(EXIT_ON_CLOSE);
  add(createMenuPanel());
  pack();
  setLocationRelativeTo(null);
  setVisible(true);
  }

  private JPanel createMenuPanel() {
  JPanel panel = new JPanel(new GridLayout(0, 1));

  JButton start = new JButton("Start");
  start.addActionListener(new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent e) {
  Haupt Haupt = new Haupt();
  Haupt.GUI();
  }
  });

  JButton close = new JButton("Close");
  close.addActionListener(new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent e) {
  System.exit(0);
  }
  });

  panel.add(start);
  panel.add(close);
  return panel;
  }
}

und wenn ich es direkt öffne kommt auch nicht die Fehlermeldung die allerdings vom Punkte abspeichern kam:eek:

Und noch was wenn ich das Spiel übers menü öffne kann ich das Spiel nicht mehr schließen (nur noch über Prozess beenden)
 
Zuletzt bearbeitet:

Underpay0299

Mitglied
Wenn ich in Listener
Java:
 System.out.println("Released");
reinschreibe tut sich nichts wenn ich das spiel übers Menü öffne.
 

dayaftereh

Top Contributor
Ähh, ok... Jetzt kommen wir der Sache näher. Du hast ein Threading Problem ;)

Für die Erklärung muss ich jetzt einwenig ausholen. Aktuell nutzt du Swing als UI. Swing ist so implementiert das es einen Thread (EventDispatcherThread) hat der deine Frame, Panels und alle anderen Componenten aktuell hält und die Events vom Benutzer verarbeitet. Kannst es dir wie eine Schlange(Queue) von Aufgaben vorstellen und wenn du ein Button drückst dann wird eine neue Aufgabe in die Queue eingeteilt. Die Aufgabe, bzw der Click wird dann verarbeitet und der registrierte ActionListener wir vom EventDispatcherThread aufgerufen.

Das heißt in deiner actionPerform startest du Haupt.GUI() was untendrunter eine while true hat und nimals wieder zurück kehrt. Das bedeutet deine EventDispatcherThread bleibt für immer in deiner actionPerform und kann seine Queue nicht weiter abarbeiten.

Die folgenden sind, das deine GUI ein friert und auch noch nicht mal neu gezeichnet werden kann.

Die Lösung ist, dein Spiel in einem neuen Thread zu starten.
 

dayaftereh

Top Contributor
Ok, ich mache ein Beispiel ( hoffe du nutzt Java 8)..

Java:
public void actionPerformed(ActionEvent e) {
  Thread gameThread = new Thread(() -> {
    Haupt Haupt = new Haupt();
    Haupt.GUI();
  });
  gameThread.start();
}

PS: es ist eine Draft Lösung und nicht die schönste... Bitte informiere dich über Threads und ThreadSafe
 

dayaftereh

Top Contributor
Bitte denk dran.. Es ist eine Lösung aber nicht die sauberste und könnte Threading Problem hervorrufen:confused: also informiere dich über Threads;)
 

Neue Themen


Oben